Don't wanna be here? Send us removal request.
Text
and_181120
ㅇListView 의 이해
ListVeiw의 요소는 Item 이라 불림
레이아웃에 xml layout

Login.java 유효성 체크

패턴 6종류를 한 추상팩토리 패턴으로 코딩


스칼라 언어 참고
0 notes
Text
And_181120
SQLite DB연결
깃허브 - 리눅스 git....(git 관련 명령어)
adb를 사용한다.
C:\Users\kgitbank
alt 도구 폴더옵션 폴더옵션 숨긴파일 표시로
AppData를 보이게 한다
C:\Users\kgitbank\AppData\Local\Android\Sdk\platform-tools
안에 adb.exe파일이 있다
sqlite3.exe파일이 있다 .
win break

고급 설정 -> 환경 변수 설정

시스템 변수 설정 path
변수값에

시스템 변수 추가
이름 ADB_HOME
변수 값 C:\Users\kgitbank\AppData\Local\Android\Sdk\platform-tools

다시 cmd창에 adb를 치면 등록 됐음을 알 수 있다
---------------------------------------------------------------------------------------------
adb devices
adb -e shell
ls

cd data
ls

cd data
ls


만든 이름으로 들어감
간단한 코드
adb -e shell
cd /data/data/com.example.kgitbank.kakao

cd databases
sqlite3 kakao.db
select * from member;
중간 오류 해결
near "$s": syntax error (code 1) java code상 문제 -스프링 때 쓰던 습관으로 % 대신에 $를 사용함

