최대 1 분 소요

이번에는 ErrorDecoder를 이용한 예외 처리를 해보자.

user-service

FeignErrorDecoder.java

public class FeignErrorDecoder implements ErrorDecoder {

    @Override
    public Exception decode(String methodKey, Response response) {
        switch (response.status()) {
            case 400:
                break;
            case 404:
                if(methodKey.contains("getOrders")) {
                    return new ResponseStatusException(HttpStatus.valueOf(response.status()),
                        env.getProperty("order-service.exception.order-is-empty"));
                }
                break;
            default:
                return new Exception(response.reason());
        }
        return null;
    }
}

UserServiceImpl.java

UserServiceImpl에서는 try-catch 문을 제거한다.

@Service
@Slf4j
public class UserServiceImpl implements UserService {
    ...
    @Override
    public UserDto getUserByUserId(String userId) {

        UserEntity userEntity = userRepository.findByUserId(userId);
        UserDto userDto = new ModelMapper().map(userEntity, UserDto.class);

        // 주문 생성
        /* Using Feign ErrorDecoder */
        List<ResponseOrder> orderList = orderServiceClient.getOrders(userId);

        userDto.setOrders(orderList);

        return userDto;
    }
}

native-file-repo/user-service.yml

order-service.exception.order-is-empty에 404 에러가 발생했을 때 보여질 문구를 정의한다.

...
order-service:
  url: http://ORDER-SERVICE/order-service/%s/orders
  exception:
    order-is-empty: User's order is empty.

테스트

user-service에서 break point를 찍고 디버깅모드로 실행한다.
스크린샷 2022-10-08 오후 9 28 11
위와 같이 설정 파일에서 정보를 잘 읽어왔음을 확인할 수 있다.

스크린샷 2022-10-08 오후 9 25 11
포스트맨으로 테스트 했을 때, 404 에러가 발생하고 에러 메시지가 잘 출력된다.



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기