출처https://www.edwith.org/boostcourse-android/lecture/17092/



1. Open API

영화진흥위원회에서 제공하는 Open API를 사용해 영화 정보를 요청하고 응답을 받아볼 수 있도록 한다.

영화진흥위원회 오픈API: http://www.kobis.or.kr/kobisopenapi/homepg/main/main.do


응답 데이터는 문자열 형식으로 받게 되고, JSON 포맷으로 되어 있다.



2. JSON (JavaScript Object Notation)

JSON은 Key-Value 쌍으로 이루어진 데이터 교환 포맷이다.

자바스크립트 객체 포맷의 데이터를 주고받을 때 사용할 수 있도록 만든 것이기 때문에, 자바스크립트 객체 포맷과 거의 동일하다.

JSON을 사용하면 서버에서 응답을 받을 때 자바스크립트 객체로 바꿔서 바로 사용할 수 있다.


자바스크립트 객체는 중괄호({, })를 이용해 만들 수 있고, 그 안에는 여러 개의 속성이 들어간다.

속성은 속성 이름과 속성 값이 콜론(:)으로 구분된다.

대괄호([, ])를 사용해 여러 개의 객체가 들어있는 배열을 넣어둘 수 있다.



3. Gson

Gson은 JSON 문자열을 java 객체로 변환해 주는 라이브러리이다.

Gson을 사용하면 한 줄의 코드로 JSON 문자열을 자바 객체로 바꾸어줄 수 있다.

Volley를 이용해 웹 서버로부터 JSON 응답을 받았다면, Gson을 이용해 자바 객체로 바꾸고 그 객체안의 데이터를 사용할 수 있다.




4. 구현 결과 화면


  



5. build.gradle (app)

Gson은 외부라이브러리이어서 dependencies에 추가한다.

1
implementation 'com.google.code.gson:gson:2.8.2'
cs



6. AndroidManifest.xml

인터넷 권한을 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tistory.qlyh8.practice">
 
    <uses-permission android:name="android.permission.INTERNET"/>
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.tistory.qlyh8.practice.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>
cs



7. activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.tistory.qlyh8.practice.MainActivity">
 
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="요청하기"/>
 
    <ScrollView
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_blue_light"
        android:padding="10dp">
        <TextView
            android:id="@+id/text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"/>
    </ScrollView>
 
</LinearLayout>
 
cs



8. MovieList.java

JSON 문자열을 자바 객체로 변환하기 위해서는 먼저 자바 클래스를 정의해야 한다.


1
2
3
4
5
6
package com.tistory.qlyh8.practice;
 
public class MovieList {
    MovieListResult boxOfficeResult;
}
 
cs



9. MovieListResult.java

1
2
3
4
5
6
7
8
9
10
package com.tistory.qlyh8.practice;
 
import java.util.ArrayList;
 
public class MovieListResult {
    String boxofficeType;
    String showRange;
    ArrayList<DailyBoxOffice> dailyBoxOfficeList = new ArrayList<>();
}
 
cs



10. DailyBoxOffice.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.tistory.qlyh8.practice;
 
public class DailyBoxOffice {
    String rnum;
    String rank;
    String rankInten;
    String rankOldAndNew;
    String movieCd;
    String moviceNm;
    String openDt;
    String salesAmt;
    String salesShare;
    String salesInten;
    String salesChange;
    String salesAcc;
    String audiCnt;
    String audiInten;
    String audiChange;
    String audiAcc;
    String scrnCnt;
    String showCnt;
}
 
cs



11. MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package com.tistory.qlyh8.practice;
 
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
 
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
 
import java.util.HashMap;
import java.util.Map;
 
public class MainActivity extends AppCompatActivity {
    TextView textView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        textView = findViewById(R.id.text_view);
 
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 버튼을 클릭했을 때 request 객체를 만들고 request queue 에 넣는다.
                sendRequest();
            }
        });
 
        // request queue 는 앱이 시작되었을 때 한 번 초기화되기만 하면 계속 사용이 가능
        if (AppHelper.requestqueue == null)
            AppHelper.requestqueue = Volley.newRequestQueue(getApplicationContext());
    }
 
    public void sendRequest(){
        String url = "http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=430156241533f1d058c603178cc3ca0e&targetDt=20120101";
 
        // 문자열을 주고 받기 위한 request 객체는 StringRequest 클래스를 이용해 만들 수 있다.
        // 요청방식, URL, 리스너, 에러 리스너를 전달한다.
        // 요청방식: GET, POST 메서드
        // URL: 웹서버의 URL 정보
        // 리스너: 응답을 성공적으로 받았을 때 리스너의 onResponse 메소드를 자동으로 호출
        // 에러 리스너: 에러가 발생했을 때 호출
        StringRequest request = new StringRequest(
                Request.Method.GET,
                url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        println("응답: " + response);
                        processResponse(response);  // 응답 처리 메서드
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        println("에러: " + error.getMessage());
                    }
                }
        ) {
            @Override
            protected Map<StringString> getParams() throws AuthFailureError {
                // 만약 POST 방식에서 전달할 요청 파라미터가 있다면 HashMap 객체에 넣어준다.
                Map<StringString> map = new HashMap<>();
                return map;
            }
        };
 
        request.setShouldCache(false); // 이전 결과가 있더라도 새로 요청해서 응답을 보여줌
        AppHelper.requestqueue.add(request); // request queue 에 request 객체를 넣어준다.
    }
 
    public void processResponse(String response){
        Gson gson = new Gson();
        MovieList movieList = gson.fromJson(response, MovieList.class);
 
        if(movieList != null){
            println("박스오피스 타입: " + movieList.boxOfficeResult.boxofficeType);
            println("박스오피스 기간: " + movieList.boxOfficeResult.showRange);
            println("영화 개수: " + movieList.boxOfficeResult.dailyBoxOfficeList.size());
        }
    }
 
    public void println(String str){
        textView.append(str + "\n");
    }
}
cs



참고

google/json: https://github.com/google/gson

Leveraging the Gson Library: https://guides.codepath.com/android/leveraging-the-gson-library

'Android' 카테고리의 다른 글

SQLite database 사용해보기  (0) 2018.08.19
AsyncTask를 이용해 이미지 다운로드하기  (0) 2018.08.04
Volley 사용하기 - (1)  (0) 2018.07.31
HTTP - 2. 웹으로 요청하기  (0) 2018.07.30
HTTP - 1. HTTP란  (0) 2018.07.30

+ Recent posts