본문 바로가기

컴퓨터학원(복습)(수료)

자바(JAVA)기반 안드로이드 웹&앱 개발 46일차 (웹 요청, Volley, JSON, 모바일 데이터베이스, 헬퍼 클래스, 데이터 조회)

친형 결혼식 도와준 후로 피로가 안풀려서.. 요즘 너무 피로하네요.

예시는 내일 빨간 날에 올리겠습니다 ㅎ-ㅎ..

[웹으로 요청하기, HTTP로 웹서버에 접속하기]

1. 자바에서 HTTP 클라이언트를 만드는 가장 간단한 방법은 URL 객체를 만들고 이 객체의 openConnection() 메서드를 호출하여 HttpURLConnection 객체를 만드는 것입니다.

2. URL 객체에 들어 있는 문자열이 “http://"를 포함하면 HTTP 연결을 위한 객체를 만들게 되므로 openConnection() 메서드가 리턴하는 URLConnection 객체를 HttpURLConnection으로 형변환하여 사용할 수 있습니다.

3. HttpURLConnection 객체로 연결할 경우에는 GET 이나 POST 와 같은 요청 방식과 함께 요청을 위한 파라미터들을 설정할 수 있습니다.

★ public void setRequestMethod(String method)

☞ 요청 방식을 지정하는 메서드로 GET 이나 POST 문자열을 파라미터로 전달합니다.

★ public void setRequestProperty(String field, String new Value)

☞ 요청할 때 헤더에 들어가는 필드 값을 지정할 수 있도록 합니다.

※ HTTP 로 웹서버에 접속하기 예시

☞ 버튼을 누르면 사용자가 입력한 사이트 주소를 이용해 request() 메서드를 호출합니다. 이 메서드 안에는 인터넷을 사용할 것이므로 스레드 안에서 동작하도록 스레드 객체를 생성하고 그 안에서 메서드를 호출하도록 합니다.

☞ setConnectTimeout() 은 연결대기 시간을 설정하는 것입니다.

☞ setDoInput() 은 객체의 입력이 가능하도록 만들어 줍니다.

☞ 스트림에서 한 줄씩 읽어 들이는 메서드인 readLine() 은 BufferedReader 클래스에 정의되어 있으므로 HttpURLConnection 객체의 스트림을 이 클래스의 객체로 만든 후에 처리합니다.

 

[Volley 사용하기]

1. Volley 라이브러리는 웹 요청과 응답을 단순화하기 위해 만들어진 라이브러리입니다. HttpURLConnection 객체를 사용하지 않을 수 있습니다.

2. Volley 를 사용하려면 먼저 요청(Request) 객체를 만들고 이 요청 객체를 요청 큐(RequestQueue) 라는 곳에 넣어주기만 하면 됩니다. 그러면 요청 큐가 알아서 웹 서버에 요청하고 응답까지 받아줍니다.

3. Volley 라이브러리의 가장 큰 장점은 스레드를 신경쓰지 않아도 된다는 점입니다.

※ Volley 사용하기 예시

 

☞ 요청 큐는 한 번만 만들어 계속 사용할 수 있기 때문에 static 키워드로 클래스 변수를 선언한 후 할당했습니다. 요청 큐를 이 액티비티에서만 사용하는 것이 아니라 앱 전체에서 사용하는 것이 일반적입니다. 따라서 실제 앱을 만들때는 Application 클래스 안에 넣어두거나 별도의 클래스를 하나 만들어서 넣어둘 수 있습니다.

☞ 요청 큐를 만들 때는 Volley.newRequestQueue() 메서드를 사용할 수 있습니다.

☞ 요청 객체는 StringRequest 클래스로 만들 수 있습니다. 문자열을 주고 받기 위해 사용하는 요청 객체입니다.

☞ 요청 객체를 new 연산자로 만들 때는 네 개의 파라미터를 전달할 수 있습니다.

..☞ 첫 번째 파라미터로 GET() 또는 POST() 메서드를 전달합니다. (요청방식 지정)

..☞ 두 번째 파라미터로 웹 사이트 주소를 전달합니다.

..☞ 세 번째 파라미터로 응답받을 리스너 객체를 전달합니다. 이 리스너의 onResponse() 메서드는 응답을 받았을 때 자동으로 호출됩니다.

..☞ 네 번째 파라미터로는 에러가 발생했을 때 호출될 리스너 객체를 전달합니다.

