Spring4 [Spring] 모노레포 환경에서 MessageSource를 모듈별로 독립시키는 방법(feat. BeanPostProcessor) 최근 로또 프로젝트를 모노레포(Monorepo) 구조로 전환하면서 흥미로운 기술적 난관에 부딪혔습니다.현재 프로젝트는 모듈별 관심사 분리를 위해 Common 모듈의 AbstractCommonException과 ErrorCode를 확장하여 각 모듈(User, Lotto, Resilience 등)이 독자적인 에러 처리를 담당하고 있습니다. 이때 ErrorCode를 구현한 Enum은 MessageSource를 통해 국제화(i18n)된 에러 메시지를 반환하게 됩니다.public interface ErrorCode { String code(); HttpStatus status(); String messageKey();}public abstract class AbstractErrorCodeException exte.. 2026. 1. 14. [Spring Security]: 시큐리티 필터 예외 바꿔치기 문제 안녕하세요! 오늘은 Spring Security 환경에서 JWT 인증 필터를 통해서 인증을 실패했을때 발행했던 Exception이 Override되는 이슈를 해결했던 경험을 정리합니다. 분명히 토큰 파싱 중 발생한 ExpiredJwtException이나 MalformedJwtException에 대한 에러 처리를 했는데, 정작 클라이언트가 받는 것은 내가 의도한 메시지가 아닌 InsufficientAuthenticationException의 기본 메시지인 "Full authentication is required to access this resource" 이었습니다. 이 현상의 원인을 AnonymousAuthenticationFilter부터 ExceptionTranslationFilter까지 이어지는 .. 2025. 9. 7. Spring Cloud Gateway, 비동기 응답 문제 ( Global Filter가 아닌, Gateway Filter) 문제 상황특정 route의 GatewayFilter를 개별적으로 등록.보통의 상황에서는 문제가 생기지 않음.비동기 응답(Streaming Response, Mono, Flux 등)을 받을때는 사전 처리는 잘 되지만 사후 처리는 비동기 응답을 기다리지 않는 상황.실행시키는 Proxied Service 비동기로 Streaming응답 형식을 하게되고 총 5초가 걸리게 했습니다.(시간은 이해를 돕기위해 간소화)0초 API 요청 0초 GlobalFilter 사전 처리 동작 0초 GatewayFilter 사전 처리 동작0초 GatewayFilter 사후 처리 동작5초 GlobalFilter 사후 처리 동작즉, StreamResponse의 끝나는 시점에 GatewayFilter가 작동하면 되는 문제였습니다.왜 그럴까.. 2024. 11. 1. Spring Web. 프론트컨트롤러(DispatcherServlet) 프론트 컨트롤러 패턴은 중앙 집중형 컨트롤러를 프레젠테이션 계층의 제일 앞에 둬서 서버로 들어오는 모든 요청을먼저 받아서 처리하게 만든다사실 프론트 컨트롤러가 받기전에 Filter가 먼저 받긴하는거 같다.예전 방식의 서블릿들은 클라이언트가 요청을 보내면 서블릿컨테이너가 서블릿을 찾아 매핑해줘 결과를 리턴해준다.하지만 이 방식은 단점이 아래와 같다.서블릿이 많아지고 web.xml에 작성해야되는 매핑코드가 많아지면서 유지보수가 어려워진다.서블릿들은 웹 기술의 종속적이게 되면서 안좋아진다.서블릿들은 각각의 진입점을 갖기때문에 중복되는 코드를 막을수가 없다.그래서 해당 일들을 해주는 프론트 컨트롤러 패턴을 고안해냈다(선배 개발자들이) 프론트 컨트롤러 패턴을 하면 좋은점은 웹환경에 종속적이지 않고 순수한 JAVA.. 2023. 4. 19. 이전 1 다음