Spring/Spring

[Spring] feign + hystrix 사용 시 특정 예외 무시하도록 처리하기

2023. 5. 15. 23:29
목차
  1. 1. 개요
  2. 2. 해결
  3. 3. 참고

1. 개요

서비스 중에 일부분에서 외부 API에 요청을 날리고, boolean 타입의 응답을 받는 로직이 포함되어 있었다. 만약 true이면 특별 유저로 간주하고 프론트에서 다른 화면을 보여주는 구성이었다. 간헐적으로 404 에러가 내려오는 케이스가 있었는데, 이 경우엔 fallback 메서드를 통해 false로 처리해두었다.

 

트래픽이 몰리자 클라이언트에서 전달받은 유저ID에 대해 유저 데이터가 없는 케이스가 늘어났고, 서킷 브레이커가 열리게 되었다. 때문에 기본 응답으로 false가 내려가면서 특별 유저라 하더라도 일반 유저가 보는 화면을 보게 되었다.

 

hystrix는 resilience4j와 다르게 특정 예외를 골라서 무시할 수 있는 옵션이 없어서 상당히 애를 먹었다. resilience4j는 다음과 같은 옵션으로 간단하게 특정 예외를 무시할 수 있다.

recordExceptionsAsSuccess:
    - org.springframework.web.client.HttpClientErrorException

 

물론 @HystrixCommand를 쓰는 방법이 있긴 한데, feign client에서 붙여쓰는 방법엔 적절하지 않다. @HystrixCommand를 통해 핸들링하기 전에 feign client 내부적으로 예외를 던져버린다.

@HystrixCommand(ignoreExceptions = { BaseException.class, MissingServletRequestParameterException.class, TypeMismatchException.class })

 

 

2. 해결

몇 시간의 삽질 후 찾아낸 방법은 HystrixBadRequestException을 이용하는 것이었다. HystrixBadRequestException은 hystrix 내에서 fallback이나 서킷 브레이커를 발동시키지 않는 특별한 예외다.

 

 ErrorDecoder를 작성해서 404 케이스에 대해서는 HystrixBadRequestException이 떨어지도록 한다. 이때 client에 꼭 Configuration을 적용해주자.

// MemberClientConfig

@Bean
fun errorDecoder() =
    object : ErrorDecoder {
        private val errorDecoder: ErrorDecoder = ErrorDecoder.Default()
        override fun decode(methodKey: String?, response: Response): Exception {
            if (HttpStatus.resolve(response.status()) == HttpStatus.NOT_FOUND) {
                HystrixBadRequestException("Member API 404 Error")
            }
            return errorDecoder.decode(methodKey, response)
        }
    }
@ReactiveFeignClient(
    ...
    configuration = [MemberClientConfig::class]
)
interface MemberClient {
    ...
}

 

마지막으로 서비스에서 HystrixBadRequestException을 캐치하면 된다. 여기선 간단하게 작성했지만, 실제로는 HystrixBadRequestException을 그대로 쓰기 보다는 상속해서 별도의 커스텀 예외를 정의해주는 것이 좋다.

suspend fun isSpecialMember(memberId: Long): Boolean {
    return try {
        memberClient.isSpecialMember(custNo).awaitFirstOrNull()
    } catch (e: HystrixBadRequestException) {
        // fallback 대신 수행할 로직 정의
        false
    }
}

 

 

3. 참고

  • https://netflix.github.io/Hystrix/javadoc/com/netflix/hystrix/exception/HystrixBadRequestException.html
  • https://stackoverflow.com/questions/44247070/how-to-say-hystrix-not-to-trigger-fallback-for-some-of-the-exceptions-in-hystrix
  • https://github.com/resilience4j/resilience4j/issues/568
저작자표시 비영리 (새창열림)

'Spring > Spring' 카테고리의 다른 글

[Spring] 스프링의 테스트 컨텍스트 캐싱(Spring TestContext Caching)에 대해 알아보자  (0) 2023.07.17
[Spring] @ContextConfiguration이란?  (0) 2023.07.16
[Spring] Reactive Feign에서 커스텀 Serializer/Deserializer 사용하기  (0) 2023.03.21
[Spring] @Bean 애너테이션의 name 속성과 value 속성  (0) 2023.03.07
[Spring] 빈 중복 시 해결방법(@Autowired, @Qualifier, @Primary)  (0) 2022.12.19
  1. 1. 개요
  2. 2. 해결
  3. 3. 참고
'Spring/Spring' 카테고리의 다른 글
  • [Spring] 스프링의 테스트 컨텍스트 캐싱(Spring TestContext Caching)에 대해 알아보자
  • [Spring] @ContextConfiguration이란?
  • [Spring] Reactive Feign에서 커스텀 Serializer/Deserializer 사용하기
  • [Spring] @Bean 애너테이션의 name 속성과 value 속성
코택
코택
TaxFree코택 님의 블로그입니다.
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • 파이썬
  • http
  • 브루트포스
  • 장고
  • dp
  • 그래프 탐색
  • 깊이 우선 탐색
  • Shortest Path
  • atdd
  • fastapi
  • Git
  • mysql
  • BOJ
  • 백준
  • 그래프

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[Spring] feign + hystrix 사용 시 특정 예외 무시하도록 처리하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.