본문 바로가기
🎯 etc/API

[ 공공기관 오픈API ] 금융위원회_기업기본정보 오픈API 사용 및 Json 파싱 (2) - JAVA

by 깸뽀 2022. 11. 19.
728x90
🍃   spring boot-version '2.7.5'
🌎    java-version 11
🐘   gradle
📁   공공데이터오픈API

 

✍  명함관리 서비스 프로젝트를 만들면서 사용자가 명함을 등록할 때 기업을 검색하여 선택할 수 있도록 하는 기능을 구현하기 위해 기업정보가 필요했기에 공공데이터API에서 기업정보를 가져오기로 결정!

공공데이터는 개발자라면 꼭 알고있기도하고, 꼭 한번 사용해보고싶은 기능이였기에 시도해봤다

 

 

 

👉 공공데이터 오픈API신청 방법 : https://bkyungkeem.tistory.com/43

 

[ 공공기관 오픈API ] 금융위원회_기업기본정보 오픈API신청 (1) - JAVA

📌 1. 공공데이터 포털에서 오픈API 신청 ✔ 회원가입 후 사용가능 👉 https://www.data.go.kr/index.do 공공데이터 포털 국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에

bkyungkeem.tistory.com

 

🔖 깃허브 주소 https://github.com/kimbokyung1220/publicOpenAPI/tree/main

 

GitHub - kimbokyung1220/publicOpenAPI: 공공데이터 오픈API 사용법 (금융위원회_기업기본정보)

공공데이터 오픈API 사용법 (금융위원회_기업기본정보). Contribute to kimbokyung1220/publicOpenAPI development by creating an account on GitHub.

github.com

+) 공공데이터를 받아 json으로 파싱하여 사용하여 원하는 결과값을 가져올 수 있도록 구현했습니다!

 

📌 공공데이터를 사용해봅시다 !

1. 인증키 확인

✔ 일반인증키(Encoding/Decoding) 둘다 사용가능

✔ 일반인증키(Encoding/Decoding) 둘다 사용가능

💡 API 환경 또는 API 호출 조건에 따라 인증키가 적용되는 방식이 다를 수 있습니다.
    포털에서 제공되는 Encoding/Decoding된 인증키를 적용하면서 구동되는 키를 사용하시기 바랍니다.

 

 

 

✔ 데이터명 옆에 [ 상세설명 ] 버튼 클릭 후 참고문서 다운로드 후 확인하여 필수값과 옵션값 확인.

✔ 필수:1 / 옵션: 0

👉 https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15043184 

 

금융위원회_기업기본정보

기업개요, 계열회사, 연결대상종속기업을 제공

www.data.go.kr

 

 

 

 

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파싱 참고의 블로그에서 해답을 얻었다! ( + 로직에 대한 이해도 같이^-^)

늘 기록해주시는 개발자분들께 감사할 따름입니다 🙏!

 

 

 

 

📖 참조

728x90

댓글