Spring Framework
-
connection prematurely close BEFORE response 해결기Spring Framework/Spring Cloud Gateway 2026. 3. 13. 00:50
개요reactor netty를 활용하는 Spring Cloud Gateway 서버에서 간헐적으로 connection prematurely close BEFORE response 오류가 발생하고 있었습니다. 해당 서버는 200 tps 정도로 요청을 처리하는데 하루에 간헐적으로 1~2건 정도 오류가 발생하였습니다. 어떤 에러인지?에러 메시지를 해석해 보면 connection이 response를 받기 전에 close 되었다는 예외 메시지입니다.왜 요청 중인 connection이 close 되었는지를 파악한다면 문제를 해결할 수 있을 것 같습니다. 환경reactor-netty 1.1.13jvm 17spring-cloud-starter-gateway 4.0.9envoy proxy 활용하는 pod to pod 통..
-
Tomcat 에서 발생하는 간헐적 404 해결기Spring Framework 2026. 1. 25. 00:55
개요Spring Boot embedded-tomcat 환경의 특정 서버에서 404 응답이 발생하였습니다.해당 원인을 분석해서 해결한 내용을 공유해보고자 합니다. 현상A -> B 서버로 동일한 http 요청에도 불구하고 6건 중 5건은 성공하고 1건이 실패하였습니다.실패했을 때의 응답은 아래와 같습니다. HTTP Status 404 – Not Found 이를 404.html 파일로 만들어서 웹에서 확인하면 아래와 같은 화면을 만날 수 있습니다. 유효하지 않은 url으로 접근했을 때 나타나는 Whitelabel 페이지과 차이가 보입니다.분석위의 404 페이지를 생성하는 클래스는 org.apache.catalina.valves.ErrorReportValve 입니다.이는 Tomcat의 클래스이며..
-
Apache Tomcat ErrorReportValve에 logOnError 옵션 추가하기Spring Framework 2026. 1. 21. 22:13
개요Apache Tomcat의 ErrorReportValve는 HTTP 에러 발생 시 사용자에게 에러 페이지를 보여주는 역할을 합니다. 하지만 에러가 발생했을 때 이를 로그로 남겨 빠르게 인지할 수 있는 기능은 제공하지 않았습니다. 이로 인해 Tomcat 처리 단계에서 발생한 에러는 운영 환경에서 쉽게 놓치기 쉬웠고, 이를 개선하기 위해 에러 로그를 남길 수 있는 옵션을 추가하는 PR을 작성하게 되었습니다. Spring Boot + Tomcat 처리 흐름Spring Boot + Tomcat 환경에서 하나의 HTTP 요청은 보통 다음 순서로 처리됩니다.Client → Tomcat → Filter → DispatcherServlet → Controller 여기서 DispatcherServlet이 요청을 받..
-
Kotlin coroutine graceful shutdown in spring bootSpring Framework 2025. 4. 6. 13:31
graceful shutdowngraceful shutdown은 애플리케이션이 종료될 때, 현재 진행 중인 작업을 완료한 후 종료하는 것을 말합니다. couroutine과 graceful shutdown@Componentclass CoroutineGracefulShutdown() : ApplicationRunner { override fun run(args: ApplicationArguments) { runBlocking { launch(Dispatchers.IO) { logger.info { "start" } sleep(30000) // 30초 기다림 logger.info..
-
MSA 환경에서 enum에 대한 위험성 줄여나가기Spring Framework 2024. 11. 16. 16:05
개요소프트웨어를 개발하다 보면 상수들의 집합을 관리하기 위해 enum을 활용하곤 합니다. ProductType을 enum으로 관리하게 된다면 여러 상품들을 enum으로 관리할 수 있습니다. 여러 서버에서 ProductType이라는 enum을 관리해야 한다면 어떤 일이 발생할 수 있을까요? 여러 서버에서의 불일치ProductType의 enum이 두 서버에서 관리된다면 혹은 백개의 서버에서 내부적으로 관리된다면 어떨까요? 새로운 Product가 추가되었을 때 관심사의 밖 혹은 추가하는것을 잊어서 여러 서버에서 차이가 발생하게 됩니다. 여러 서버에서의 불일치가 생기고, 신규 서버가 생성될때도 ProductType의 enum을 매번 추가해줘야 하는 불편함이 있을 것 같습니다. 공통 라이브러리로 관리하자만약 ..
-
Spring Bean 이름은 왜 소문자로 시작할까?Spring Framework 2024. 11. 3. 17:06
개요특정상황에서 Spring Bean의 이름으로 컨테이너에서 가져와서 활용하는 경우가 있었고 그 경우에 NoSuchBeanException이 발생하여 문제의 원인을 파악하고 알게 된 내용들을 정리해보고자 합니다. 스프링 컨테이너에 등록된 빈 이름은 어떻게 될까요?@Componentclass Z@Componentclass FooBar@Componentclass HTMLParser 대부분 일반적으로 앞자리가 소문자로 바뀌게 된다고 알고 있습니다.Z는 z로 FooBar는 fooBar로 HTMLParser는 hTMLParser로 바뀌게 될까요? @Componentclass BeanTest( private val applicationContext: ApplicationContext): ApplicationRunn..
-
분산시스템에서 로깅 트레이싱 전파는 어떻게 이루어질까?Spring Framework 2024. 10. 26. 20:30
대상 독자logback과 MDC를 활용하여 kafka, coroutine, async에도 트레이싱 전파를 어떻게 하는지 알고 싶으신 분들 개요 MSA 환경에서 Client가 하나의 호출을 수행했을 때 하나의 요청을 모아서 모니터링하고 싶으면 어떻게 해야 할까요? 아래 질문들에 대해 하나씩 답을 찾아가 보고자 합니다. 1. Server A에서 Spring MVC를 기반으로 여러 객체들이 협력하면서 비즈니스를 처리할텐데 어떻게 이어질 수 있을까? 2. Server A 에서 coroutine을 활용하면 어떻게 될까? 3. Server A 에서 @Async를 활용하면 어떻게 될까? 4. Server A가 kafka produce를 하고 Server B 가 consume을 수행하면 어떻게 될까? 5. Server..
-
Spring Boot Distributed SchedulingSpring Framework 2024. 6. 30. 21:25
개요최근에 Spring Batch 대신 @Scheduled 활용해 보기라는 주제로 글을 작성했던 적이 있는데 비슷한 주제로 Spring I/O 유튜브에 Spring Boot Distributed Scheduling 주제가 올라와서 이를 정리해보고자 합니다. Spring의 @Schedueld대부분의 software의 문제는 매 1분마다 실행되는 job을 통해 해결할 수 있습니다.Spring에서는 특정 주기로 반복되는 작업을 실행하기 위해 @Scheduled 어노테이션을 지원합니다. 하지만 서버 한대가 아니라 여러대에서 구동되는 환경이라면 각 서버에서 반복되는 작업이 개별적으로 수행되어 Race Condition이 발생할 수 있습니다. 위의 그림처럼 우리는 각 자원이 이상적으로 분배될 것이라고 기대되지만 여..