ABOUT ME

-

  • [Java] 공공데이터포털 Open API 파싱, JPA
    Code 2024. 8. 8. 00:02

        개발 중에 공공데이터포털 Open API 서비스를 연결해서 사용할 일이 있어서 자료 찾아보고 코드 작성한 김에 정리! 아무래도 개인 프로젝트 하거나 하면 종종 활용할 일이 있지 않을까 싶다.

     

    1. 공공데이터포털에서 필요한 Open API 활용 신청

    공공데이터포털: https://www.data.go.kr/

     

    2. 활용 신청하고 정보 확인

    마이페이지에서 다음과 같이 인증키를 확인할 수 있다.

    • API 상세 페이지에서 작동하는 인증키(본인은 웹 페이지 내에서는 Decoding, 개발 환경에서는 Encoding 인증키가 작동했다.) 입력하고 실행하면 결과 json 값을 확인할 수 있다.
    • 코드목록의 경우 [참고문서 - 코드 정의서]에서 상세 내용을 확인할 수 있다.

    3. 자료 활용

        본인의 경우에는 다음과 같이 활용하였다. 지금은 수동으로 호출해야 하는 상태긴 한데, 후에 배치 작업을 추가하면 좀 더 편하고 실시간으로 내용을 반영할 수 있을 것 같다! 스프링에서는 스케줄러라고 하나(..) 아무튼

    • 해당 API 데이터를 JSON으로 받아오는 클래스를 생성
    • Service단에서 이미 세팅해놓은 객체 엔티티에 가공해서 DB에 save
    • Controller에서 Post 호출해서 서비스 호출

    RecruitAPI

    public class RecruitAPI {
    
        public JSONObject getRecruitData() throws Exception {
            StringBuilder urlBuilder = new StringBuilder("API BASE URL/활용하는 REST API");
            urlBuilder.append("?" + URLEncoder.encode("ServiceKey", "UTF-8") + "인증키 입력");
            // 불러오는 데이터 개수 지정
            urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode("10", "UTF-8"));
            urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode("2", "UTF-8"));
            // 필수 입력 조건 추가
            // json 형식으로 받아옴
            urlBuilder.append("&" + URLEncoder.encode("resultType", "UTF-8") + "=" + URLEncoder.encode("json", "UTF-8"));
            URL url = new URL(urlBuilder.toString());
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Content-type", "application/json");
    //      System.out.println("Response code: " + conn.getResponseCode());
    
            BufferedReader rd;
            if (conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
                rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            } else {
                rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
            }
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = rd.readLine()) != null) {
                sb.append(line);
            }
            rd.close();
            conn.disconnect();
    //            System.out.println(sb.toString());
            return new JSONObject(sb.toString());
        }
    }

     

    RecruitService

    public void saveRecruit() {
            RecruitAPI recruitAPI = new RecruitAPI();
            // String으로 들어오는 날짜 데이터를 파싱
            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
    
            try {
                JSONObject jsonResponse = recruitAPI.getRecruitData();
                // JSON 객체 받아줌
                JSONArray items = jsonResponse.getJSONArray("result");
    
                for (int i = 0; i < items.length(); i++) {
                    JSONObject item = items.getJSONObject(i);
                    Recruit recruit = new Recruit();
                    //필요한 칼럼만 set
                    recruit.setRecruitClass(item.getString("hireTypeNmLst"));
                    recruit.setRecruitCategory(item.getString("ncsCdNmLst"));
                    recruit.setCompany(item.getString("instNm"));
                    recruit.setArea(item.getString("workRgnNmLst"));
                    recruit.setCareer(item.getString("recrutSeNm"));
                    
                    // String으로 들어오는 날짜 데이터를 파싱
                    String pbancBgngYmd = item.getString("pbancBgngYmd");
                    LocalDate startDate = LocalDate.parse(pbancBgngYmd, dateFormatter);
                    LocalDateTime startDateTime = startDate.atStartOfDay();
                    recruit.setStartDate(startDateTime);
                    String pbancEndYmd = item.getString("pbancEndYmd");
                    LocalDate endDate = LocalDate.parse(pbancEndYmd, dateFormatter);
                    LocalDateTime endDateTime = endDate.atStartOfDay();
                    recruit.setEndDate(endDateTime);
                    
                    recruit.setSerialNumber(item.getString("pbadmsStdInstCd"));
                    recruit.setUrl(item.getString("srcUrl"));
                    recruitRepository.save(recruit);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

     

    RecruitController

    @PostMapping("/parse")
        @Operation(summary = "공고 API 데이터 등록")
        public ResponseEntity<Void> enroll() {
    
            recruitService.saveRecruit();
    
            return ResponseEntity.status(HttpStatus.CREATED).build();
        }

     

    4. 결과 확인

    swagger: save 결과 확인
    db 저장 확인

    5. 참고한 자료

     

    [Spring MVC 프로젝트 - 기상 예보 API 사용하기] 공공데이터 API로 기상 예보 정보 가져오기

    Spring MVC ProjectEclipse 4.28jdk 11MySQL<font style="color:- <font style="color:드디어 MySQL 연동 성공으로 예약 정보를 가져올 수 있는 것을 확인했다.아직 디테일하게 들어가면 수정할 것들이

    velog.io

     

     

    공공데이터 파싱하기(한국관광공사 API, JAVA, JPA)

    안녕하세요. 오랜만에 블로그에 들어왔네요. 오늘 포스팅은 공공데이터 파싱에 관한 것입니다. 사실, 이 프로젝트를 시작했을 때, 이번에는 그냥 가데이터로 진행해야지 생각했었지만.. 제대로

    doohee94.tistory.com

    감사합니다..따봉🙇‍♀️