본문 바로가기

Spring27

[Spring] TransactionManager 들어가기 전Spring의 트랜잭션 매니저는 PlatformTransactionManager라는 추상화를 통해 다양한 데이터 접근 기술에 대해 일관된 트랜잭션 처리를 제공한다. 그러나 실전에서는 단일 트랜잭션 경계만으로 설명되지 않는 복잡한 상황이 자주 등장한다. 특히 멀티 데이터소스, 이벤트 기반 처리, 비동기 작업 등이 혼재하는 환경에서는 Spring의 추상화 이면을 명확히 이해하고 있어야 한다. 본 글은 이러한 맥락에서 트랜잭션 매니저의 역할, 동기화 메커니즘, 컨테이너 내부 동작 방식, 이벤트 연계와 경계의 모호성까지 작성하고자 한다.TransactionManager의 추상화Spring의 트랜잭션 매니저는 단순히 데이터베이스 트랜잭션을 제어하는 기술적 역할을 넘어 본질적인 애플리케이션의 상태 전이와.. 2026. 1. 26.
[Spring] JobRepository의 역할과 실행 흐름 들어가기 전Spring Batch는 대용량 데이터 처리를 위해 Job, Step 등의 컴포넌트로 구성된 프레임워크입니다. 이 글에서는 배치(Job)를 실행할 때 내부에서 JobRepository가 어떤 역할을 하고 기본 구현체가 어떻게 동작하는지 살펴보겠습니다. Spring Boot의 기본 설정을 활용하여 별도 커스터마이징 없이 (기본 구현체 그대로) 애플리케이션 코드에서 배치를 직접 호출하는 상황으로 가정할 것이며 이를 통해 JobRepository를 중심으로 JobLauncher가 Job을 실행하고 메타데이터를 관리하는 흐름을 알아보고자 합니다.JobRepositorySpring Batch의 기본 아키텍처는 배치 작업 단위를 표현하는 Job과 그 구성요소인 Step들로 이루어져 있습니다. JobLau.. 2026. 1. 11.
[Spring] HikariCp(2) 들어가기 전이전 글에서는 HikariCP가 언제 커넥션 풀을 초기화하고 어떤 판단 과정을 거쳐 커넥션을 생성하는지를 살펴보았습니다. HouseKeeper는 주기적으로 풀의 상태를 점검하고, minimumIdle을 유지해야 한다고 판단되는 경우 직접 커넥션을 생성하지 않고 전용 커넥션 생성 스레드(connection-adder) 에게 작업을 위임합니다. 이전 글이 "커넥션을 만들어야 하는가"에 대한 판단의 영역이라면 이번 글에서는 그 결과로 생성된 커넥션들이 실제로 어디에 보관되고 어떤 방식으로 대여되고 반납되는지를 다뤄보려고 합니다. 즉 HikariPool 에서의 커넥션풀의 자료 구조를 담당하는 ConcurrentBag 입니다.ConcurrentBagConcurrentBag은 커넥션 풀처럼 "아주 짧은 .. 2025. 12. 29.
[Spring] HikariCp(1) 애플리케이션을 개발할 때 데이터베이스 접근이 필요한 경우 보통 스프링 진영에서는 datasource 설정을 통해 연결 정보를 구성합니다.이 과정에서 다양한 설정 값을 정의하게 되는데 각각의 값이 실제로 어떤 역할을 하고 애플리케이션 내부에서 어떤 시점에 적용되는지 명확하게 이해하기 위해 이 글을 작성합니다.특히 커넥션 풀과 관련된 설정은 상황에 따라 애플리케이션의 처리량과 안정성에 직접적인 영향을 미칩니다.애플리케이션을 개발하면서 커넥션 풀 사이즈와 스레드 풀 사이즈를 조정해야 하는 일이 있고 병목 현상이나 타임아웃 문제를 겪으면서 내부 원리를 정확히 이해할 필요성을 절감한 바 있습니다. 이러한 경험을 바탕으로 이 글에서는 다음 두 가지를 중심으로 정리하고자 합니다.Spring Boot가 HikariCP.. 2025. 12. 18.
[Spring] @TransactionalEventListener TransactionalEventListener@EventListener는 코드의 결합도를 낮추고 도메인 이벤트를 기반으로 유연한 구조를 만드는 데 유용하지만 트랜잭션을 사용하는 환경에서는 예상치 못한 문제가 발생할 수 있습니다. 다음과 같은 코드가 있다고 예를 들겠습니다.@Transactionalfun createOrder() { orderRepository.save(...) applicationEventPublisher.publishEvent(OrderCreatedEvent(...))}앞서 작성한 이벤트리스너에서 알아봤듯이 @EventListener는 동기적으로 실행됩니다. orderRepository.save()는 아직 커밋되지 않았지만 이벤트 리스너에서 이 해당 값에 접근하거나 관련 작업을 시.. 2025. 7. 23.
[Spring] EventListener Spring Event스프링 애플리케이션을 실행할 때 ApplicationContext가 초기화되고 서버가 동작하게 되는 과정에서 내부적으로는 굉장히 많은 이벤트가 순차적으로 발생합니다. 스프링 프레임워크는 기본적으로 다음과 같은 이벤트들을 발행함으로써 자체적으로 ApplicationContext의 라이프 사이클을 관리합니다.ContextRefreshedEvent: ApplicationContext가 초기화되거나 리프레시된 후(보통 context.refresh() 또는 애플리케이션 시작 시 발생)ContextStartedEvent: context.start() 가 호출될 때 발생ContextStoppedEvent: context.stop() 이 호출될 때 발생ContextClosedEvent: conte.. 2025. 7. 10.
[Spring] SpringBoot 의 다중 요청 처리 이전 글에서 자바의 스레드와 스레드풀에 대해 다루며 스레드를 이용해 여러 작업을 동시에 처리하는 방법 그리고 스레드풀을 통해 효율적으로 스레드를 관리하는 방법에 대해 알아보았습니다. 이제 스레드와 스레드풀의 개념을 조금 더 확장해서 스프링 부트를 사용하면서 서버에서 여러 사용자의 요청을 동시에 처리하는 상황에 대해서 살펴보도록 하겠습니다.MVC출처위 이미지는 사용자의 요청이 서블릿을 통해 컨트롤러 그리고 서비스와 리포지토리로 전달된 후 다시 응답이 사용자에게 돌아가는 과정을 설명합니다. 사실 우리가 흔히 보는 MVC 구조는 한 사용자의 요청 흐름을 설명하는 데 중점을 둡니다. 하지만 실제 애플리케이션 환경에서는 많은 사용자가 동시에 요청을 보내며, 이러한 요청은 모두 서버에서 병렬로 처리되어야 합니다. .. 2024. 8. 22.
[Spring] Executable JAR JAR 출처 Executable JAR에 대해 알아보기 전에 먼저 JAR가 무엇인지 살펴보겠습니다. JAR는 Java ARchive의 약자로 여러 개의 자바 클래스 파일과 관련 리소스(텍스트, 이미지 등) 및 메타데이터를 하나의 파일로 압축하여 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷입니다. JAR 파일은 실제로 ZIP 파일 포맷으로 이루어져 있어 압축 파일의 형태로 제공되며 이를 통해 효율적인 배포와 관리를 할 수 있습니다 MANIFEST JAR 파일의 기본 메타데이터를 포함하는 파일로 JAR 파일의 루트에 위치하며 JAR 파일에 포함된 리소스 및 클래스에 대한 정보를 제공합니다. JAR 파일 생성시 자동으로 MANIFEST.MF 파일이 생성되며 항상 ME.. 2024. 4. 4.
[Spring] Spring Batch Job 등록부터 실행까지(1) 들어가기 전 이전 글 에서 Spring Batch 실행을 위한 프로젝트 환경 구성 및 예제 Job 을 작성 후 실행해 봤습니다. 그렇다면 Spring Batch 는 Job 을 어떤 식으로 생성하고 실행시키는지에 대해 이번 글을 통해서 알아 보도록 하겠습니다. Step 다음과 같이 Tasklet 으로 구성된 Step 을 Bean 으로 등록합니다. @Bean public Step step(JobRepository jobRepository, PlatformTransactionManager transactionManager) { return new StepBuilder("step1", jobRepository) .tasklet(tasklet(), transactionManager) .build(); } 먼저 S.. 2024. 1. 22.