SpringBoot-개인공부(1)_scheduler+openAPI수신하여 DB넣기

개미는뚠뚠·2023년 6월 28일
0

SpringBoot

목록 보기
2/3
post-thumbnail

정해진 시간에 API를 호출하여 DB에 데이터를 적재하는 작업을 회사에서 많이 사용하였다. 보통 기상청 날씨 데이터를 통해 실시간 날씨 정보를 표출하거나, 설치한 센서 데이터를 하루마다 갱신해주는데 이때 사용하는 것이 바로 scheduler이다. 오늘 포스팅하는 내용은 scheduler를 통해 내가 원하는 시간대에 openAPI를 호출하고, 수신 받은 데이터를 DB에 넣어주는 작업이다.


scheduler

일단 scheduler를 공부하면서 작성한 코드이다.

위의 사진에서 보면 @scheduled 라는 어노테이션을 활용하였다. 해당 어노테이션을 선언하고, 우측에 보면 cron, fixedDelay 라는 글자들이 보일 것이다. 실제 시간대를 설정하는 부분이며 상황에 맞춰서 사용을 해주면 될 거 같다. 아래는 상세 설정에 대한 내용을 간단히 정리하였다.

Scheduled 속성

  1. fixedDelay : milliseconds 단위로, 작업을 마친 후부터 주기 타이머가 돌아 메소드를 호출하는 것
  2. fixedRate : milliseconds 단위로, 작업 수행시간과 상관없이 일정 주기마다 메소드를 호출하는 것
  3. initialDelay : 스케줄러에서 메소드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것
  4. cron : Cron 표현식을 사용하여 작업시간을 설정하는 것

Cron표현식은 조금 더 설명이 필요할 거 같아서 추가로 정리하였다.

cron의 설정

//cron의 형태 
@Scheduled(cron = "* * * * * *")

cron 기본적인 설정은 위와 같이 6개의 (*)이 존재하는데

  • 전체적인 설정은 : (*)순서대로 초(0-59), 분(0-59), 시간(0-23), 일(1-31), 월(1-12), 요일(0-6) 이다.
  • 6번의 요일 설정은 (0: 일, 1: 월, 2:화, 3:수, 4:목, 5:금, 6:토) 순서이다.
  • 참고로 Spring @Scheduled cron은 6자리 설정만 허용하며 연도 설정을 할 수 없다.

cron 표현식 종류

위에서는 모든 대표적인 예시로 *을 사용하였지만 다양하게 활용할 수 있다.

  • '*' : 모든 조건(매시, 매일, 매주처럼 사용)을 의미
  • '?' : 설정 값 없음 (날짜와 요일에서만 사용 가능)
  • '-' : 범위를 지정할 때
  • ',' : 여러 값을 지정할 때
  • '/' : 증분값, 즉 초기값과 증가치 설정에 사용
  • 'L' : 마지막 - 지정할 수 있는 범위의 마지막 값 설정 시 사용 (날짜와 요일에서만 사용 가능)
  • 'W' : 가장 가까운 평일(weekday)을 설정할 때
  • 'zone' : 특정 국가의 시간대, 아무 설정도 주지 않았을 경우는 local_time을 따라간다.

openAPI 수신하여 DB에 저장하기

위에서 scheduler에 대한 설명은 어느정도 했으니 이제 특정 시간대에 api를 호출하여 DB에 데이터를 적재하는 과정이다.

나는 일단 공공데이터포털(https://www.data.go.kr/index.do)의 openAPI를 활용하였다. 이곳에는 제공해주는 정말 많은 데이터가 있었고, 나는 그중에서 우리 동네 의류수거함 위치를 제공해주는 데이터를 사용하였다.

해당 사이트 이용방법은 따로 서술하지는 않을 것이고, 나는 일단 serviceKey를 발급 받아서 postman을 통해 데이터를 확인하였다. 이제 실제 코드로 api를 호출하고, 그것을 DB로 넘겨주는 작업이다.

Controller

  1. 먼저 URL에 String 변수로 지정한 URL과 쿼리스트링 방식으로 요청방식을 넘겨준다.
  2. 이후 HttpURLConnection을 통한 api호출이 이루어진다.
  3. rescode(응답 상태코드) 또는 responseMessage(응답 메세지) 변수에 담긴 결과값에 따라 로직을 수행한다.
  4. 요청이 정상이면, 이후 while문을 통해 결과값들을 string형태로 저장하고, 나는 그것을 또 Map<String, Object> 형태로 변환해주었다.
  5. 이후 vo를 호출하여, MAP 데이터를 객체로 저장하였고, 그것들을 DB로 해당 객체를 전달해주었다.

vo

service

serviceImpl

mapper

mapper.xml

이렇게 모든 로직구현이 끝났고, DBeaver를 통해 확인한 결과는?!

정상적으로 모든 데이터가 DB에 저장이 되었다🎉🎉🎉
이상으로 포스팅을 마치며, 앞으로도 여러가지 기능구현을 개인공부 카테고리로 진행해볼 생각이다. 화이탱🔥

0개의 댓글