기상청 초단기실황조회 서비스 Ver.2

HU·2021년 11월 24일
0

공공 API 연동

목록 보기
2/2

이전에 리뷰했던 초단기실황조회에 이어서 진행

기존 소스에 XML 형태로 받을 수 있도록 수정

URI uri = new URI(urlBuilder.toString());

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<ApiResponse> responseEntity = restTemplate.getForEntity(uri, ApiResponse.class);

return responseEntity.getBody();

↓ ↓
URI uri = new URI(urlBuilder.toString());

RestTemplate restTemplate = new RestTemplate();

if ( areaVo.getDataType().equalsIgnoreCase("XML") ){
    ResponseEntity<String> apiResponseEntity = restTemplate.getForEntity(uri, String.class); // api 연동한 response 값을 String 타입으로 받아옴.
    String responseEntityString = apiResponseEntity.getBody(); // String 타입의 response

        // JAXB에서 제공하는 언마샬링 메소드
        JAXBContext jaxbContext = JAXBContext.newInstance(Response.class); // Response 타입으로 변경
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        // unmarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        // 입력 -> 출력
        Response response = (Response) unmarshaller.unmarshal(new StringReader(responseEntityString));
        ApiResponse apiResponse = new ApiResponse();
        apiResponse.setResponse(response);
        
        return apiResponse;
    }

    ResponseEntity<ApiResponse> apiResponseEntity = restTemplate.getForEntity(uri, ApiResponse.class);

    return apiResponseEntity.getBody();
}

무엇이 바뀌었는가?

  • 두 번째 코드는 JSON 타입으로만 받을 수 있던 것을 API 연동 시 Object 타입의 결과 값을 String 타입으로 받아 XML 타입으로 변경할 수 있도록 조건문을 추가했다.

주의깊게 보았던 부분

1. API 연동 결과 값을 XML 형태료 변경

ResponseEntity<String> apiResponseEntity = restTemplate.getForEntity(uri, String.class); // api 연동한 response 값을 String 타입으로 받아옴.
String responseEntityString = apiResponseEntity.getBody(); // String 타입의 response

// JAXB에서 제공하는 언마샬링 메소드
JAXBContext jaxbContext = JAXBContext.newInstance(Response.class); // Response 타입으로 변경
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
// unmarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

// 입력 -> 출력
Response response = (Response) unmarshaller.unmarshal(new StringReader(responseEntityString));
  1. getForEntity를 통해 해당 uri에 대한 결과 api 연동 결과 값을 받지만, JSON 형태로 받을 수는 있어도 XML 형태로 받는 것은 지원해주지 않다보니 우선 Object를 String 타입으로 받는다.

  2. JAXBContext, unmarshall를 이용해서 XML 형태로 변경한다.


2. 반환 타입

public ApiResponse weatherResponse(final AreaVo areaVo) throws Exception {
    ···
    if ( areaVo.getDataType().equalsIgnoreCase("XML") ) {
        ···
        Response response = (Response) unmarshaller.unmarshal(new StringReader(responseEntityString));

        ApiResponse apiResponse = new ApiResponse();
        apiResponse.setResponse(response);

        return apiResponse;
    }
    ···
}

unmarshall한 Response 타입의 결과 값을 반환하려고 하니 메소드의 반환 타입과 맞지 않았다.

@Data
public class ApiResponse
{
    private Response response;
}

그래서 ApiResponse 클래스가 VO이기 때문에 새로 객체를 생성해서 그 안에 Response 값을 담아 ApiResponse 타입으로 반환하는 것으로 해결했다.

profile
지식 쌓기

0개의 댓글