서울 열린데이터광장에서 발급받은 Open API 인증키로 Android 에서 호출해볼 수 있는 앱을 간단하게 만들어보았다.

이런 꿀 정보를 제공하는 앱들은 이미 많지 않을까라는 생각이 들지만,,

UI 를 이쁘게 만들어서 앱 출시를 해봐도 좋을 것 같다..ㅎㅎ

 

Open API 인증키 발급 정보는 아래 링크에서 확인!

https://mkdevlab.tistory.com/15

 

서울열린데이터 광장 API 인증키 발급

1. 서울 열린데이터 광장 로그인 https://data.seoul.go.kr/index.do 열린데이터광장 메인 데이터분류,데이터검색,데이터활용 data.seoul.go.kr 2. 인증키 정보 발급 받은 인증키는 '서울시 문화 행사 정보' 다.

mkdevlab.tistory.com

 

사용 Tool : Android Studio

1. Android Studio 에서 project 를 하나 생성한다.

OpenApiSample01 로 하나 만듦.

 

2. AndroidManifest.xml 수정

인터넷 사용이 필요하기 때문에 아래 권한을 manifest 하위에 추가 함.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mkdevlab.openapisample01">

    <uses-permission android:name="android.permission.INTERNET"/>

    ...생략...
    
</manifest>

3. 조회 화면 구성

RecyclerView 를 사용하여 간단하게 작성하였다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="1dp"
        tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>

아이템이 구성 레이아웃은 다음과 같이 간단하게 작성

<item_event.xml>

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingHorizontal="20dp"
    android:paddingVertical="10dp">

    <TextView
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:text="날짜"/>

    <TextView
        android:id="@+id/code_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:text="전시종"/>

    <TextView
        android:id="@+id/event_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/code_name"
        android:paddingVertical="10dp"
        android:text="제목"
        android:lines="1"
        android:textSize="18sp"
        android:textStyle="bold"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:layout_marginTop="10dp"
        android:background="@android:color/darker_gray"
        android:layout_below="@+id/event_title"/>
</RelativeLayout>

아래와 같은 레이아웃이다..

맨 아래 결과를 보면 이해가 더 쉬울 것이다..

 

4. 조회 코드 작성

RecyclerView 를 사용하고 있기 때문에 별도 커스텀 Adapter 를 만들어서 View 에 데이터를 보여주게끔 하였다.

Open API URL 를 조회하는 자바 코드는 다음과 같다.

 

urlAddress 에 사용된 URL 및 KEY 정보는 상수로 만들어져있다.

코드를 작성하면서 return 되는 값을 그때그때 확인하기 위해 log 를 남겨보았다.

public void fetch() {

        Log.d("main", "fetch() started::");

        String urlAddress = URL_1 + KEY + URL_2;

        new Thread() {
            @Override
            public void run() {
                super.run();

                try {
                    URL url = new URL(urlAddress);

                    InputStream is = url.openStream();
                    InputStreamReader isr = new InputStreamReader(is);
                    BufferedReader reader = new BufferedReader(isr);

                    StringBuffer buffer = new StringBuffer();
                    String line = reader.readLine();
                    while(line != null){
                        buffer.append(line + "\n");
                        line = reader.readLine();
                    }
                    String jsonData = buffer.toString();

                    JSONObject obj = new JSONObject(jsonData);

                    JSONObject culturalEventInfo = (JSONObject) obj.get("culturalEventInfo");

                    JSONObject result = (JSONObject) culturalEventInfo.get("RESULT");

                    //Log.d("main","result : " + result);
                    Log.d("main","code : " + result.get("CODE"));
                    Log.d("main","message : " + result.get("MESSAGE"));

                    JSONArray rowArray = culturalEventInfo.getJSONArray("row");

                    Log.d("main", "row : "  + rowArray);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            try {

                                for (int i = 0; i < rowArray.length(); i++){
                                    JSONObject tempOjb = rowArray.getJSONObject(i);
                                    String codeName = tempOjb.getString("CODENAME");
                                    String title = tempOjb.getString("TITLE");
                                    String place = tempOjb.getString("PLACE");
                                    String date = tempOjb.getString("DATE");
                                    String useTarget = tempOjb.getString("USE_TRGT");
                                    String useFee = tempOjb.getString("USE_FEE");
                                    String orgLink = tempOjb.getString("ORG_LINK");
                                    String mainImg = tempOjb.getString("MAIN_IMG");

                                    //Log.d("main", "row : " + i + ", codeName : " + codeName + ", title : " + title);
                                    EventData eventData = new EventData(codeName, title, place, date, useTarget, useFee, orgLink, mainImg);
                                    list.add(eventData);
                                }

                                eventAdapter.setEventList(list);

                                Log.d("main","list : " + list);

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    });


                } catch (IOException | JSONException e) {
                    e.printStackTrace();
                }

            }
        }.start();

    }

 