☞ 요청 큐의 add() 메서드로 요청 객체를 넣으면 요청 큐가 자동으로 요청과 응답과정을 진행합니다. 요청 객체는 cache 메커니즘을 지원하는데 만약 이전 응답 결과를 사용하지 않겠다면 setShouldCache() 메서드를 사용해서 cache를 사용하지 않도록 설정하면 됩니다.

 

[JSON 데이터 다루기]

1. JSON 의 약자는 JavaScript Object Notation 으로 자바스크립트 객체 포맷을 데이터를 주고받을 때 사용할 수 있도록 문자열로 표현한 것을 말합니다. 따라서 자바스크립트 객체 포맷과 거의 동일합니다.

2. 각각의 속성은 콤마(,)로 구분되며

각각의 속성 자체는 속성 이름과 속성 값이 콜론(;) 기호로 구분되면서 한쌍을 이룹니다. 즉, 콜론 뒤에 값이 들어갈 수 있는데 문자열이나 숫자와 같은 기본자료형이 올 수도 있고 다시 중괄호로 싸인 객체가 올 수도 있습니다.

3. 문자열 값에는 큰 따옴표를 붙이고 숫자에는 붙이지 않습니다.

4. 만약 배열을 사용하고 싶다면 대괄호를 사용하며 그 안에 쉼표로 구분된 배열 원소들이 들어갑니다.

5. Gson은 자바스크립트에서처럼 JSON 문자열을 객체로 변환할 수 있도록 해 줍니다. 즉, JSON 문자열이 자바 객체로 만들어질 수 있습니다. Volley를 사용해서 웹서버로부터 JSON 응답을 받았다면 Gson 을 이용해서 자바 객체로 바꾸고 그 객체 안에 들어있는 데이터를 접근하여 사용할 수 있습니다.

※ JSON 데이터 다루기 예시

 

☞ public class MovieList

응답데이터 가장 바깥이 중괄호이므로 이 객체를 반환할 클래스로 MovieList 라는 이름의 클래스를 정의했습니다. // {”boxOfficeResult" // 이 클래스 안에는 boxOfficeResult 라는 이름의 변수를 추가하는데, 변수의 이름은 JSON 문자열에서 속성의 이름과 같아야 합니다. 그리고 변수의 자료형은 JSON 문자열에서 속성 값의 자료형과 같아야 합니다. JSON 문자열에서 boxOfficeResult 속성의 값이 객체이므로 이 객체를 반환하여 담아둘 클래스를 MovieListResult 라는 이름을 추가합니다.

☞ JSON 문자열의 속성 중에서 값이 배열인 경우, 즉 대괄호로 표시된 경우에는 클래스를 정의할 때 ArrayList 자료형을 사용할 수 있습니다. 그리고 그 배열 안에 다시 객체들이 들어가는 경우 해당 객체들을 위한 클래스를 추가로 만들어야 합니다. ( 객체들을 위한 클래스 = Movie)

☞ Gson 객체에는 fromJson() 메서드가 있어서 문자열을 자바 객체로 바꿀 수 있도록 합니다. 첫번째 파라미터는 문자열이고 두번째 파라미터는 어떤 클래스인지를 지정하기 위한 클래스 객체입니다. 이렇게 변환하면 응답 JSON에 들어 있는 영화 정보의 개수를 바로 확인할 수 있습니다.

 

[영화정보 가져와 보여주기]

※ 영화정보 가져와 보여주기 예시

 

☞ 리싸이클러뷰는 선택 위젯이기 때문에 어댑터가 데이터 관리와 뷰 객체 관리를 담당합니다.

☞ Movie 객체를 어댑터에서 관리하도록 만든 것입니다.

☞ processResponse() 메서드 안에서는 Gson 을 이용해 JSON 문자열을 MovieList 객체로 변환하며 그 안에 들어있는 Movie 객체들을 하나씩 꺼내어 어댑터에 추가합니다. 어댑터에 모두 추가했다면 notifyDataSetChanged() 메서드를 호출해야 변경 사항이 반영됩니다.

 

[모바일 데이터베이스란?]

1. 안드로이드는 임베디드 데이터베이스(Embedded Database)로 개발된 경량급(Light-weight) 관계형 데이터베이스인 SQLite를 가지고 있습니다.

2. SQLite 데이터베이스는 파일로 만들어진 하위 수준의 구조를 가지면서도 데이터베이스의 기능까지 그대로 사용할 수 있도록 만든 것입니다. 그리고 저장될 때는 파일로 저자오디므로 데이터베이스의 복사, 이동, 삭제가 매우 쉽습니다.

3. SQLite의 가장 큰 특징은 데이터 조회 속도가 빠르다는 것과 표준 SQL 을 지원한다는 점입니다.

 

