문제 발생

플래시 세일 프로젝트의 MSA 환경에서 각 서비스 간 통신 시 FeignClient를 사용했지만, 각 서비스에서 발생한 커스텀 예외가 정상적으로 반환되지 않는 문제가 발생했습니다.

원인

FeignClient는 기본적으로 HTTP 상태 코드와 오류 메시지를 받아들이지만, 개별 서비스에서 정의한 예외를 직접적으로 반환할 수 없었습니다. 이로 인해 클라이언트 측에서 커스텀 예외 메시지가 전달되지 않고 기본적인 FeignClient 오류 처리만 이루어졌습니다.

해결 과정

이 문제를 해결하기 위해 FeignClient의 에러 디코더(ErrorDecoder)를 활용하여, 각 서비스에서 반환하는 커스텀 예외를 클라이언트에서 받을 수 있도록 처리했습니다. 에러 디코더는 서버로부터 받은 응답을 분석하고 적절한 예외를 클라이언트 측에서 던지도록 도와줍니다.

public class CustomErrorDecoder implements ErrorDecoder {

    @Override
    public Exception decode(String methodKey, Response response) {
        return switch (response.status()) {
            case 400 -> new CustomException(ClientErrorCode.BAD_REQUEST);
            case 403 -> new CustomException(ClientErrorCode.FORBIDDEN);
            case 404 -> new CustomException(ClientErrorCode.RESOURCE_NOT_FOUND);
            case 500 -> new CustomException(ClientErrorCode.INTERNAL_SERVER_ERROR);
            case 503 -> new CustomException(ClientErrorCode.SERVICE_UNAVAILABLE);
            case 507 -> new CustomException(ClientErrorCode.INSUFFICIENT_STOCK);
            default -> new CustomException(ClientErrorCode.UNEXPECTED_ERROR);
        };
    }
}

결과

서버 측 커스텀 예외를 클라이언트에서 받아 적절히 처리할 수 있게 됐습니다. 이를 통해 서비스 간 오류 처리에 일관성을 유지하고, 클라이언트에서 커스텀 예외 메시지를 보다 정확하게 전달받을 수 있게 되었습니다.