2023.01.30 - [공부 기록] - [SPRING RETRY] 바퀴를 다시 발명하지 마라 - @Retrayble을 활용한 재시도 전략
최근 한국의 공휴일 정보와 주말을 반영하여 영업일 N일 전, N일 후를 계산하는 기능 요구가 있었다.
찾아보니 공공데이터 포털에 공개 된 API로 한국천문연구원에서 제공하는 특일정보가 있었다.
구글링해보니 포스팅 된 블로그 중 파이썬 스크립트를 공개해주신 분이 있어서 줍줍하였고 이를 활용해 공공데이터 포털에서 공휴일 정보를 받아오고 여기에 추가로 주말을 포함하여 DB에 저장해뒀다.
이때 주말과 공휴일이 겹친다면 공휴일이 들어가도록 처리 했다.
하지만 특일정보는 현재로부터 최대 2년치만 제공하기 때문에 일정 기간마다 추가해줘야하는데다 대통령령으로 시행되는 대체공휴일과 같은 날을 반영하기 위해서는 사람이 직접 처리해줘야 했다.
때문에 이를 배치 프로그램을 통해 하루에 한번 최신화하도록 스케쥴링하였다.
이 과정에서 자바를 사용한 예제가 xml 로 받거나 또는 JSON을 String으로 처리하여 Map으로 뽑아내는 내용 밖에 없는것 같길래 바로 자바 클래스로 매핑해서 사용 할 수 있는 예제를 작성하려 한다.
영업일 계산을 위한 비영업일 정보 최신화가 비즈니스 상 꽤나 중요하기 때문에 여러 방어 코드를 작성해야하지만 이 글은 특일정보 API를 객체로 바로 받아 사용하기 위한 예제이기 때문에 다른 비즈니스 로직이나 운영상 고려해야 할 점들은 담지 않았다.
다른 OpenAPI 응답을 JSON으로 받아와 매핑할때도 비슷하게 활용이 가능할것이라 본다.
1. 데이터포털 활용 신청
2. 단위 테스트 주도 서비스 구현
3. 통합 테스트
순서로 설명하겠다.
1. 특일정보 사용 활용신청하기
https://www.data.go.kr/data/15012690/openapi.do
신청하는 방법은 설명하지 않겠다.
한국천문연구원에서 제공하는 방법 자체도 쉽고 간단하기 때문
우리의 관심사는 다른 잡절이나 국경일이 아닌 영업일 계산을 위한 공휴일이기 때문에 아래 경로로 요청을 보낼 것이다.
http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getHoliDeInfo?solYear=2023&solMonth=01&_type=json&ServiceKey=서비스키
json 타입으로 받기 위해 _type 쿼리스트링을 추가해 준다.
그리고 서비스키는 URL encoded 와 아닌 것 두 가지 경우를 제공하는데, 이는 URI Builder등을 이용 할 경우 Decode 상태의 URL을 넣어 encode 처리하고 문자열로 URL을 바로 넘길 경우엔 Encoded 처리 된 것을 사용하면 되겠다.
활용신청 하고 키를 실제 어플리케이션에서 사용하기까지는 30분에서 최대 3시간까지는 기다려야 하나보다.
신청 직후 바로 요청을 보내면 SERVICE_KEY_IS_NOT_REGISTERED_ERROR가 발생할 수 있다.
나도 처음엔 같은 에러가 났는데 글을 작성 중인 지금 curl 요청을 보내보면 정상 응답이 오고 있다.
응답의 형태는 아래와 같다.
{
"response": {
"header": {
"resultCode": "00",
"resultMsg": "NORMAL SERVICE."
},
"body": {
"items": {
"item": [
{
"dateKind": "01",
"dateName": "1월1일",
"isHoliday": "Y",
"locdate": 20230101,
"seq": 1
},
{
"dateKind": "01",
"dateName": "설날",
"isHoliday": "Y",
"locdate": 20230121,
"seq": 1
},
{
"dateKind": "01",
"dateName": "설날",
"isHoliday": "Y",
"locdate": 20230122,
"seq": 1
},
{
"dateKind": "01",
"dateName": "설날",
"isHoliday": "Y",
"locdate": 20230123,
"seq": 1
},
{
"dateKind": "01",
"dateName": "대체공휴일",
"isHoliday": "Y",
"locdate": 20230124,
"seq": 1
}
]
},
"numOfRows": 10,
"pageNo": 1,
"totalCount": 5
}
}
}
이제 이 응답을 받아 매핑해줄 응답과 서비스를 만들 예정이다.
그리고 해당 요청은 월별로 요청이 가능한데, 한달 내내 공휴일인 유토피아는 올 수 없으니 페이지네이션의 귀찮음을 벗어나기 위해 numOfRows 쿼리스트링을 추가해서 한번에 최대 30개 까지 받도록 하겠다. 기본값은 10이다.
http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getHoliDeInfo?solYear=2023&solMonth=01&_type=json&numOfRows=30&ServiceKey=서비스키
2023.02.15 - [공부 기록] - [JAVA x OPENAPI] 공공데이터포털 특일 정보 OpenAPI 사용하기 - 2 (JSON 응답을 JAVA 클래스로 받기 + 테스트)
'공부 기록' 카테고리의 다른 글
[JAVA x OPENAPI] 공공데이터포털 특일 정보 OpenAPI 사용하기 - 3 (통합 테스트) (0) | 2023.02.15 |
---|---|
[JAVA x OPENAPI] 공공데이터포털 특일 정보 OpenAPI 사용하기 - 2 (JSON 응답을 JAVA 클래스로 받기 + 테스트) (0) | 2023.02.15 |
[SPRING RETRY] 바퀴를 다시 발명하지 마라 - @Retrayble을 활용한 재시도 전략 (0) | 2023.01.30 |
[SPRING SECURITY] WebSecurityConfigurerAdapter Deprecated - 최신 설정 방법 (0) | 2022.11.12 |
[SPRING SECURITY]우아한 멀티 타입 빌더 (0) | 2022.10.09 |
댓글