다시 cmd에서 db내용을 sql 문으로 확인 할수 있다
Main.java의
코드
package com.example.kgitbank.kakao; import android.content.Context; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import java.util.List; public class Main extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Context ctx = Main.this; findViewById(R.id.moveLogin).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SqliteHelper helper = new SqliteHelper(ctx); //helper라는 객체를 만드는 것은 //곧 SQLite DB를 만드는 것이다. startActivity(new Intent(ctx,Login.class)); } }); } static interface ExcuteService{//재활용이 유용하기에 static으로 선언 public void perform(); } static interface ListService{ public List<?> perform(); } static interface OjectService{ public Object perform(); } static abstract class QueryFactory{ Context ctx; public QueryFactory(Context ctx) { this.ctx = ctx; } public abstract SQLiteDatabase getDatabase(); } static class SqliteHelper extends SQLiteOpenHelper{ public SqliteHelper(Context context) { super(context, DBInfo.DBNAME, null, 1); this.getWritableDatabase(); } @Override public void onCreate(SQLiteDatabase db) {//객체가 만들어지면 작동 String sql = String.format( " CREATE TABLE IF NOT EXISTS %s " + " ( %s INTEGER PRIMARY KEY AUTOINCREMENT," + " %s TEXT," + " %s TEXT," + " %s TEXT," + " %s TEXT," + " %s TEXT," + " %s TEXT " + " ) ", DBInfo.MBR_TABLE, DBInfo.MBR_SEQ, DBInfo.MBR_NAME, DBInfo.MBR_EMAIL, DBInfo.MBR_PASS, DBInfo.MBR_ADDR, DBInfo.MBR_PHONE, DBInfo.MBR_PHOTO ); Log.d("실행할 쿼리 ::",sql); db.execSQL(sql); Log.d("==================","쿼리 실행"); String[] names = {"강동원","윤아","암수정","박보검","송중기"}; String [] email ={"[email protected]","[email protected]","[email protected]","[email protected]","[email protected]" }; String [] addr ={"강동구","강서구","중구","서대문구","종로구"}; for(int i =0 ; i<names.length;i++){ Log.d("입력할 이름 ::",names[i]); db.execSQL(String.format( " INSERT INTO %s " + " ( %s," + " %s," + " %s," + " %s," + " %s," + " %s " + ")VALUES( " + " '%s'," + " '%s'," + " '%s'," + " '%s'," + " '%s'," + " '%s' " + ")", DBInfo.MBR_TABLE, DBInfo.MBR_NAME, DBInfo.MBR_EMAIL, DBInfo.MBR_PASS, DBInfo.MBR_ADDR, DBInfo.MBR_PHONE, DBInfo.MBR_PHOTO, names[i],email[i],'1',addr[i],"010-1234-567"+i,"PHOTO_"+i )); } Log.d("**********************************","친구등록완료"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS "+DBInfo.MBR_TABLE); onCreate(db); } } }
0 notes
Text
상속(extends), 추상 클래스(abstract), 인터페이스(implement)
상속(extends), 추상 클래스(abstract), 인터페이스(implement)
객체지향을 조금이라도 공부한 사람들은 상속, 추상 클래스, 인터페이스에 대해 계속적으로 들어봤을 것이다. 이 개념들이 객체 지향 프로그래밍을 하는데 중요한 개념이기 때문이다.
이것들은 어플리케이션을 설계하는데 공통된 부분을 묶어 정의해주고, 구조화 해주며, 객체로 활용할 수 있도록 도와준다.
이것들에 대한 개념 및 예제들은 많이 찾아볼 수 있으므로, 여기서는 간단히 정리하겠다.
1. 상속 (extends)
상속은 기존의 클래스로 부터 새로운 클래스를 유도하는 과정이다.
쉽게 말해서 부모 클래스를 extends로 상속받아 자식 클래스에서 내 것처럼 사용할 수 있는 것이다.
시스템을 설계하다보면, 공통된 부분으로 인하여 중복되는 것들이 계속적으로 나올 수 있다. 이럴때 상속을 이용하여, 비슷한 객체끼리 하나의 묶음으로 묶어주고, 공통된 부분을 ���아서 상위 개념의 부모 클래스를 생성한다. 그리고 이 객체들이 부모 객체를 상속하면 중복이 제거되며, 공통된 방식으로 설계할 수 있다.
또한 오버로딩과 오버라이딩을 사용하여 자식 클래스에서 자유자재로 필요한 클래스를 구현할 수 있다.
상속을 사용하여 소프트웨어 재사용을 쉽게 할 수 있는 것이다.
- protected : 객체를 캡슐화하기 위해서 변수들의 modifier를 private로 설정하면, 이 객체를 상속받은 자식 클래스에서는 접근을 할 수가 없다. 외부에서의 변수에 접근은 막고 싶고, 자식 클래스에는 접근을 허용하고 싶을 때는 protected modifier를 사용하자. protected modifier는 외부에는 접근이 제한되고, 같은 패키지와 하위 클래스에만 접근을 허용한다.
- super 참조 : 예약어 super 는 그 부모 클래스를 참조하는데 사용한다. 생성자인 super() 를 호출하면, 부모 클래스의 생성자를 호출하게 된다. 상위 클래스의 생성자를 호출하는 super() 는 반드시 해당 클래스의 생성자 첫 번째 라인에 위치해야 한다. 이것은 상위 클래스의 생성자가 항상 하위 클래스의 생성자보다 먼저 수행되어야 하기 때문이다.
- 단일 상속 : 자바에서는 다중 상속을 지원하지 않는다. 따라서 extends 를 통해 하나의 부모만을 가질 수 있는 단일 상속만 사용할 수 있다.
- 오버라이딩(Overriding) : 상위 클래스의 메소드를 하위 클래스가 재정의해서 사용하는 기술이다. 하위 클래스에서 상위 클래스의 메소드 이름, 매겨변수 유형을 동일하게 정의하면 하위 클래스에서 해당 메소드를 재정의하게 된다.
- 상속의 제약 : 상수 final 을 선언하면, 다른 클래스에서 해당 클래스를 상속할 수 없다. final을 메소드에서 사용할 경우 하위 클래스에서 오버라이딩이 불가능하다. final 은 최종 클래스에서 사용 가능하며, 더이상 확장할 수 없다.
2. 추상 클래스 (abstract)
abstract는 추상 클래스를 선언할 때 사용하는 modifier이다.
클래스 선언부에 abstract를 사용하면 추상 클래스를 선언하고 있다는 의미이며, 메소드를 선언할 때 사용하면 추상 메소드를 만들고 있다는 의미이다.
추상 클래스는 추상적인 내용만 정의하고 있는 클래스로 구체적인 내용은 하위 클래스에서 구현되도록 해놓은 클래스이다. 추상 클래스가 반드시 추상 메소드를 가지고 있어야 된다는 제약이 있는 것은 아니지만 일반적으로 하나 이상의 추상 메소드를 가지고 있다.
추상 클래스를 상속하면(extends) 하위 클래스에서는 추상 클래스에 선언되어 있는 추상 메소드를 구현해야 한다. 어떤 면에서 추상 클래스는 인터페이스와 유사하다. 그러나 인터페이스와는 다르게, 추상 클래스는 추상 메소드가 아닌 메소드를 포함할 수도 있고 상수 이외의 데이터 선언도 포함할 수 있다.
추상 클래스의 자식 클래스는 부모로부터 상속받은 모든 추상 메소드들을 정의해야 한다. 그렇지 않으면 자식 역시 추상 클래스가 된다.
추상 메소드를 final 이나 static 으로 정의하는 것은 모순이라는 점을 주의해라. final 메소드는 자식 클래스에서 재정의 될 수 없다. static 메소드는 클래스 객체 선언 없이 클래스 이름으로 호출하는 이 방법은 그 메소드에 대한 구현이 이미 있어야만 가능하다. 추상 메소드는 구현이 없으므로 static 메소드는 말이 안된다.
어떤 클래스와 메소드를 추상으로 할 것인가는 설계 과정에 있어서 매우 중요한 부분이다.
3. 인터페이스(implements)
상속의 개념은 클래스뿐만 아니��, 인터페이스에도 적용될 수 있따. 즉 하나의 인터페이스는 다른 인터페이스로부터 파생될 수 있다는 것이다. 이러한 관계는 클래스 계층구조와 비슷하게 인터페이스 계층구조를 형성한다.
인터페이스는 다중상속을 지원하지 않는 자바에서 다중상속과 유사한 기능을 구현할 수 있게 한다.
인터페이스는 멤버변수와 메소드로 구성되는데 멤버변수는 모두 상수형으로 선언되고 메소드는 모두 추상 메소드로 선언된다.
인터페이스를 구현하고자 하는 클래스는 선언할 때 implements를 이용해서 인터페이스를 지정하고, 지정된 인터페이스가 가지고 있는 추상 메소드를 오버라이딩해야 한다.
클래스는 인터페이스 유형으로 변환될 수 있는데, 클래스가 구현하고 있는 인터페이스 유형으로만 변환할 수 있다.
클래스가 상속 관계에 따라 계층 구조를 가지듯이, 인터페이스도 인터페이스 사이의 상속 관계에 따라 계층 구조를 가질 수 있는데, 인터페이스의 경우는 클래스와는 다르게 여러 개의 인터페이스로부터 상속 받을 수 있다.
* 상속을 설계할 때 고려할 사항
(1) 모든 상속은 is-a 관계이어야 한다. 자식은 부모보다 더 구체적인 버전이어야 한다.
(2) 재사용과 미래의 재사용이 가능하도록 클래스 계층구조를 설계한다.
(3) 고려중인 도메인에서 클래스와 객체가 판별됨에 따라 그들의 공통점을 찾는다. 공통적인 기능들을 클래스 계층구조에서 일관성과 유지 용이성이 적절한 만큼 가능한 높이 위치시킨다.
(4) 메소드를 자식의 기능에 맞도록 적절하게 오버라이딩한다.
(5) 필요한 만큼 자식 클래스에 새로운 변수를 추가한다. 그러나 상속된 변수를 재정의 하지 않는다.
(6) 각 클래스가 자신의 데이터를 관리하도록 한다. 따라서 필요하다면 부모의 구성자를 호출하거나 오버라이딩 된 메소드를 호출하는 데 super를 사용한다.
(7) 여러 역할을 하는 클래스를 생성하는데(다중 상속이 필요할 때) 인터페이스들을 사용한다.
(8) 미래에도 유용할 수 있도록 응용의 요구에 부합하는 클래스 계층구조를 설계한다.
(9) 현재 사용하지 않더라도 toString 이나 equals 같은 일반적인 메소드들은 상속된 버전이 나중에 의도하지 않은 문제를 야기하지 않도록 자식 클래스에서 적절하게 재정의한다.
(10) 계층구조에서 하위에 있는 구체적 클래스들을 위하여 공통적인 클래스 인터페이스를 명시하는 데 추상 클래스를 사용한다
(11) 캡슐화를 위반하지 않고 파생 클래스에서 필요한 접근을 하도록 final 상수를 주의 깊게 사용한다
출처:
http://hyeonstorage.tistory.com/180
[개발이 하고 싶어요]
0 notes
Text
and_181119
스마트폰에는 SQLite가 내장 되어 있다
SQLite + java + XML 조합 = Native 앱
하이브리드는 서버랑 코틀린으로 대체된다