5. Emulator 를 실행 후 결과

 

짠! 내가 구성한 item 레이아웃으로 결과가 조회된 것을 볼수 있다.

10개를 조회했기 때문에 아래로 스크롤도 가능하다.

 

이제 각 item을 클릭했을 때 자세한 정보를 보여줄 수 있는 화면을 하나 만들어봐야겠다.

'개발이야기 > Android 개발' 카테고리의 다른 글

클래식 숫자야구 게임  (0) 2022.04.03

1. 서울 열린데이터 광장 로그인

https://data.seoul.go.kr/index.do

 

열린데이터광장 메인

데이터분류,데이터검색,데이터활용

data.seoul.go.kr

2. 인증키 정보

발급 받은 인증키는 '서울시 문화 행사 정보' 다.

http://data.seoul.go.kr/dataList/OA-15486/S/1/datasetView.do

 

서울시 문화행사 정보

서울문화포털에서 제공하는 문화행사 정보입니다. <br />공연, 행사에 대한 장소, 날짜, 기관명, 이용대상, 이용요금, 출연자, 프로그램 등의 정보를 제공합니다.

data.seoul.go.kr

3. 인증키 신청

  • 사용 URL : 티스토리 URL 입력
  • 이메일 : 개인 이메일 입력
  • 활용용도 : 참고자료 조사
  • 내용 : 참고자료 조사

이렇게 입력하고 '인증키 신청' 버튼을 클릭하면 인증키가 즉시 발행된다.

아마, 간단하게 조회해볼 수 있는 API 라서 별도의 심사는 거치지 않는 것으로 보여진다.

 

발급 받은 Key 를 사용하여, 호출 포맷에 맞춰 브라우저에서 호출해보자.

 

4. 브라우저 호출 테스트

URL : http://openapi.seoul.go.kr:8088/<인증키>/json/culturalEventInfo/1/5/

 

원하는 포맷으로 return 받을 수 있다. 위에 페이지 및 조회 건수를 설정하여 호출도 가능하다.

아래 표 참고!

출처: 서울열린데이터광장

5. 호출 결과

