최근에 클라이언트 요청이 처리되는 와중에 어플리케이션이 종료될 경우, 그 요청은 어떻게 되는지에 대한 문의가 와서 겸사겸사 graceful shutdown에 대해서 포스팅을 해보려고 한다. 0. graceful shutdown이란? 서론에서 graceful shutdown이라는 표현을 했는데, 이에 대해서 간략히 설명하자면 다음과 같다. graceful shutdown이란 질서정연한 방식으로 어플리케이션을 종료하는 절차를 뜻한다. 다시 말해 어플리케이션이 완전히 종료되기 전에 진행 중인 모든 작업을 완료하고, 리소스는 적절하게 해제하고, 데이터 무결성이 유지되도록 필요한 조치를 취하는 행위를 뜻한다. 즉, “클라이언트의 요청을 처리하는 와중에 어플리케이션을 종료시켰을 때 요청을 잘 처리하고 종료하는가?”..
최근에 사용자가 로그만 보고 어플리케이션이 언제 종료되었는지 알고 싶다는 요구사항이 있었다. 이처럼 어플리케이션이 시작할 때, 종료될 때, 실패했을 때 등과 같이 어떤 이벤트가 있을 때, 특정 작업을 수행하게 하는건 언제든지 필요할 수 있으므로, 이번 기회를 통해 종료 상황에 특정 작업을 수행하는 샘플 코드를 작성해보려고 한다. 1. 샘플 프로젝트 준비 어떤 이벤트가 발생했을 때 특정 작업을 수행하기 위해 ApplicationListener 인터페이스를 사용할 예정이고, 샘플 코드에서는 ShutdownEventListener가 구현체가 될 예정이다. 그리고 어플리케이션을 기동하고 바로 종료되지 않도록 spring-boot-starter-web을 의존성으로 추가했다. 아래에 링크로 달아둔 샘플 코드를 보면..
회사 동료 분이 스프링 테스트를 하며 오류가 난다고 도움을 요청하셨는데, 살펴보니 크게 두 가지 이슈가 있었고 주요 문제는 @SpringBootApplication 클래스를 포함하지 않는 프로젝트라 @SpringBootTest가 수행이 되지 상황이었다. 이와 관련해서 자료를 찾다보니 마음에 드는 답변은 스프링 테스트 전반에 걸친 내용을 작성한 글 중 일부로 있었고, 간단한 해결 방법들은 지금과 같은 상황에서 좋은 해결책은 아니었다. 그래서 샘플 코드와 함께 내 나름대로의 해결 방식을 정리를 해두려고 한다. 1. 프로젝트 준비 에러 재현을 위해 구성한 프로젝트는 다음과 같다. 특이 사항이라면, 어플리케이션을 기동하기 위한 엔트리 포인트가 없다는 것이고 다음으로 SampleService가 의존하고 있는 Sa..
TDD, 클린 코드 with Java 교육 중에 메모리 DB를 효율적으로 사용할 수 있는 방법을 배워, 샘플 코드와 함께 정리를 해두려고 한다. 이걸 잘 활용하면, 실무에서 초기 개발 환경 세팅을 눈에 띄게 편하게 만들 수 있을 것 같다 🔥 1. 개요 기존 방식의 문제점: 테스트용 파일 DB 그동안 실무에서 DB에 의존적인 코드를 테스트하기 위해서는 아래와 같은 순서로 보통 작업을 했었다. 문제는 테스트를 위한 DB 파일을 관리해야 한다는 것이고, 테이블이 변경될 때마다 DB 파일도 함께 업데이트 해야한다는 점이다. - (h2 기준으로) 테스트용 DB 파일 생성 - properties(혹은 yml)에 DB 경로 설정 - 테이블이 변경될 경우, 테스트용 DB 파일을 수정 인메모리 DB가 있다는 건 알고 있..
최근에 어플리케이션이 기동되는 동안 주기적으로 특정 작업이 수행되어야 한다는 요구사항이 있었다. 구체적으로는 MQ에서 메세지를 주기적으로 가져와야 하는 상황이었는데, 내부에서 사용하는 어플리케이션이 아니라서 누구나 유지보수 할 수 있도록… 이전에 공부했던 Spring Integration 같은 프레임워크를 사용하지 않아야 했다. 신입 시절에도 이와 비슷하게 DB에서 값을 폴링하여 특정 상태를 체크하는 요구사항이 있어 "쓰레드 풀을 생성하고, 비동기로 무한 루프를 돌면서 DB를 특정 시간 간격으로 조회하는 쓰레드를 실행"하는 조악한 방식을 쓴 적이 있는데(이 일과 관련해서도 할 말이 많다…), 아래의 짤처럼 언제까지 과거에 머물러 있을 수 없으니 조금 더 우아한 방식으로 스케줄링 작업을 개발해보려고 한다...
사내에서 배치 작업을 스케줄링이나 HTTP API가 아닌 DB polling로 기동하길 원하는 요구사항이 있어, 어떤 방식으로 구현하면 좋을지 찾다보니 Spring Integration를 활용할 수 있을 것 같아 학습 겸 Baeldung 자료를 기반으로 소개 및 튜토리얼 자료를 작성해보려 한다. 그리고 Spring Integration에 대한 기본적인 개념을 학습한 후에 이를 활용한 DB polling에 대한 포스팅을 해야겠다. 1. 소개 이 글에서는 실용적인 예제를 통해 Spring Integration의 핵심 개념을 소개한다. Spring Integration은 엔터프라이즈 아키텍처에서 시스템들과 프로세스들 간의 상호 연결성을 크게 향상시킬 수 있는 많은 요소들을 제공한다. 그리고 널리 사용되는 디자..