본문 바로가기

트러블 슈팅

RestTemplate 사용시 주의점(4xx, 5xx 응답 반환)

배경


서버간 데이터를 주고 받을 때 RestTemplate을 사용하는 경우가 있었습니다. 이떄 exchange를 통해 HttpStatus 코드를 Bad_Request로해서 body에 응답 메시지를 함께 넣어주는 테스트를 진행하였습니다. 당연히 이 응답 결과를 잘 받을 줄 알았는데 데이터를 출력되지 않고 예외가 발생했습니다. 도대체 뭐지?

 

내용


RestTemplate은 기본적으로 HttpClientErrorException을 던집니다. 이 때문에 예외가 발생하고, 응답 본문을 정상적으로 읽을 수 없게 됩니다. 요청한 서버에 응답이 되돌아 갔을 때 따로 예외 처리를 해주지 않으면, 400응답으로 넘어온 body부분의 내용을 확인하지 못하는거죠. 예를 들어서 이런식으로 작성을 해야합니다.

 

public class MyService {

    private final RestTemplate restTemplate;

    public MyService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public void callExternalService() {
        String url = "http://example.com/api/resource";

        HttpHeaders headers = new HttpHeaders();
        headers.set("Content-Type", "application/json");
        HttpEntity<String> requestEntity = new HttpEntity<>(null, headers);
        
        try {
            ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class);
            // 성공적인 응답 처리
            System.out.println("Response: " + response.getBody());
        } catch (HttpClientErrorException e) {
            // 오류 응답 처리
            System.out.println("Error Status Code: " + e.getStatusCode());
            System.out.println("Error Response Body: " + e.getResponseBodyAsString());
        } catch (Exception e) {
            // 기타 예외 처리
            e.printStackTrace();
        }
    }

 

다음에도 이런 실수를 하지 않게 잘 적용해봐야 겠군요...ㅎㅎ