{
  "culturalEventInfo": {
    "list_total_count": 2554,
    "RESULT": {
      "CODE": "INFO-000",
      "MESSAGE": "정상 처리되었습니다"
    },
    "row": [
      {
        "CODENAME": "연극",
        "TITLE": "이야기극장 100년의 동요",
        "DATE": "2022-06-25~2022-06-26",
        "PLACE": "노원어린이극장",
        "ORG_NAME": "노원문화재단",
        "USE_TRGT": "24개월 이상",
        "USE_FEE": "전석 2만원",
        "PLAYER": "",
        "PROGRAM": "",
        "ETC_DESC": "",
        "ORG_LINK": "https://www.nowonarts.kr/html/pe/performancedetail.php?param_url=https%3A%2F%2Fwww.nowonarts.kr%2Fhtml%2Fpe%2Fperformanceinfo.php%3F%26cate%3D%26skin%3D%26search_state%3D1%26search_syear%3D%26search_smonth%3D%26search_eyear%3D%26search_emonth%3D%26search_order%3D%26search_startPage%3D&idx=254",
        "MAIN_IMG": "https://culture.seoul.go.kr/cmmn/file/getImage.do?atchFileId=1b1b2570b32e4d25bee20cfdd51c005a&thumb=Y",
        "RGSTDATE": "2022-03-29",
        "TICKET": "기관",
        "STRTDATE": "2022-06-25 00:00:00.0",
        "END_DATE": "2022-06-26 00:00:00.0",
        "THEMECODE": ""
      },
      {
        "CODENAME": "콘서트",
        "TITLE": "2022 한국가곡 세기의 콘서트 #2. 향수",
        "DATE": "2022-05-20~2022-05-20",
        "PLACE": "플레이맥",
        "ORG_NAME": "마포문화센터",
        "USE_TRGT": "8세이상 관람가",
        "USE_FEE": "전석 30,000원",
        "PLAYER": "",
        "PROGRAM": "",
        "ETC_DESC": "",
        "ORG_LINK": "https://www.mfac.or.kr/performance/whole_view.jsp?sc_b_category=17&sc_b_code=BOARD_1207683401&pk_seq=2004&page=1",
        "MAIN_IMG": "https://culture.seoul.go.kr/cmmn/file/getImage.do?atchFileId=e2cd064a6b1048a88a7426bea8d6ca9f&thumb=Y",
        "RGSTDATE": "2022-03-31",
        "TICKET": "기관",
        "STRTDATE": "2022-05-20 00:00:00.0",
        "END_DATE": "2022-05-20 00:00:00.0",
        "THEMECODE": ""
      },
      {
        "CODENAME": "클래식",
        "TITLE": "김선욱 피아노 리사이틀 M소나타 시리즈 1",
        "DATE": "2022-05-18~2022-05-18",
        "PLACE": "마포아트센터 아트홀맥",
        "ORG_NAME": "",
        "USE_TRGT": "8세이상 입장가능(미취학아동입장불가)",
        "USE_FEE": "VIP 60,000원,R석 50,000원, S석 30,000원",
        "PLAYER": "출연 : 피아니스트 김선욱",
        "PROGRAM": "□ 프로그램 슈베르트 네 개의 즉흥곡, D. 899 (Op. 90) 알베니즈 ‘이베리아’ 모음곡 2권 리스트 피아노 소나타 b단조, S. 178",
        "ETC_DESC": "",
        "ORG_LINK": "https://www.mfac.or.kr/performance/whole_view.jsp?sc_b_category=17&sc_b_code=BOARD_1207683401&pk_seq=2001&page=1",
        "MAIN_IMG": "https://culture.seoul.go.kr/cmmn/file/getImage.do?atchFileId=7f2ab2cb8441407e9c78b8b388efc284&thumb=Y",
        "RGSTDATE": "2022-03-18",
        "TICKET": "기관",
        "STRTDATE": "2022-05-18 00:00:00.0",
        "END_DATE": "2022-05-18 00:00:00.0",
        "THEMECODE": "기타"
      },
      {
        "CODENAME": "문화교양/강좌",
        "TITLE": "양재도서관 인문프로그램 「문화공감, 잇-다」- 2022년 세대를 잇는 리버스 멘토링",
        "DATE": "2022-05-12~2022-08-11",
        "PLACE": "서초구립양재도서관",
        "ORG_NAME": "서초구립양재도서관",
        "USE_TRGT": "관심 있는 시민 누구나(성인)",
        "USE_FEE": "",
        "PLAYER": "1강 : 송주희, 김윤철 / 2강 : 배윤슬 / 3강 : 이슬아 / 4강 : 유네린",
        "PROGRAM": "양재도서관 인문프로그램 「문화공감, 잇-다」는 매년 다방면의 주제로 시대를 관통하는 새로운 시각을 제시합니다.  2022년은 '리버스 멘토링'을 콘셉트로 MZ세대 인플루언서와 만남을 통해 세대 간 소통을 시도하고 다양한 삶의 가치를 공유합니다. ",
        "ETC_DESC": "코로나-19 상황에 따라 비대면 전환 운영 가능합니다. ",
        "ORG_LINK": "https://yangjae.seocholib.or.kr/NoticeInfoDetail/11513",
        "MAIN_IMG": "https://culture.seoul.go.kr/cmmn/file/getImage.do?atchFileId=a7df7232e29d4e8c8b0d5bd32b6bc107&thumb=Y",
        "RGSTDATE": "2022-03-27",
        "TICKET": "기관",
        "STRTDATE": "2022-05-12 00:00:00.0",
        "END_DATE": "2022-08-11 00:00:00.0",
        "THEMECODE": ""
      },
      {
        "CODENAME": "콘서트",
        "TITLE": "김창완밴드콘서트",
        "DATE": "2022-05-12~2022-05-12",
        "PLACE": "노원문화예술회관 대공연장",
        "ORG_NAME": "노원문화재단",
        "USE_TRGT": "8세 이상",
        "USE_FEE": "R석 6만원 / A석 4만원",
        "PLAYER": "",
        "PROGRAM": "",
        "ETC_DESC": "",
        "ORG_LINK": "https://www.nowonarts.kr/html/pe/performancedetail.php?param_url=https%3A%2F%2Fwww.nowonarts.kr%2Fhtml%2Fpe%2Fperformanceinfo.php%3F%26cate%3D%26skin%3D%26search_state%3D1%26search_syear%3D%26search_smonth%3D%26search_eyear%3D%26search_emonth%3D%26search_order%3D%26search_startPage%3D&idx=255",
        "MAIN_IMG": "https://culture.seoul.go.kr/cmmn/file/getImage.do?atchFileId=bb6cde1ab10149d48feaa19cd343059c&thumb=Y",
        "RGSTDATE": "2022-03-29",
        "TICKET": "기관",
        "STRTDATE": "2022-05-12 00:00:00.0",
        "END_DATE": "2022-05-12 00:00:00.0",
        "THEMECODE": ""
      }
    ]
  }
}

 

다음으로는 이 Open API URL 을 Android 와 접목하여 앱으로 간단하게 만들어본 결과를 공유해봐야겠다 !!

+ Recent posts