카카오에서 new에서 Main 이름으로 activity empty로 화면 생성
drawable 폴더에 XML -> layout 에서 (일부 화면 코드)
2개 추가

Manifest 에서 Main 먼저 실행하기위해 다음과 같이 변경한다


완성화면

화면 이동을 위해
Intent를 조절해서 이동한다
R에 오류나면 -> clean project 그래도 안되면 rebuild 프로젝트
메인
->로그인
->멤버리스트 -> 삭제
->멤버디테일 (리스트에서 한명 클릭)
->멤버 업데이트

위 이름을 activity 로생성하고
버튼만 생성해서 각 화면으로 이동하게 만든다

멤버를 담는 자바빈즈를 만듬
shift + Ins 는 getter setter 같은 메소드를 추가시킬수있다
jaㅍa
Advance
WEB Spring framework
APP Android + Hybrid(코로도바)
디자인패턴 23가지
추상 팩토리 패턴

팩토리 코드를 생성하는 패턴
null 주는건 customize의 의미



sql문으로 테이블을 만들고 더미값을 집어넣음
0 notes
Text
Android_libgdx_FlappyRoco
ㅇsetting
-sdk 폴더 지정 잘하기 ->

file->projectscrucpter 들어가면 볼수 있다 없다면 설치할것
실행은 안드로이드로 하지 않고 데스크탑으로 한다
editConfiguration 칸 클릭해서 추가 하고

