🍃 spring boot-version '2.7.5'
🌎 java-version 11
🐘 gradle
📁 공공데이터오픈API
✍ 명함관리 서비스 프로젝트를 만들면서 사용자가 명함을 등록할 때 기업을 검색하여 선택할 수 있도록 하는 기능을 구현하기 위해 기업정보가 필요했기에 공공데이터API에서 기업정보를 가져오기로 결정!
공공데이터는 개발자라면 꼭 알고있기도하고, 꼭 한번 사용해보고싶은 기능이였기에 시도해봤다
👉 공공데이터 오픈API신청 방법 : https://bkyungkeem.tistory.com/43
🔖 깃허브 주소 https://github.com/kimbokyung1220/publicOpenAPI/tree/main
+) 공공데이터를 받아 json으로 파싱하여 사용하여 원하는 결과값을 가져올 수 있도록 구현했습니다!
📌 공공데이터를 사용해봅시다 !
1. 인증키 확인
✔ 일반인증키(Encoding/Decoding) 둘다 사용가능
✔ 일반인증키(Encoding/Decoding) 둘다 사용가능
💡 API 환경 또는 API 호출 조건에 따라 인증키가 적용되는 방식이 다를 수 있습니다.
포털에서 제공되는 Encoding/Decoding된 인증키를 적용하면서 구동되는 키를 사용하시기 바랍니다.
✔ 데이터명 옆에 [ 상세설명 ] 버튼 클릭 후 참고문서 다운로드 후 확인하여 필수값과 옵션값 확인.
✔ 필수:1 / 옵션: 0
👉 https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15043184
2. 샘플데이터 확인
✔ 미리보기에 [ 확인 ] 버튼 클릭 > "요청변수" 입력 > 미리보기
🔻🔻🔻
3. 샘플코드 확인
✔ 밑에 링크에 들어가서 젤 하단에 보면 언어별 샘플코드가 있습니다
👉 샘플코드 확인
📌 패키지 및 클래스
💻 build.gradle
✔ 의존성 추가
✔ 오픈API를 호출해서 받아온 response값을 다시 json형식으로 파싱해 주기 위해서 JSON-Parse 추가
// json
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
//Json-Parser 사용하기 위한
implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
💻 OpenApiRequestDto.java
✔ @RequestBody에 담아 보낼 값 ( = 요청변수)
✔ 기업을 검색하는 기능을 구현하기 위해 페이지번호와 기업명은 변수로 받아옴
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class OpenApiRequestDto {
private String pageNo; // 페이지 번호
private String companyName; // 법인명칭(corpNm)
}
💻 OpenApiResponseDto.java
✔ Json파싱 하고 받을 값
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class OpenApiResponseDto {
private Long id; // 고유값
private Long crno; //고유값
private String totalCount; // 전체 결과 수
private String companyName; // 법인명칭(corpNm) - main
private String companyAddress; // 회사주소(enpBsadr)
}
💻 OpenApiController.java
✔ MVC패턴 사용
✔ @RequestParam을 사용하지 않은 이유: RequestBody에 키워드값을 넣어서 그 값을 오픈api파라미터값으로 사용해야하기 때문
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api")
public class OpenApiController {
private final OpenApiService openApiService;
@PostMapping(value = "/companySearch")
public ResponseDto<?> getPublicInstitutionsApi(@RequestBody OpenApiRequestDto requestDto) throws IOException, ParseException {
return openApiService.getPublicInstitutionsApi(requestDto);
}
}
💻 OpenApiService.java 📌 참고문서에서 변수명, 요청url 꼭꼭 확인하세요!
✔ Json 파싱 전
✔ 완성본은 상단 🔖깃주소를 참고해주세요!!
🔹 30번라인 - URL : 기업개요조회데이터가 필요하기 때문에 http:주소/getCorpOutlin 사용
🔹 32번라인 - serviceKey : 인증키 넣기 ( "=서비스키" 부분에서 "="는 꼭 필요하기 때문에 지우지X)
🔹 33번라인 - pageNo: 페이지번호(RequestBody로 받아온 요청변수)
🔹 34번라인 - numOfRows: 한 페이지에 나타낼 정보 갯수
🔹 35번라인 - resultType: 결과값 형식 json / xml
🔹 36번라인 - basDt: 기준일은 20200509 로 두었음
🔹 37번라인 - corpNm: 기업명 (RequestBody로 받아온 요청변수)
import com.example.publcopenapi.request.OpenApiRequestDto;
import com.example.publcopenapi.response.OpenApiResponseDto;
import com.example.publcopenapi.response.ResponseDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
@Service
@Slf4j
@RequiredArgsConstructor
public class OpenApiService {
@Value("${spring.open.api.service.key}")
String serviceKey;
public ResponseDto<?> getPublicInstitutionsApi(OpenApiRequestDto requestDto) throws IOException, ParseException {
// 1. URL을 만들기 위한 StringBuilder
StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/1160100/service/GetCorpBasicInfoService/getCorpOutline"); /*URL*/
// 2. 오픈 API의요청 규격에 맞는 파라미터 생성, 발급받은 인증키
urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8") + "=" + serviceKey); /*Service Key(필수)*/
urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode(requestDto.getPageNo(), "UTF-8")); /*페이지번호(필수)*/
urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode("20", "UTF-8")); /*한 페이지 결과 수(필수)*/
urlBuilder.append("&" + URLEncoder.encode("resultType", "UTF-8") + "=" + URLEncoder.encode("json", "UTF-8")); /* 결과형식(xml/json)(필수) */
urlBuilder.append("&" + URLEncoder.encode("basDt", "UTF-8") + "=" + URLEncoder.encode("20200509", "UTF-8")); /*기준일자 (필수)*/
urlBuilder.append("&" + URLEncoder.encode("corpNm", "UTF-8") + "=" + URLEncoder.encode(requestDto.getCompanyName(), "UTF-8")); /*법인(法人)의 명칭*/
// 3. URL 객체 생성
URL url = new URL(urlBuilder.toString());
// 4. 요청하고자 하는 URL과 통신하기 위한 Connection 객체 생성
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 5. 통신을 위한 메소드 SET
conn.setRequestMethod("GET");
// 6. 통신을 위한 Content-type SET
conn.setRequestProperty("Content-type", "application/json");
// 7. 통신 응답 코드 확인
log.info("############ Response code: " + conn.getResponseCode());
// 8. 전달받은 데이터를 BufferedReader 객체로 저장
BufferedReader rd;
// getResponseCode가 200이상 300이하일때는 정상적으로 작동
if (conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
// 9. 저장된 데이터를 라인별로 읽어 StringBuilder 객체로 저장
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
// 10. 객체 해제
rd.close();
conn.disconnect();
return ResponseDto.success(sb.toString());
}
}
🔻🔻🔻 이렇게 나옴
💻 OpenApiService.java
✔ Json 파싱 부분
✔ 기존에 받아오는 데이터에서 원하는 값만 추출하기 위해서 JsonParser를 사용함
✔ for문을 사용해 parse_item배열에서 원하는 값을 가져온다
✔ 완성본은 상단 🔖깃주소를 참고해주세요!!
// 1) Json parser를 만들어 만들어진 문자열 데이터를 객체화 한다
JSONParser parser = new JSONParser();
JSONObject obj = (JSONObject) parser.parse(sb.toString());
// 2-1) Top레벨 단계인 response 키를 가지고 데이터를 파싱한다
JSONObject parse_response = (JSONObject) obj.get("response");
// 2-2) response 로 부터 body 찾아온다
JSONObject parse_body = (JSONObject) parse_response.get("body");
// 2-3) body 로 부터 items 받아온다
JSONObject parse_items = (JSONObject) parse_body.get("items");
// 2-4) items로 부터 itemlist 를 받아오기 itemlist : 뒤에 [ 로 시작하므로 jsonarray이다
JSONArray parse_item = (JSONArray) parse_items.get("item");
JSONObject info; // parse_item은 배열형태이기 때문에 하나씩 데이터를 하나씩 가져올때 사용한다
for (int i = 0; i < parse_item.size(); i++) {
info = (JSONObject) parse_item.get(i);
System.out.println(info.get("corpNm").toString());
}
📌 Json 파싱하기위한 과정
1. Top레벨 단계인 response 키를 가지고 데이터를 파싱한다
2. response > body > items 를 찾아온다
3. items로부터 itemList( [ ]로 쌓여져 있기 때문에 배열형태)를 받아온다
📌item리스트를 for문을 사용해 원하는 데이터를 responseDto에 담아 return
👀 포스트맨 결과
java에서 받아온 데이터값에서 원하는 정보만 추출하기 위헤 json파싱하는 부분이 어려웠다..
그래서 블로그와 공식문서를 얼마나 찾아봤던지,,,!!!!!
참조에 있는 json파싱 참고의 블로그에서 해답을 얻었다! ( + 로직에 대한 이해도 같이^-^)
늘 기록해주시는 개발자분들께 감사할 따름입니다 🙏!
📖 참조
- 공공데이터포털 - https://www.data.go.kr/index.do
- json파싱 참고1 - https://kingpodo.tistory.com/16
- json파싱 참고2 - https://fbtmdwhd33.tistory.com/264
'🎯 etc > API' 카테고리의 다른 글
[ Kakao API ] 개인화 메세지 (with. 카카오 모먼트) (0) | 2023.10.21 |
---|---|
[ kakaoMap API ] geolocation 사용 (0) | 2022.11.21 |
[ 공공기관 오픈API ] 금융위원회_기업기본정보 오픈API신청 (1) - JAVA (1) | 2022.11.18 |
[ Google vision Cloud OCR (3)] OCR / MultipartFile - JAVA ( + ❗❗ 트러블슈팅) (0) | 2022.11.18 |
[ Google vision Cloud OCR (2)] Google Storage 생성 - JAVA (0) | 2022.11.18 |
댓글