Spring4 @Retry를 붙였는데 재시도가 0회였다? Resilience4j에서 4xx와 5xx를 가르는 법 FeignClient에 @Retry와 @CircuitBreaker를 붙여놓고 "이제 복원력은 챙겼다"고 생각하기 쉽다. 나도 그랬다. 그런데 막상 장애 상황을 들여다보니, 재시도는 한 번도 안 돌고 있었고, 외부 서버는 멀쩡한데 우리 회로가 OPEN으로 넘어가 우리 정상 호출까지 막고 있었다. 원인은 단 하나의 사실에서 출발했다. Resilience4j는 던져진 예외의 "직접 타입"만 본다. cause는 까보지 않는다. 이 글은 그 한 문장에서 파생되는 함정들과, 4xx/5xx를 제대로 갈라서 self-DoS를 막는 패턴을 정리한 기록이다.IntroResilience4j의 @Retry와 @CircuitBreaker는 던져진 예외 인스턴스의 직접 타입만 instanceof로 매칭한다. e.cause는 보지.. 2026. 6. 1. Spring Cloud OpenFeign의 child context가 내 ErrorDecoder를 조용히 죽이고 있었다 Spring Cloud OpenFeign 4.x + Spring Boot 3.x 환경에서 Feign Client별 ErrorDecoder가 예고 없이 무력화되는 문제를 만났다. 원인은 child ApplicationContext의 빈 오버라이딩 정책이었고, 해결은 단순했지만 "왜 그런지"를 이해하는 데 시간이 걸렸다. 같은 길을 걷는 분들을 위해 기록을 남긴다.Spring Cloud OpenFeign은 Feign Client마다 격리된 child ApplicationContext를 만든다.Spring Boot 3.x부터 allowBeanDefinitionOverriding = false가 기본값이라, default 설정의 ErrorDecoder가 먼저 올라오면 per-client ErrorDecoder가.. 2026. 4. 19. Spring Data JPA가 새로운 entity를 판단하는 기준(with Kotlin) Java를 사용하면 고민할 필요가 없어 그냥 넘어가는데, Kotlin으로 JPA를 사용하면 한 번쯤 생각해봐야 하는 것이 있다.나의 경우 PK인 id 프로퍼티를 어떻게 선언해둘지 고민하다 Spring Data JPA 내부 구현체를 살펴보고 새로운 entity를 어떻게 판단하는지 직접 확인해보며 정리해봤다.Java냐 Kotlin이냐 상관 없이 공통적인 내용이 있어 잘 알아두는 게 좋을 것 같다.테스트 환경Kotlin 1.9Spring Boot 3.2.3Spring Data JPAMySQL 8TestcontainersSpring Data JPA 내부 구현체package me.ramos.guide.repositoryimport me.ramos.guide.domain.Itemimport org.springfra.. 2024. 12. 29. Spring Profile과 외부설정 파일, 그리고 단위 테스트 보통 Spring 외부설정 파일을 하나로 통합하여 파일 내에서 profile 별로 구분짓곤 한다.필자의 회사에선 local, dev, alpha, beta, staging, real 의 단계로 서비스 개발 및 배포 스테이지를 구분한다.한 파일로 통합하여 관리하기엔, 가독성이 떨어진단 생각이고 우리 팀 내에서도 스테이지에 따라 application-dev.yml, application-alpha.yml 등과 같은 형식으로 파일을 분리하곤 한다. Unit Test를 위한 환경에 대한 고민이 필요하긴 하다. 특히나 DB의 경우 H2와 같은 인메모리 기반 DB로 테스트를 수행하기 보단 개발 자원에 여유가 충분하다면 Real DB 환경과 동일하게 구성하여 맞추는게 좋다고 생각한다. 그렇다고, src/main/re.. 2024. 7. 20. 이전 1 다음