이런식으로 설정

추상클래스를 만듬 위치는 이런식


FlappyRoco에서 static final 로 가로 세로와 제목을 설정함

desktopluncher에서 지정한 값을 설정해줌

실행된 화면 윈도우창 위에 타이틀과 가로세로 값이 적용되었다
0 notes
Text
Android_Layout종류
<!-- 리니어 레이아웃으로 구성--> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" android:orientation="horizontal" xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon" /> <!–date textViw 를 화면 오른쪽으로 밀기위해서 LinearLayout에 weight 속성 부여 weight 가 1이므로 자리를 전부 차지하게 되고 TextView는 밀리게 된다.–> <LinearLayout android:layout_weight="1" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="홍길동" android:textSize="20dp" android:textStyle="bold" android:layout_marginTop="16dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="안녕하세요 잘지내시는 지요?" android:layout_marginTop="16dp" android:layout_marginLeft="16dp"/> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="17.1.26" android:layout_marginLeft="16dp" /> </LinearLayout>
흐르는 듯이 한 줄로 나열하고 weight속성으로 비율 결정가능
<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon" /> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="홍길동" android:textSize="20dp" android:textStyle="bold" android:layout_toRightOf="@id/icon" /> <TextView android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="안녕하세요. 잘 지내시는 지요?" android:layout_below="@id/name" android:layout_alignLeft="@id/name" /> <TextView android:id="@+id/date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="17.1.26" android:layout_alignBaseline="@id/name" android:layout_alignParentRight="true" /> </RelativeLayout>
id를 참조해서 상대적으로 위치 결정 가능
속성
android:layout_above : 기준 뷰의 윗부분에 배치
android:layout_below : 기준 뷰의 아랫부분에 배치
android:layout_toLeftOf : 기준 뷰의 왼쪽에 배치
android:layout_toRightIOf: 기준 뷰의 오른쪽에 배치
align속성
android:layout_alignTop: 기준 뷰와 윗부분을 정렬
android:layout_alignBottom: 기준 뷰와 아랫부분을 정렬
android:layout_alignLeft: 기준 뷰와 왼쪽을 정렬
android:layout_alignRight: 기준 뷰와 오른쪽을 정렬
android:layout_alignBaseline: 기준 뷰와 텍스트 기준선을 정렬
RelativeLayout 영역의 상하좌우로 밀수 있는 속성alignParentXXX
android:layout_alignParentTop :부모의 윗부분에 뷰 상단을 위치
android:layout_alignParentBottom :부모의 윗부분에 뷰 하단에 위치
android:layout_alignParentLeft :부모의 윗부분에 뷰 왼쪽을 위치
android:layout_alignParentRigth :부모의 윗부분에 뷰 오른쪽을 위치
탭화면 구성

레이아웃

코드

