[Spring] xml 데이터 처리하기2 (코로나 OpenAPI)
위 글에선 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;
}
온통 코드만 써있어서 제대로 정리한지 모르겠지만, 현재 프로젝트에선 잘되고 있다.
조만간 실행가능한 프로젝트로 업데이트 할 예정이다.