본문 바로가기
Develop/JSP

공공데이터 API JSP에 적용하기, 조회+DB 저장하기 (3)

by ys2ys2 2024. 9. 28.

공공데이터 API를 사용해서 화면에 출력하는거 까지는 잘 해결했다.

 

이제 다음 목표는 이걸 DB에 저장해서 필요한 곳에 잘 출력하게 하고 싶었다.

 

이번 프로젝트 주제가 공공데이터를 활용한 여행지 추천 ~ 인데,  난 '공공데이터를 활용' 에 대한 부분에서 고민이 많았다.
공공데이터 활용이 어디까지가 활용인걸까? 잘 정리가 되지 않았다.

나는 공공데이터 활용 = 기술적으로(?) API를 사용해서 화면에 출력 이라고 생각했다.
DB에 저장해서 그걸 화면에 출력하는게 공공데이터 활용인가? 공공데이터 파일을 받아서 DB에 저장한다음 출력하는게 그냥 문자 그대로 공공데이터를 활용(저장)해서 쓴다는 느낌이였다. 이게 활용인가..?

헷갈리는건? 물어보자!
쌤한테 쪼르르 가서 물어봤는데 공공데이터 활용은 API 활용도 있지만 API를 불러와서 DB에 저장하고 그걸 활용하는것도 공공데이터 활용이라고 말씀해주셨다. 이렇게 공공데이터 활용에 대한 궁금증 해결 완료!


그냥 파일 받아서 저장해서 쓰는것 보다 조금 어렵게 가보려고 한다.

JSP페이지 내에서 공공데이터 조회 → 조회한 값 중에 원하는 값들을 DB에 저장하게 하려고 한다.

 

사용한 공공데이터 : 한국관광공사_국문 관광정보 서비스_GW

 

여기에 왠만한건 다 있다!

제공되는 API

 

 

 

만드려고 하는 DB조회 순서는

지역코드 입력/조회 → 입력받은 지역코드에 해당하는 관광정보 출력 →  

 

먼저 지역코드를 알아봤다. 

지역코드 테스트 API

 

{
  "response": {
    "header": {
      "resultCode": "0000",
      "resultMsg": "OK"
    },
    "body": {
      "items": {
        "item": [
          {
            "rnum": 1,
            "code": "1",
            "name": "서울"
          },
          {
            "rnum": 2,
            "code": "2",
            "name": "인천"
          },
          {
            "rnum": 3,
            "code": "3",
            "name": "대전"
          },
          {
            "rnum": 4,
            "code": "4",
            "name": "대구"
          },
          {
            "rnum": 5,
            "code": "5",
            "name": "광주"
          },
          {
            "rnum": 6,
            "code": "6",
            "name": "부산"
          },
          {
            "rnum": 7,
            "code": "7",
            "name": "울산"
          },
          {
            "rnum": 8,
            "code": "8",
            "name": "세종특별자치시"
          },
          {
            "rnum": 9,
            "code": "31",
            "name": "경기도"
          },
          {
            "rnum": 10,
            "code": "32",
            "name": "강원특별자치도"
          },
          {
            "rnum": 11,
            "code": "33",
            "name": "충청북도"
          },
          {
            "rnum": 12,
            "code": "34",
            "name": "충청남도"
          },
          {
            "rnum": 13,
            "code": "35",
            "name": "경상북도"
          },
          {
            "rnum": 14,
            "code": "36",
            "name": "경상남도"
          },
          {
            "rnum": 15,
            "code": "37",
            "name": "전북특별자치도"
          },
          {
            "rnum": 16,
            "code": "38",
            "name": "전라남도"
          },
          {
            "rnum": 17,
            "code": "39",
            "name": "제주도"
          }
        ]
      },
      "numOfRows": 17,
      "pageNo": 1,
      "totalCount": 17
    }
  }
}

 

이런식으로 제공하고 있었다. 시도 단위로만 사용할거 같아서 세세한 지역코드까지는 패스!

