-
스프링 restTemplate + JAXB + 공공데이터 API로 공휴일 정보 받기IT, 프로그래밍/Spring 2018. 10. 3. 18:14
서비스를 만들다보면 평일과 휴일로 나누어 정보를 제공해야 하는 경우가 있습니다.
예를 들면 운영시간표가 주말과 평일이 다르거나 하는 경우에 나눠 줄 필요가 있는데, 주말 같은 경우는 Java에서 제공해 주는 Date 관련 클래스로 간단하게 처리를 하면 되지만 공휴일 같은 경우는 제공해 주지 않습니다.
한국에 있는 공휴일은 현재 공공데이터 API를 통해서 받아볼 수 있으니 활용 해 봅시다.
https://www.data.go.kr/dataset/15012690/openapi.do
만약 안나오시는 분들은 공공데이터 api 페이지로 가셔서 '특일 정보'라고 검색하시면 나옵니다.
가운데 보시면 상세기능이 있습니다. 여기서 공휴일 정보를 클릭 해 줍시다
여기에 보시면 활용신청이 있는데요. 공공데이터 api 서비스 활용신청은 IE만을 지원하니까 IE로 다시 접속해서 로그인 해 줍니다. 그리고 활용신청 해 주세요.
하단부를 보시면 요청 파라미터를 정리해 놓은 곳이 있습니다. 보다시피 매우 심플합니다.
이제 스프링 Service에서 api요청을 하는 로직을 작성 해 봅시다.
요청은 아까 받은 serviceKey와 년, 월을 쿼리로 전달하여 요청하면 됩니다.
String type으로 URL을 작성하면, getForObject 메소드가 호출될 때 내부적으로 인코딩 되는 현상이 발생하므로 URI로 선언하여 사용합니다.
RestTemplate는 JAXB를 사용하여 Xml Document의 Elements를 자바 객체로 사용할 수 있게 지원 해 줍니다.
for문을 돌면서 1월부터 12월까지의 공휴일 정보를 받아 올 계획입니다.
한 자리수의 월은 앞에 0을 붙여서 02, 03.. 이런식으로 요청 해야 하니 유의하시기 바랍니다.
Xml에 매핑할 도메인 클래스를 작성해 줍시다.
우선 브라우저에서 확인한 응답 데이터입니다.
response -header -body
- items - item - item - item이런식으로 구성된 Xml 형식인 것을 알 수 있습니다.
그럼 차례대로 최상위 부모 노드인 response에 매핑되는 클래스부터 만들어 봅시다.
@XmlRootElement 어노테이션을 선언 해 주면서 이 클래스가 매핑 되는 노드를 선언 해 줍니다. 현재 response 노드를 기준으로 도메인을 작성하고 있으니, Root Element를 response로 선언해 주어야 합니다.
두 번째로 body 노드를 표현하는 도메인을 작성 해 주는데요.
body안에는 item를 여러개 포함하는 List인 items가 존재합니다.
현재 item을 감싸고 있는 태그는 items라는 것을 @XmlElementWrapper 어노테이션으로 알려줍니다. 그리고 그 안에있는 태그의 정보도 알려주어야 합니다.
getter 메소드 위에 적어줍니다.
item을 표현하는 도메인 입니다.
만약 자식 태그의 이름과 다르게 필드명을 선언하고 싶으면, 필드명위에 name 속성을 정의 해 주어야 합니다.
@XmlElement(name="xml에 선언된 이름") private String 내가정한필드;
이런식으로 사용하시면 됩니다.
결과를 보시면 잘 나오는 것을 확인할 수 있습니다.
이제 이 데이터를 가공하여 DB에 저장하여 활용하거나 필요할 때 요청하여 처리하면 됩니다.
JAXB로 처리하는 방법 말고도 String으로 결과를 받아 DOM Object를 사용하여 처리하는 방식도 있으니 편하신대로 파싱하면 됩니다.
'IT, 프로그래밍 > Spring' 카테고리의 다른 글
Junit 으로 세션 테스트시 발생하는 오류 해결 (0) 2019.02.12 Spring Tiles 설정 (0) 2018.10.17 Spring 스케쥴러 사용하기 (0) 2018.10.02 cvc-elt.1: Cannot find the declaration of element 'beans' .. (7) 2018.09.16 Spring-MongoDB 연동 중 유의사항 (0) 2018.09.14