https://danden.tistory.com/167
[Spring] open feign 테스트 코드
개발에 관심이 많으신 분들이라면 openfieng 들어보셨을 것이라고 생각합니다. 저도 최근에 관심이 생겨서 사내 프로젝트에 적용을 해보고 있습니다.configuration을 이용해 retry,5xx 에러가 발생하면 r
danden.tistory.com
에서 feign을 사용했었고, open feign 에서 공식적으로 http interface로 마이그레이션 하는 것을 권장한다고 했었습니다.
그래서 이번에는 http interface를 이용해서 간단한 프로젝트 구현하고 테스트 해보겠습니다.
가정 상황
다른 팀에서 데이터를 가져오고 이를 가공하는 로직이 필요합니다.
이 때, 팀은 계속 추가될 수 있습니다. 또한 http, gRPC 등 다양한 통신 방법을 이용하여 데이터를 제공할 수 있습니다.
현재는 A 팀만 있고, 이 팀에서 데이터를 http로 데이터를 가져온다고 가정해보겠습니다.
패키지 구조 및 코드
패키지 구조는 우선 헥사고날 아키텍처를 이용하겠습니다.

패키지 구조는 이와 같습니다.
(코드 전체가 궁금하시면, https://github.com/Danden1/HttpInterface-Test 참고 부탁 드립니다!)
저희가 눈 여겨 볼 것은 adapter 입니다.
adapter에 실제 rest client와 http interface를 이용하여 데이터를 가져오도록 해보겠습니다.
http interface 부분입니다.
저는 여기서 rest client를 통해 동작하도록 하려고 합니다.
그러면 이렇게 해서 사용을 할 수 있습니다.
defaultStatusHanlder를 이용하여 status를 보고, 처리 할 수 있습니다.
특히 5xx 에러가 발생하면 특정 exception을 발생시키고 이를 이용하여 retry 로직을 구현하기도 편합니다.
(spring retry 참고)
위에서 정의했던 것들을 바탕으로 아래와 같은 로직이 제대로 동작하는 지 검증해보고 싶습니다.
A 팀에서 데이터를 가져오고, 이 데이터를 적절히 가공하는 지 테스트 하려고 합니다.
테스트
A 팀에서 데이터를 가져오고 가공하는 부분만 단위 테스트를 하고 싶습니다.
이를 위해서 MockRestServiceServer 를 이용합니다.
이처럼 5xx 에러가 발생하면 OtherTeamException 을 발생시키는 지 테스트 할 수 있습니다.
또한 성공적으로 응답이 오면 저희가 원하는 방식으로 도메인 데이터로 매핑 해주는 지도 알 수 있습니다.
(코파일럿이 테스트 코드 뼈대는 진짜 잘 작성해주는 것 같네요. 물론 세부적인 내용은 수정이 필요합니다.)

실제로 BadGateWay(502) 에러가 발생했을 경우 예외가 잘 발생하고 로깅도 되는 것을 확인할 수 있습니다.
후기
http inerface도 생각보다 깔끔하게 구현할 수 있어서 좋은 것 같습니다.
이전에 rest template만 이용해서 하려고 하면, 가독성이 좀 떨어진다고 저는 느꼈었습니다. 이를 이용하니 직관적으로 보기 편하네요.
open feign 보다 아쉬운 점은 retry 관련 부분이 좀 아쉬웠습니다.
open feign은 Retryer 를 이용해서 쉽게 retry 로직을 적용할 수 있어서 좋았습니다.
하지만 단위 테스트는 http interface 이용하는 것이 훨씬 간편하다고 느꼈습니다.
그 이유는 SpringBootTest 없이 테스트 코드를 작성할 수 있어서 편했습니다.
이건 다른 이야기이지만, rest client를 이용해서 request 파라미터를 주게 되면 무조건 utf-8로 인코딩 되는 것 같았습니다.
기존의 api key를 파라미터에 넣고 전송을 하니 계속 key가 유효하지 않다고 나오더라고요...
근본적인 해결 방법은 아직 찾지 못했고, api key를 utf 8로 디코딩 해서 넣으니 동작하네요.
이 부분은 좀 더 찾아봐야 될 것 같습니다.
'BackEnd > spring' 카테고리의 다른 글
| [Spring] openfeign 기여 시도했으나.... (0) | 2025.07.06 |
|---|---|
| [Spring] open feign 테스트 코드 (1) | 2025.06.26 |
| [Spring] webflux에서 별도의 스케줄러를 이용하여 cpu bound 작업 처리 vs 그냥 처리 (0) | 2025.05.22 |
| [Spring] bean이 없는 경우 허용하도록 처리 (0) | 2025.05.01 |
| [Spring] redis stream (0) | 2024.12.17 |