이건 그냥 페이지 내에서 제공하기로!

(지역까지 입력받고 입력받은 값에 따른 지역코드 제공하고 그렇게까지 할 필요가 없다. 단순하고 빠르게!)

 

그리고 지역코드와 이름만 사용할 예정이라 rnum(고유값)을 뺀 나머지 속성을 따로 메모해뒀다.
( code=지역코드, name=지역이름)

그러고 지역코드를 입력받고 해당 지역코드를 기반으로 관광정보를 조회하는 부분부터 만들었다.

지역코드로 조회하기


지역코드를 조회하면 실행될 processCodeApi도 만들어줬다.

공공데이터를 호출할때 기본적으로 들어가야 할 항목들이 있다. 지역코드 기반 관광정보조회 부분에서는

 

이렇게 MobileOS, MobileApp, serviceKey 값이 필요했다.

(MobileApp에 해당하는 서비스명(어플명)은 왜 필요한지 모르겠지만..? 아무거나 넣어도 잘 된다.)

 

// 공공데이터 API 호출 설정
    String apiKey = "API KEY값";
    String apiUrl = "http://apis.data.go.kr/B551011/KorService1/areaBasedList1";
    String params = "?serviceKey=" + apiKey
                  + "&MobileOS=ETC"
                  + "&MobileApp=APP"
                  + "&_type=json" 
                  + "&arrange=O" // 정렬구분 (A=제목순, C=수정일순, D=생성일순) 대표이미지가 반드시 있는 정렬 (O=제목순, Q=수정일순, R=생성일순)
                  + "&contentTypeId=12" 
                  + "&numOfRows=20" 
                  + "&areaCode=" + regionCode
                  + "&pageNo=1";

 

contentTypeId=12를 넣었다. contentTypeId는 관광타입이고 12는 관광지에 해당한다.

contentTypeId

 

numOfRows=20개씩 출력되게 하였다.

pageNo은=1로 고정시켰다 (추후에 바꾸거나 어떻게 써야할지 생각중..) 

 

이렇게 호출할 기본 셋팅을 해놓고 필요한 정보들을 선택해서 출력하게 테스트 해봤다.