[데이터베이스와 테이블 만들기]

1. 데이터베이스를 만드는 가장 간단한 방법은 Context 클래스에 정의된 openOrCreateDatabase() 메서드를 사용하는 것입니다. 즉, 앱에서 기본적으로 사용하는 Activity 클래스가 Context를 상속한 것이므로 결국 액티비티를 만들 때 그 안에서 openOrCreateDatabase() 메서드로 데이터베이스를 만들거나 열 수 있습니다.

★ public abstract SQLiteDatabase openOrCreateDatabase

(String name, int mode, SQLiteDatabase.CursorFactory factory)

..☞ 첫 번째 파라미터는 ‘데이터베이스의 이름’입니다. 이름을 이용해서 데이터베이스를

......구분하며, 이 이름은 데이터베이스 파일의 이름으로도 사용됩니다.

..☞ 두 번째 파라미터는 ‘사용 모드’입니다. 여기에는 MODE_PRIVATE 상수를 넣어줍니다.

..☞ 세 번째 파라미터는 널(Null)이 아닌 객체를 지정할 경우 쿼리의 결과 값으로 반환되는

......데이터를 참조하는 커서를 만들어 낼 수 있는 객체가 전달됩니다.

..☞ 메서드를 호출했을 때 반환되는 SQLiteDatabase 객체는 name 변수로 지정한

..... 데이터베이스에 접근할 수 있는 메서드를 정의하고 있습니다. 그래서 이 메서드로

..... 데이터베이스를 열거나 만든 후에는 SQLiteDatabase 객체를 참조해야 합니다.

★ public abstract boolean deleteDatabase (String name)

2. SQLiteDatabase 객체에서 가장 중요한 메서드 중의 하나는 execSQL() 입니다. 이 메서드는 데이터베이스를 만들고 난 다음 SQL문을 실행할 때 사용됩니다. 따라서 이 메서드를 이용하면 테이블을 만드는 것뿐만 아니라 레코드 추가처럼 표준 SQL을 사용하는 여러 가지 데이터 처리가 가능합니다.

※ 데이터베이스와 테이블 만들기 예시

 

[헬퍼 클래스로 업그레이드 지원하기]

1. 테이블의 정의가 바뀌어서 스키마를 업그레이드 할 필요가 있을 때에는 API에서 제공하는 헬퍼(Helper) 클래스를 사용하는 것도 좋은 방법입니다.

2. 스키마를 수정할 때는 테이블이 처음 만들어지는 것인지 아니면 사용자가 이미 사용하고 있는 상태인지를 구별한 다음 처리해야 합니다.

3. 헬퍼 클래스를 사용하려면 SQLiteOpenHelper 클래스를 사용해야 합니다. 이 클래스는 데이터베이스를 만들거나 열기 위해 필요한 작업들을 도와주는 역할을 합니다.

★ public SQLiteOpenHelper

(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

..☞ 첫 번째 파라미터는 Context 객체이므로 액티비티 안에서 만들 경우에는 this로

......지정할 수 있습니다.

..☞ 두 번째 파라미터는 데이터베이스의 이름입니다.

..☞ 세 번째 파라미터는 데이터 조회 시에 반환하는 커서를 만들어 낼 CursorFactory 객체입니다.

..☞ 네 번째 파라미터로 전달되는 정수 타입의 버전 정보는 데이터베이스 업그레이드를 위해 사용합니다.

4. SQliteOpenHelper 객체를 만들어도 파일을 만들려면 getReadableDatabase() 또는 getWritableDatabase() 메서드를 호출해야 합니다. 이 클래스를 이용할 때의 장점은 데이터베이스가 만들거나 업그레이드 할 때 콜백 메서드가 호출된다는 점입니다. 따라서 데이터베이스 생성, 업그레이드 등 여러 가지 상태에 따라 콜백 메서드를 다시 정의하면 각각의 상태에 맞게 처리할 수 있습니다.

★ public abstract void onCreate(SQLiteDatabase db)

★ public abstract void onOpen(SQLiteDatabase db)

★ public abstract void onUpgrade(SQLiteDatabase db)

..☞ 현재의 데이터베이스 버전이 이미 사용하고 있는 SQLiteDatabase 파일의 버전과 다를

....경우에 자동으로 호출되는 onUpgrade() 메서드에는 SQLiteDatabase 객체와 함께

....기존 버전 정보를 담고 있는 oldVersion, 현재 버전 정보를 담고 있는 newVersion

....파라미터가 전달됩니다.