-
[Spring] xml 데이터 처리하기2 (코로나 OpenAPI)programming/Spring 2020. 11. 23. 14:33반응형
위 글에선 xml을 처리하는 기본적인 사용법만을 정리했다.
이번엔 실제 OpenAPI를 사용해서 처리하는 방법을 정리해본다.
OpenAPI는 공공데이터 포털에서 쉽게 구할 수 있다.
그중에서도 현재 써볼 만한 OpenAPI는 코로나 감염 현황 API가 있다.
기본 정보는 아래와 같다.
데이터 포맷을 보면 코로나 API는 XML로 되어있다.
해당 API는 신청만 하면 바로 쓸 수 있다.
신청 후 호출해보면 아래와 같이 XML 데이터를 응답한다.
먼저 XML 데이터의 구조를 살펴보면 아래와 같다.
<response> <header> <resultCode>00</resultCode> <resultMsg>NORMAL SERVICE.</resultMsg> </header> <body> <items> <item> <accDefRate>1.0765147585</accDefRate> <accExamCnt>2908890</accExamCnt> <accExamCompCnt>2854861</accExamCompCnt> <careCnt>3762</careCnt> <clearCnt>26466</clearCnt> <createDt>2020-11-22 09:35:12.388</createDt> <deathCnt>505</deathCnt> <decideCnt>30733</decideCnt> <examCnt>54029</examCnt> <resutlNegCnt>2824128</resutlNegCnt> <seq>330</seq> <stateDt>20201122</stateDt> <stateTime>00:00</stateTime> <updateDt>null</updateDt> </item> </items> </body> </response>
가장 최상위에 response가 존재하고, 하위에 각각 header, body 가 존재한다.
header는 resultCode와, resultMsg로 이루어져 있고,
body는 item를 리스트로 가진 items로 이루어져 있다.
해당 xml을 처리하기 위해 클래스를 작성하면 이렇게 작성할 수 있다.
먼저 Response.
@Data public class Response { public Header header; public Body body; }
그리고 Header와 Body
@Data public class Header { public String resultCode; public String resultMsg; }
@Data public class Body { public List<Item> items; public int numOfRows; public int pageNo; public int totalCount; }
Body에 Item은 아래처럼 만들 수 있다.
@Data public class Item { public double accDefRate; public int accExamCnt; public int accExamCompCnt; public int careCnt; public int clearCnt; public String createDt; public int deathCnt; public int decideCnt; public int examCnt; public int resutlNegCnt; public int seq; public int stateDt; public String stateTime; public String updateDt; }
Xml의 Items는 Java의 List <Item>의 형식으로 처리할 수 있다.
해당 API를 호출하는 부분부터 살펴본다면,
public ResponseEntity<String> get(String url) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<HttpHeaders> entity = new HttpEntity<>(headers); ResponseEntity<String> response = restTemplate.exchange(URI.create(url), HttpMethod.GET, entity, String.class); return response; }
여기서 url은 "openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson?serviceKey=신청한_서비스_키_입력_필수&startCreateDt=검색_시작_날짜_필수_아님&endCreateDt=검색_마지막_날짜_필수_아님" 의 형식이다.
return이 ResponseEntity <String>의 형식인데, XML to Class로 처리하기 위해서 String데이터가 필요한데,
response.getBody()로 String XML 데이터를 가져올 수 있다.
해당 xml데이터로 아래처럼 호출하면 Java로 데이터를 처리할 수 있다.
public Response parser(String xml) { ObjectMapper xmlMapper = new XmlMapper(); Response response = null; try { response = xmlMapper.readValue(xml, Response.class); } catch (JsonMappingException e) { e.printStackTrace(); } catch (JsonProcessingException e) { e.printStackTrace(); } return response; }
온통 코드만 써있어서 제대로 정리한지 모르겠지만, 현재 프로젝트에선 잘되고 있다.
조만간 실행가능한 프로젝트로 업데이트 할 예정이다.
반응형'programming > Spring' 카테고리의 다른 글
[Spring] @PathVariable 기본값 설정하기 (1) 2020.12.06 [Spring] 코로나 감염 현황 OpenApi 사용하기 (0) 2020.11.25 [Spring] xml 데이터 처리하기 (0) 2020.11.09 [Spring Boot] application.yml의 리스트 값 사용하기 (0) 2020.10.07 [Spring Boot] VS Code @RunWith가 나타나지 않을 때 (0) 2020.08.19