강원 반려동물 동반관광 API 시스템에 공개되어있는 정보를 데이터베이스에 입력하는 코드를 작성했다.
강원 반려동물 동반관광 Open API 링크
Open API 목록 | 강원특별자치도 반려동물 동반관광 API 시스템 > OpenAPI > Open API 목록 (pettravel.kr)
Open API 목록 | 강원특별자치도 반려동물 동반관광 API 시스템 > OpenAPI > Open API 목록
www.pettravel.kr
사용 설명 PDF에 사용방법이 적혀있다. 여기서는 분야 코드 PC03으로 접근할 수 있는 관광지 정보를 다룬다.
API에는 4가지 종류가 있다.
1)분야코드별 리스트
http://pettravel.kr/api/listPart.do?page=[현재 페이지 값]&pageBlock=[페이지 출력 개수]&partCode=[분야 코드]
2)지역코드별 리스트
3)분야코드별 상세
http://www.pettravel.kr/api/detailSeqPart.do?partCode=[분야 코드]&contentNum=[콘텐츠 번호]
4)지역코드별 상세
1)에서 지역코드별 contentSeq를 획득하고, 그것을 사용해서 3)에 접근해 상세정보를 얻는다.
1)에서 다룰 JSON
3)에서 다룰 JSON
Repository에 함수를 총 3개 만들었다.
①getSpotContentSeq(): 분야코드별 리스트에서 contentSeq 획득해서 배열에 저장
②getSpotByContentSeq(int[] SpotContentSeq): 분야코드별 상세에 contentSeq를 이용해 접근해서 JSONObject로 상세정보 획득, 배열에 저장
③addSpotByAPI(JSONObject[] SpotDetailArray): JSONObject에서 상세정보를 뽑아서 데이터베이스에 저장
①getSpotContentSeq()
public int[] getSpotContetSeq() {
//contentSeq를 넣을 배열 선언
int[] contentSeqArray = null;
try {
//API 접속
String reqUrl = "https://www.pettravel.kr/api/listPart.do?page=1&pageBlock=300&partCode=PC03";
URL url = new URL(reqUrl);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("GET");
//읽어옴
BufferedReader br;
int responseCode = con.getResponseCode();
if(responseCode == 200) {
br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
}else {
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
String line;
StringBuffer response = new StringBuffer();
while((line = br.readLine()) != null) {
response.append(line);
}
br.close();
//가져온 데이터 처리
JSONArray jsonArray = new JSONArray(response.toString());
//배열 객체 배열 객체
//가장 밖의 [ 꺼냄: { "resultList" : [{ }] }
JSONObject object = jsonArray.getJSONObject(0);
//[ 안의 { 안의 "resultList": [ { afsdf } ]
JSONArray arr = (JSONArray)object.getJSONArray("resultList");
System.out.println(arr.toString());
//contentSeqArray의 길이 설정: resultList의 길이와 일치시킴
contentSeqArray = new int[arr.length()];
for(int i = 0; i<arr.length(); i++) {
JSONObject object2 = arr.getJSONObject(i);
//JSONObject 확인용
//reqUrl의 pageBlock을 10 정도로 해놓고 출력하는 것을 권장
System.out.println(i+"번째");
System.out.println(object2.toString());
int contentSeq = object2.getInt("contentSeq");
System.out.println("contentSeq: " + contentSeq);
//배열에 담음
contentSeqArray[i] = contentSeq;
}//for
}catch(Exception e){
e.printStackTrace();
}
//contentSeqArray[] 확인
for(int k = 0; k<contentSeqArray.length; k++) {
System.out.println("contentSeqArray[" + k + "]: " + contentSeqArray[k]);
}
return contentSeqArray;
}
클린 코드를 읽으면서 배운 내용을 실천해봤다. 그런데 함수 이름만 신경쓰고 지역변수 이름에는 신경을 덜 썼다. 함수 작성에 급급했던 것 같다.
②getSpotByContentSeq(int[] SpotContentSeq)
①의 실행 결과를 매개변수로 사용한다.
public JSONObject[] getSpotAPIByContentSeq(int[] contentSeqArray) {
//상세정보 Object를 담을 JSONObject 배열 생성
//contentSeq 배열과 길이 같음
JSONObject[] spotsDetailArray = new JSONObject[contentSeqArray.length];
try {
//배열의 길이만큼(contentSeq의 개수만큼) 반복
for(int i = 0; i<contentSeqArray.length; i++) {
//API 접근
String detailReqUrl = "https://www.pettravel.kr/api/detailSeqPart.do?partCode=PC03&contentNum=" + contentSeqArray[i];
System.out.println("detailReqUrl: " + detailReqUrl);
URL detailurl = new URL(detailReqUrl);
HttpURLConnection detailCon = (HttpURLConnection)detailurl.openConnection();
detailCon.setRequestMethod("GET");
//한 줄씩 읽어들임
BufferedReader detailbr;
int detailresponseCode = detailCon.getResponseCode();
if(detailresponseCode == 200) {
detailbr = new BufferedReader(new InputStreamReader(detailCon.getInputStream(), "UTF-8"));
}else {
detailbr = new BufferedReader(new InputStreamReader(detailCon.getErrorStream()));
}
String detailline;
StringBuffer detailresponse = new StringBuffer();
while((detailline = detailbr.readLine()) != null) {
detailresponse.append(detailline);
}
detailbr.close();
//읽어들인 데이터 처리
JSONArray detailjsonArray = new JSONArray(detailresponse.toString());
//배열 객체 객체
//가장 밖의 [ 꺼냄: { "resultList" : { } }
JSONObject detailobject = detailjsonArray.getJSONObject(0);
//[ 안의 { 안의 "resultList": { afsdf } 상세정보가 담긴 객체
JSONObject detail_object = detailobject.getJSONObject("resultList");
System.out.println("detailarr: " + detail_object.toString());
//배열에 객체 담음
spotsDetailArray[i] = detail_object;
}//for
}catch(Exception e){
}
System.out.println("spotsDetailArray[0]: " + spotsDetailArray[0].toString());
return spotsDetailArray;
}
③addSpotByAPI(JSONObject[] SpotDetailArray)
②의 실행결과를 받아서 데이터를 뽑아 데이터베이스에 작성한다.
1)데이터베이스 테이블
CREATE TABLE Spot
(
contentSeq INT PRIMARY KEY,
areaName VARCHAR(10),
partName VARCHAR(10),
title VARCHAR(20),
keyword VARCHAR(100),
address VARCHAR(100),
latitude VARCHAR(100),
longitude VARCHAR(100),
tel VARCHAR(20),
usedTime VARCHAR(200),
homePage VARCHAR(255),
content TEXT,
provisionSupply TEXT,
petFacility TEXT,
restaurant TEXT,
parkingLog TEXT,
mainFacility TEXT,
usedCost TEXT,
policyCautions TEXT,
emergencyResponse TEXT,
memo TEXT,
bathFlag CHAR(1),
provisionFlag CHAR(1),
petFlag CHAR(1),
petWeight VARCHAR(10),
dogBreed CHAR(1),
emergencyFlag CHAR(1),
entranceFlag CHAR(1),
parkingFlag CHAR(1),
inOutFlag VARCHAR(10),
p1 VARCHAR(255),
p2 VARCHAR(255),
p3 VARCHAR(255),
p4 VARCHAR(255),
p5 VARCHAR(255),
p6 VARCHAR(255),
p7 VARCHAR(255),
p8 VARCHAR(255),
p9 VARCHAR(255),
p10 VARCHAR(255)
);
2)메서드
public void addSpotByAPI(JSONObject[] spotsDetailArray) {
//DB에 등록하기
System.out.println("SpotRepository2.addSpot() 도착");
//배열 길이만큼(JSONObject 개수만큼) 반복
for(int i = 0; i<spotsDetailArray.length; i++) {
//내부 데이터 변수에 저장
int contentSeq = spotsDetailArray[i].getInt("contentSeq");
String areaName = spotsDetailArray[i].getString("areaName");
String partName = spotsDetailArray[i].getString("partName");
String title = spotsDetailArray[i].getString("title");
String keyword = spotsDetailArray[i].getString("keyword");
String address = spotsDetailArray[i].getString("address");
String latitude = spotsDetailArray[i].getString("latitude");
String longitude = spotsDetailArray[i].getString("longitude");
String tel = spotsDetailArray[i].getString("tel");
String usedTime = spotsDetailArray[i].getString("usedTime");
String homePage = spotsDetailArray[i].getString("homePage");
String content = spotsDetailArray[i].getString("content");
String provisionSupply = spotsDetailArray[i].getString("provisionSupply");
String petFacility = spotsDetailArray[i].getString("petFacility");
String restaurant = spotsDetailArray[i].getString("restaurant");
String parkingLog = spotsDetailArray[i].getString("parkingLog");
String mainFacility = spotsDetailArray[i].getString("mainFacility");
String usedCost = spotsDetailArray[i].getString("usedCost");
String policyCautions = spotsDetailArray[i].getString("policyCautions");
String emergencyResponse = spotsDetailArray[i].getString("emergencyResponse");
String memo = spotsDetailArray[i].getString("memo");
String bathFlag = spotsDetailArray[i].getString("bathFlag");
String provisionFlag = spotsDetailArray[i].getString("provisionFlag");
String petFlag = spotsDetailArray[i].getString("petFlag");
String petWeight = spotsDetailArray[i].getString("petWeight");
String dogBreed = spotsDetailArray[i].getString("dogBreed");
String emergencyFlag = spotsDetailArray[i].getString("emergencyFlag");
String entranceFlag = spotsDetailArray[i].getString("entranceFlag");
String parkingFlag = spotsDetailArray[i].getString("parkingFlag");
String inOutFlag = spotsDetailArray[i].getString("inOutFlag");
//이미지 배열 처리
//이미지 배열 취득
JSONArray imageList = spotsDetailArray[i].getJSONArray("imageList");
//이미지 주소 담을 배열 선언
String[] imageListContent = new String[10];
//이미지 배열의 길이만큼(이미지 개수만큼) 반복
//배열에 이미지 주소 담음
for(int k = 0; k<imageList.length(); k++) {
JSONObject imageObject = imageList.getJSONObject(k);
String imageUrl = imageObject.getString("image");
imageListContent[k] = imageUrl;
}//inner for
//SQL문 작성
String sql = "INSERT INTO Spot VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
template.update(sql, contentSeq, areaName, partName, title, keyword, address, latitude, longitude, tel, usedTime, homePage, content, provisionSupply, petFacility, restaurant, parkingLog, mainFacility, usedCost, policyCautions, emergencyResponse, memo, bathFlag, provisionFlag, petFlag, petWeight, dogBreed, emergencyFlag, entranceFlag, parkingFlag, inOutFlag, imageListContent[0], imageListContent[1], imageListContent[2], imageListContent[3], imageListContent[4], imageListContent[5], imageListContent[6], imageListContent[7], imageListContent[8], imageListContent[9] );
}//for
}
*API가 수정됐을 때 변경된 사항만 업데이트할 수가 없다. 그래서 변동이 있으면 데이터를 삭제하고 다 새로 받아야 할 것 같다.
'정리노트 > 팀프로젝트' 카테고리의 다른 글
[팀 프로젝트] 24.02.22. 노트 (0) | 2024.02.22 |
---|---|
[팀 프로젝트] 24.02.21 노트 (0) | 2024.02.21 |
[팀 프로젝트] 24.02.20. 노트 (0) | 2024.02.20 |
[스프링]관리자 입장에서의 회원 관리(RUD) (0) | 2024.02.20 |
[스프링] 회원 목록 불러오기 (0) | 2024.02.19 |