관리 메뉴

너와 나의 스토리

[SpringBoot] RestTemplate 통신 error handling 하기 - 쉬운 방법 / ResponseErrorHandler 정의하는 방법 본문

개발/Spring Boot

[SpringBoot] RestTemplate 통신 error handling 하기 - 쉬운 방법 / ResponseErrorHandler 정의하는 방법

노는게제일좋아! 2022. 6. 1. 20:19
반응형

상황

  • 먼저 다음과 같이 RestTemplate을 이용하여 통신하고 있다고 하자.
  • "https://server-url-to-send-user-info": 유저 정보를 관리하는 서버 url
  • 유저 서버로부터 사용자의 정보를 받아올 때 여러가지 예외가 발생할 수 있다.
public class RestApi {

    private RestTemplate restTemplate = new RestTemplate();

    public User getUser() {
        try {
            ResponseEntity<User> response = restTemplate.exchange(
                    "https://server-url-to-send-user-info",
                    HttpMethod.GET,
                    null,
                    User.class
            );
            return Objects.requireNonNull(response.getBody());
        } catch (RestClientException e) {
            // error log
        }
        return new User();
    }

    class User {
        public String name;
        public Integer age;
    }
}

 

 

Error Handling

방법 1

  • catch 문에서 예외 처리
    • 유저 서버로부터 4xx의 status code가 오면 HttpClientErrorException이 던져지고 해당 catch 문으로 들어가게 된다.
    • 여기서 status code를 확인하여 적절하게 예외를 던져주면 된다.
public User getUser() {
    try {
        ResponseEntity<User> response = restTemplate.exchange(
                "https://server-url-to-send-user-info",
                HttpMethod.GET,
                null,
                User.class
        );
        return Objects.requireNonNull(response.getBody());
    } catch (HttpClientErrorException e) {
        if (e.getStatusCode() == PRECONDITION_FAILED) {
            throw new CUSTOM_EXCEPTION(msg);
        } 
        throw e;
    }
    return new User();
}
  • HTTP status 별 exception
    • HttpClientErrorException: in the case of HTTP status 4xx
    • HttpServerErrorException: in the case of HTTP status 5xx
    • UnknownHttpStatusCodeException: in the case of an unknown HTTP status

 

방법 2

  • ResponseErrorHandler 구현
    • DefaultResponseErrorHandler를 extends하고, 다음과 같이 handlerError를 override하여 정의하면 된다.
    • DefaultResponseErrorHandler 대신 ResponseErrorHandler를 implements해서 사용해도 된다.
      • 하지만, 이 경우 hasError()와 handlerError를 모두 정의해야 한다.
    • 그리고 정의한 ResponseErrorHandler를 RestTemplate에 set 해주면 된다.
public class RestTemplateResponseErrorHandler extends DefaultResponseErrorHandler {

    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        if (response.getStatusCode() == HttpStatus.PRECONDITION_FAILED) {
            throw new CUSTOM_EXCEPTION(msg);
        }
    }
}
public class RestApi {

    private static RestTemplate restTemplate = new RestTemplate();

    static {
        restTemplate.setErrorHandler(new RestTemplateResponseErrorHandler());
    }

    public User getUser() {
        try {
            ResponseEntity<User> response = restTemplate.exchange(
                    "https://server-url-to-send-user-info",
                    HttpMethod.GET,
                    null,
                    User.class
            );
            return Objects.requireNonNull(response.getBody());
        } catch (HttpClientErrorException e) {
            throw e;
        }
    }

    class User {
        public String name;
        public Integer age;
    }
}

 

 

테스트 코드 작성하기

 

 

 

참고

- https://www.baeldung.com/spring-rest-template-error-handling

 

반응형
Comments