<% for (int i = 0; i < items.length(); i++) {
    JSONObject item = items.getJSONObject(i);
    String addr1 = item.optString("addr1", "정보 없음");
    String areacode = item.optString("areacode", "정보 없음");
    String contentid = item.optString("contentid", "정보 없음");
    String firstimage = item.optString("firstimage", "정보 없음");
    String mapx = item.optString("mapx", "정보 없음");
    String mapy = item.optString("mapy", "정보 없음");
    String title = item.optString("title", "정보 없음");
%>

 

addr1 = 주소

(addr2 = 상세주소인데 이건 뺐다. 제공되는 정보가 (ㅇㅇ동) 식으로 나와서 필요가 없음!)

areacode = 지역코드

contentid = 콘텐츠아이디 (콘텐츠아이디로 상세정보 검색 예정)

firstimage = 이미지

mapx  = 경도 ( 구글 맵 API에 위치 마커용)

mapy = 위도 ( 구글 맵 API에 위치 마커용)

title = 제목

 

이렇게 불러오게 했다!

지역코드 1 (서울) 입력시 결과값

 

이제 해야할건 이 콘텐츠 ID로 상세정보를 조회해야 한다.

내가 못찾는건지 뭔지 설명에 해당하는 부분을 가져오려면 contentid를 필수값으로 입력해서 가져오는 공통정보조회 를 사용해야 한다.

공통정보조회
2733967 = 가회동성당

 

첫번째에 나온 가회동성당 contentId를 넣어서 테스트해봤다.

 

{
  "response": {
    "header": {
      "resultCode": "0000",
      "resultMsg": "OK"
    },
    "body": {
      "items": {
        "item": [
          {
            "contentid": "2733967",
            "contenttypeid": "12",
            "title": "가회동성당",
            "createdtime": "20210817184103",
            "modifiedtime": "20240528175721",
            "tel": "",
            "telname": "",
            "homepage": "<a href=\"https://gahoe.or.kr\" target=\"_blank\" title=\"새창 : 가회동성당 사이트로 이동\">https://gahoe.or.kr</a>",
            "booktour": "0",
            "firstimage": "http://tong.visitkorea.or.kr/cms/resource/09/3303909_image2_1.jpg",
            "firstimage2": "http://tong.visitkorea.or.kr/cms/resource/09/3303909_image3_1.jpg",
            "cpyrhtDivCd": "Type3",
            "areacode": "1",
            "sigungucode": "23",
            "addr1": "서울특별시 종로구 북촌로 57 (가회동)",
            "addr2": "",
            "zipcode": "03052",
            "mapx": "126.9846616856",
            "mapy": "37.5820858828",
            "mlevel": "6",
            "overview": "가회동성당이 위치한 북촌 일대는 최초의 선교사 주문모(周文謨, 야고보) 신부가 조선에 밀입국하여 1795년 4월 5일 부활 대축일에 최인길(崔仁吉, 마티아)의 집에서 조선 땅에서의 ‘첫 미사’를 집전한 지역이다. 본당 관할구역은 주문모 신부가 강완숙(姜完淑, 골롬바)의 집에 숨어 지내면서 사목활동을 펼쳤던 지역으로서 한국 교회사에서 매우 중요한 의미가 있다.\n정식으로 본당이 된 것은 1949년이고, 이후 1954년에 성전이 완공되었다. 하지만 성전이 낡아 2011년부터 옛 성전을 허물고 현재의 새 성전을 짓게 되었다. 2013년 11월 21일 준공되었고, 준공 3일 후인 24일(그리스도 왕 대축일)에 입주하여 입주 미사를 봉헌하였다. 현재의 동서양 건축양식이 어우러진 새 성전은 과거의 역사를 되살리고자 2014년 4월 20일 부활 대축일에 서울교구장 염수정 추기경님에 의하여 축성되었다.\n(출처 : 가회동성당 홈페이지)"
          }
        ]
      },
      "numOfRows": 1,
      "pageNo": 1,
      "totalCount": 1
    }
  }
}

 

contentid로 조회하니까 처음본 값들도 같이 주고있었다. 어떤건지 확인하려면 → 제공되는 메뉴얼에 나와있다.

한국관광공사_TourAPI활용메뉴얼
한국관광공사_TourAPI활용메뉴얼

 

등등 많은 값들을 제공하고 있었다.

이중에 title, firstimage(대표이미지_원본), firstimage2(썸네일), addr1, mapx,mapy는 중복돼서 제공되고 있었고

필요했던 overview(설명) 부분이 새로 제공되는 것도 확인했다!

그럼 처음에 지역코드 조회 → 제목, 주소, 지역코드, 콘텐츠ID, 이미지 정도만 나오게 한다음

컨텐츠 ID로 상세정보 확인 후 → 선택해서 DB에 저장할 수 있게 하려고 한다.

불필요한 부분 빼고 콘텐츠ID같이 중요한 부분에 css도 살짝 입혀서 보기 편하게 정렬했다.

불필요한 부분 제외


이제 이 콘텐츠 ID들을 가지고 상세정보를 검색하고 그 나온 값들을 DB로 저장하게 만들면 되는데

콘텐츠ID를 하나하나 메모해서 입력하는건 비효율적이니 컨텐츠ID에 체크박스 추가 후 체크하면 검색값에 들어가게 javascript를 만들어줬다.

체크박스 js 추가

 

다음에 해야할건

콘텐츠ID에 입력받은 값들을 넣어서 공통정보조회를 통해

 

공통정보조회

 

제목, 주소(구글 맵에 마커찍기), 설명(홈페이지주소, 전화번호, 상세주소, 개요) 등등 받아와서 출력하고 DB에 저장하기!

또 더 필요한 값이 있을까도 생각해보기!