본문 바로가기

major/Android

[Android] 영화진흥위원회 API 사용방법

영화진흥위원회에서는 박스오피스, 공통코드조회, 영화정보, 영화사정보, 영화인정보를 API로 제공하고 있습니다.

이번 포스팅에서는 일일 박스오피스 정보를 json 형식으로 받아오고 파싱하는 것 까지 정리했습니다.

1. 키 발급

이 API를 사용하려면 영화진흥위원회 홈페이지에 가입하고 키를 발급받아야합니다.

홈페이지 가입 및 키 발급 과정은 생략했습니다. 간단하기 때문에 금방할 수 있습니다.

영화진흥위원회 API 키 발급

 

https://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=키&targetDt=20200302

위 url에서 "키"라고 적혀진 부분에 자신의 발급키를 넣고 접속했을 때, 아래와 같이 json 데이터가 나옵니다.

 

영화진흥위원회 API 사용

응답 필드가 무엇인지는 영화진흥위원회 오픈API 홈페이지에 상세히 나와있습니다.

2. JAVA 코드

이제 위 json 데이터에서 movieNm(영화명)만 출력하는 코드를 작성해보겠습니다.

ApiMovie.JAVA 파일을 새로 생성하고 아래의 코드를 복붙합니다.

public class ApiMovie extends Thread{

    public final static String apiURL = "https://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json";
    public final static String KEY = "발급받은 키";
    public static String today;

    ApiMovie(String today){
        this.today = today;
    }

    public void run(){
        main();
    }

    public static void main() {

        String url = apiURL+"?key="+KEY+"&targetDt="+today;
        String responseBody = get(url);
        parseData(responseBody);

    }

    private static String get(String apiUrl) {
        String responseBody = null;
        try {
            URL url = new URL(apiUrl);
            InputStream in = url.openStream();
            responseBody = readBody(in);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return responseBody;
    }

    private static String readBody(InputStream body){
        InputStreamReader streamReader = new InputStreamReader(body);

        try (BufferedReader lineReader = new BufferedReader(streamReader)) {
            StringBuilder responseBody = new StringBuilder();

            String line;
            while ((line = lineReader.readLine()) != null) {
                responseBody.append(line);
            }

            return responseBody.toString();
        } catch (IOException e) {
            throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e);
        }
    }

    private static void parseData(String responseBody) {
        String title;
        JSONObject jsonObject = null;
        try {
            jsonObject = new JSONObject(responseBody.toString());
            JSONObject jsonObject1 = (JSONObject) jsonObject.get("boxOfficeResult");
            JSONArray jsonArray = jsonObject1.getJSONArray("dailyBoxOfficeList");

            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject item = jsonArray.getJSONObject(i);
                title = item.getString("movieNm");
                System.out.println("movieNm : " + title);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

MainActivity.java를 아래와 같이 수정합니다.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd", Locale.KOREA);
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH,-1);
        String today = sdf.format(calendar.getTime()).toString();

        ApiMovie apiMovie = new ApiMovie(today);
        apiMovie.start();
    }
}

한달 전 박스오피스를 출력하는 코드입니다.

실행했을 때 다음과 같았습니다.

실행 결과

영화를 안본지 오래되서 클로젯 말고는 다 모르는 영화뿐이네요.

예전에 텀 프로젝트로 영화 관련 앱을 개발한 적이 있었는데, 몇년 전에 개발했다고 해도 코드가 너무 엉망이어서 다시 뜯어보고 있습니다. 영화진흥위원회에서는 영화 이미지를 제공하지 않아서, 네이버 영화 API 까지 중첩했었는데, 그 때문인지 코드가 그냥 아수라백작입니다. 읽기 좋은 코드를 짠다는건 정말 어려운 것 같습니다..


잘못된 내용이 있다면 언제든지 댓글이나 메일로 알려주시면 감사하겠습니다.

이 포스팅이 도움이 되었다면 공감 부탁드립니다.

궁금한 점은 언제든지 댓글 남겨주시면 답변해드리겠습니다:D