programming/Spring

[Spring] xml 데이터 처리하기2 (코로나 OpenAPI)

LeeBorn 2020. 11. 23. 14:33
반응형

Spring Boot

 

[Spring] xml 데이터 처리하기

스프링에서 xml 처리를 위한 방법을 정리해본다. 1. build.gradle 파일을 작성한다. compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-xml', version: '2.11.3' 2. 아래 코드처럼..

leeborn.tistory.com

위 글에선 xml을 처리하는 기본적인 사용법만을 정리했다.

이번엔 실제 OpenAPI를 사용해서 처리하는 방법을 정리해본다.

 

OpenAPI는 공공데이터 포털에서 쉽게 구할 수 있다.

그중에서도 현재 써볼 만한 OpenAPI는 코로나 감염 현황 API가 있다.

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 

기본 정보는 아래와 같다.

공공데이터 포털 코로나 감염현황

데이터 포맷을 보면 코로나 API는 XML로 되어있다.

 

해당 API는 신청만 하면 바로 쓸 수 있다.

신청 후 호출해보면 아래와 같이 XML 데이터를 응답한다.

OpenAPM 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;
}

 

온통 코드만 써있어서 제대로 정리한지 모르겠지만, 현재 프로젝트에선 잘되고 있다.

조만간 실행가능한 프로젝트로 업데이트 할 예정이다.

반응형