배경
서버간 데이터를 주고 받을 때 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();
}
}
다음에도 이런 실수를 하지 않게 잘 적용해봐야 겠군요...ㅎㅎ
'트러블 슈팅' 카테고리의 다른 글
gateway에서의 FeignClient 사용 (0) | 2024.12.18 |
---|---|
gateway에서 exchange를 사용하여 값을 전달할 때 주의점 (1) | 2024.12.18 |
gateway와 각 서버별 circuitbreaker 적용의 이해 (1) | 2024.12.18 |
@ModelAttribute 매핑 시 null값에 대한 이해 (0) | 2024.12.18 |
MSA 구성 시 데이터 정합성의 문제 (0) | 2024.12.18 |