완성화면
0 notes
Text
gitbash로 원격저장소 ssh키로 저장
git init
-현재 디렉터리에서 작업을 진행하겠다는 의미(현재 디렉터리를 버전관리로 지정하는 행위
ls -al
목록 확인
확인하면 .git이라는 디렉터리가 생겨있음
지역저장소에서 ssh로 하는 방법
sh-keygen -t rsa -C "메일@naver.com"
비밀번호입력
입력확인 (git hub와 동일하게 함)
$ ssh-keygen -t rsa -C "메일@naver.com" Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/kgitbank/.ssh/id_rsa): Created directory '/c/Users/kgitbank/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /c/Users/kgitbank/.ssh/id_rsa. Your public key has been saved in /c/Users/kgitbank/.ssh/id_rsa.pub. The key fingerprint is: SHA256:KC2XvwpkS/ZxWHt/KplvwWuvu2ESTuSkB3iPkpsIRYQ [email protected] The key's randomart image is: +---[RSA 2048]----+ | oo | | E. . | | . . + o | | . . B X | | . B X S B. | | * B B = oo | | + + . oo+o. | | . .+o++ | | ... =*=. | +----[SHA256]-----+
이런게나옴
ssh 생성된 디렉터리로 이동
cd C:\Users\kgitbank\.ssh (역슬래시 슬래시로 변환)
ssh -add ./id_rsa(하면 권한이 안된다고 나오면)

이방법으로 해결
ssh-add ~/.ssh/id_rsa.pub
에서 ssh 값을 긁어서 github에 ssh추가로 만든다
저장할 레포지터리도 만듬
그런다음
저장할 디렉터리로 이동 후 gitbash here git init git add -A git commit -m "first commit" git remote add origin [email protected]:tmxhsk99/android_calc.git git push -u origin master
bold 처리된 부분은 그 레포지터리의 ssh키를 주소를 넣는다
저러면 완료됨
이후 push 하는 방법
git add -A
git commit -m “커밋 내용”
git push origin master
오류발생시
잘못하다 꼬이면 저장 폴더의 .git 폴더 (git의 커밋 내용 및 git 설정파일 )을 지운뒤에 다시 처음부터 시작할것
0 notes
Text
@RestController에서 파라미터
RestController 는 기존의 @Controller에서 사용하던 일반적인 타입이나 사용자가 정의 한 타입(클래스)를 사용합니다. 여기에 추가로 몇가지 어노테이션을 이용하는 경우가 있다.
@PathVariable: 일반 컨트롤로에서도 사용이 가능하지만 REST 방식에서 자주 사용됩니다. URL 경로의 일부를 파라미터로 사용할때 이용
@RequestBody : JSON 데이터를 원하는 타입의 객체로 변환 해야 하는 경우 주로 사용
1. @PathVariable
REST 방식에서 URL 내에 최대한 많은 정보를 담으려고 노력합니다. 예전에는 ?뒤에 추가되는 쿼리 스트링이라는 형태로 파라미터를 이용해서 전달되던 데이터들이 REST방식에서는 경로의 일부로 차용되는 경우가 많습니다.
스프링 MVC에서는 @PathVariable 어노테이션을 이용해서 URL���에 경로의 일부를 파라미터로 사용할수 있다.
http://localhost:8080/sample/{sno}
http://localhost:8080/sample/{sno}/page/{pno}
위의 URL에서 {}로 처리된 부분은 컨트롤러의 메서드에서 변수로 처리가 가능합니다 . @PathVariable은 {}이름을 처리할때 사용합니다.
REST방식에서는 URL 자체 데이터를 식별할수 있는 정보들을 표현하는 경우가 많으므로 다양한 방식으로 @ PathVariable이 사용됩니다 .

@PathVariable을 적용 하고 싶은 경우 ‘{}’를 이용해서 변수명을 지정하고 @PathVariable 을 이용해서 지정된 이름의 변숫값을 얻을 수 있다.값을 얻을때는 int double 같은 기본 자료형은 사용할수 없다.
브라우저에서 ‘/sample/product/begs/1234’로 호출하면cat과 pid 변수값으로 처리가 되는 것을 확인할 수있다.

0 notes
Text
RESTController의 반환 타입
@RestController는 JSP와 달리 순수한 데이터를 반환하는 형태이므로 다양한 포멧의 데이터를 전송핤 있습니다. 주로 많이 사용하는 형태는 일반 문자열이나 JSON,XML 등을 사용합니다.
1.단순 문자열 반환

기존의 @Controller 는 문자열을 반환하는 경우에는 JSP 파일의 이름으로 처리하지만,
@RESTController의 경우에는 순수한 데이터가 된다.
@GetMapping에 사용된 produces 속성은 해당 메서드가 생산하는 MIME타입을 의미합니다. 예제와 같이 문자열로 직접 지정할 수도 있고 , 메서드 내의 MediaType이라는 클래스를 이용할수 도 있다.

server-> module 에서 주소 경로를 ‘/’경로로 실행되도록 하고 브라우저를 통해서 ‘/sample/getText’를 호출 하면 다음과 같인 나온다
2.객체의 반환
객체를 반환하는 작업은 JSON이나XML을 이용한다. 전달된 객체를 생산하기 위해서는 org.zerock.domain 패키지를 생성하고, SampleVO 클래스를 작성한다.

SampleVO 클래스는 비어있는 생성자를 만들기위한 @NoArgsContructor와 모든 속성을 사용하는 생성자를 위한 @AllArgsConstructor 어노테이션을 이용했습니다. 어노테이션을 통해서 생성된 결과를 보면 생성자가 여러개 생성되는 것을 볼 수있습니다.

SampleController에서는 SampleVO를 리턴하는 메서드를 아래와 같이 설계합니다.

getSample()은 XML과 JSON 방식의 데이터를 생성 할 수 있도록 작성되었는데, 브라우저에서 ‘/sample/getSample’을 호출하면 다음과 같은 화면을 볼 수 있습니다.

위의 결과는 브라우저가 받은 데이터가 XML이기 때문에 보이는 화면입니다. 개발자 도구를 통해서보면 정상적 XML데이터라는 것을 확인 가능하다
동일한 메서드를 ‘/sample/getSample.json’을 호출하게 되면 기존과달리 JSON타입의 데이터가 전달되는 것을 확인 할 수있다.

@GetMapping이나 @RequestMapping의 produces 속성은 반드시 지정해야 하는 것은 아니므로 생략하는 것도 가능하다.

3.컬렉션 타입의 객체 반환
경우에 따라서는 여러 데이터를 한번에 전송하기 위해서 배열이나 리스트 맵타입의 객체로들을 전송하는 경우도 발생합니다.

getList()는 내부적으로 1부터 10미만까지의 루프를 처리하면서 SampleVO 객체를 만들어서 List<SampleVO>로 만들어 낸다.
브라우저를 통해서 ‘/sample/getList’를 호출하면서 기본적으로 XML데이터를 전송하는 것을 볼수 있습니다. 뒤에 확장자를 ‘.json’으로 처리하면 ‘[ ]’로 싸여진 JSON형태의 배열 데이터를 볼 수 있습니다.


맵의 경우에는 키 와 값을 가지는 하나의 객체로 간주 됩니다.



Map을 이용하는 경우에는 키에 속하는 데이터는XML로 변환되는 경우에 태그의 이름이 되기 때문에 문자열을 지정합니다.
4.ResponseEntity 타입
REST 방식으로 호출하는 경우는 화면 자체가 아니라 데이터 자체를 전송하는 방식으로 처리되기 때문에 데이터를 요청한 쪽에서는 정상적인 데이터인지 비정상적인 데이터인지를 구분 할수있븐 확실한 방법을 제공해야만 합니다.
ResponseEntity는 데이터와 함깨 HTTP 헤더의 상태 메시지등을 같이 전달하는 용도로 사용합니다. HTTP의 상태코드와 에러 메세지 등을 함께 데이터를 전달할 수 있기 때문에 받는 입장에서는 확실하게 결과를 알 수 있습니다.

check()는 반드시 ‘height’와 ‘weight’를 파라미터로 전달 받습니다. 이때 만일 ‘height’값이 150보다 작다면 502(bad gateway) 상태 코드와 데이터를 전송하고 , 그렇지 않다면 200(ok)코드와 데이터를 전송합니다.
‘/sample/check.json?height=140&weight=60‘과 같이 JSON 타입의 데이터를 요구하고 height 값을 150보다 작게 하는 경우에는 502메시지와 데이터가 전달됩니다.



0 notes
Text
REST예제 기본 세팅

자바 1.8 스프링 5.0.7

메이븐 컴파일 버전 수정
json 데이터 처리를 위한 jackson-databind 라이브러리 추가

▲프로젝트 내의 pom.xml에 ~객체를 JSON/XML로 변환할때 사용

테스트할때는 직접 java의 인스턴스를 json 타입 문자열로 변환해야하는 일들도 있으므로 gson 라이브러리도 추가

자바 서블릿 버전과 롬복설정추가

junit버전 변경 spring-test 관련 모듈 추가
0 notes
Text
@RestController
REST 방식에서 가장먼저 기억해야하는 점은 서버에 전송하는 것이 순수한 데이터라는 점입니다. 기존의 Controller에서 Model에 데이터를 담아서 JSP 등과 같은 뷰(View)로 전달하는 방식이 아니므로 기존의 Controller와 다르게 동작합니다
스프링 4에서 부터는 @Controller 외에 @RestController라는 어노테이션을 추가해서 해당 Controller 의 모든 메서드의 리턴타입을 기존과 다르게 처리한다는 것을 명시합니다. @RestController 이전에는 @Controller와 메서드 선언부에 @RequestBody를 이용해서 동일한 결과를 만들 수 있습니다.
@RestController는 메서드의 리턴타입으로 사용자가 정의한 클래스 타입을 사용할수 있고 , 이를 JSON이나 XML로 자동으로 처리할 수 있습니다.
0 notes
Text
REST 방식과 Ajax를 이용하는 방식
REST 는 ‘Respresentational State Transfer’의 약어로 하나의 URI는 하나의 고유한 리소스(Resource)를 대표하도록 설계된다는 개념에 전송방식을 결합해서 원하는 작업을 지정합니다.
예를 들어 ‘/boards/123’은 게시물 중 123번이라는 고유한 의미를 가지게 설계하도록하고 , 이에 대한 처리는 get , post 방식과 같이 추가적인 정보를 통해서 결정하도록합니다. 따라서 REST 방식은 다음과 같이 구성된다고 생각할 수 있습니다.
스프링은 @RequestMapping이나 @ResponseBody 와 같이 REST 방식의 데이터 처리를 위한 여러 종류의 어노테이션과 기능이 있습니다. REST와 관련해서 알아두어야 하는 어노테이션들은 다음과 같습니다 .
0 notes
Text
15.4 화면에서 검색 처리 조건
화면에서 검색은 다음과 같은 사항을 주의 해야한다
페이지 번호가 파라미터로 유지되었던것 처럼 검색 조건과 키워드 역시 항상 화면 이동시 같이 전송이 되어야합니다.
화면에서 검색버튼을 클릭하면 새로 검색한다는 의미이므로 1페이지로 이동합니다.
한글의 경우 GET방식으로이동하는 경우 이동의 문제가 생기므로 주의해야합니다.
0 notes
Text
BoardMapper.xml에서Criteria처리

검색 조건이 3가지 이므로 총 6가지 조합이 가능하지만 , 각 문자열을 이용해서 검색 조건을 결합하는 형태로 하면 3개의 동적 SQL 구문만으로 처리를 할수 있다
<foreach>문을 이용해서 검색 조건들을 처리 하는데 typeArr이라는 속성을 이용한다
MyBatis는 원하는 속성을 찾을 때 getTypeArr() 과 같이 이름에 기반을 두어서 검색하기 때문에 Criteria에서 만들어둔 getTypeArr()의 결과인 문자열의 배열이 foreach의 대상이된다 (MyBatis는 엄격하게 javaBeans의 규칙을 따르지 않고 get/set 메서드만을 활용하는방식 입니다.)
<choose>안쪽의 동적 SQL은 ‘OR title ... OR content... OR Writer...’와 같은 구문을 만들어 내게 됩니다. 따라서 바깥쪽에서는 <trim>을 이용해서 맨앞에 생성되는 OR을 없애 줍니다
위 동적 SQL은 상황에 따라서 다음과 같은 SQL을 생성합니다.

동적 SQL을 이용해서 검색 조건을 처리하는 부분은 해당 데이터의 개수를 처리하는 부분에서도 동일하게 적용하여야 합니다.
<sql>이라는 태그를 이용해서 SQL 의 일부를 별도로 보관하고 필요한 경우 include시키는 형태로 사용할수 있습니다.
0 notes