분류 전체보기80 [Spring] HikariCp(1) 애플리케이션을 개발할 때 데이터베이스 접근이 필요한 경우 보통 스프링 진영에서는 datasource 설정을 통해 연결 정보를 구성합니다.이 과정에서 다양한 설정 값을 정의하게 되는데 각각의 값이 실제로 어떤 역할을 하고 애플리케이션 내부에서 어떤 시점에 적용되는지 명확하게 이해하기 위해 이 글을 작성합니다.특히 커넥션 풀과 관련된 설정은 상황에 따라 애플리케이션의 처리량과 안정성에 직접적인 영향을 미칩니다.애플리케이션을 개발하면서 커넥션 풀 사이즈와 스레드 풀 사이즈를 조정해야 하는 일이 있고 병목 현상이나 타임아웃 문제를 겪으면서 내부 원리를 정확히 이해할 필요성을 절감한 바 있습니다. 이러한 경험을 바탕으로 이 글에서는 다음 두 가지를 중심으로 정리하고자 합니다.Spring Boot가 HikariCP.. 2025. 12. 18. [Kotlin] Kotlin DSL DSL이란DSL(Domain-Specific Language) 은 특정 도메인의 문제를 다루기 위해 설계된 전용 언어입니다. 일반적인 프로그래밍 언어인 GPL(General Purpose Language) 이 다양한 문제를 폭넓게 해결하도록 만들어진 범용 언어라면, DSL은 반대로 특정 영역에만 집중해 표현력을 극대화한 언어라고 볼 수 있습니다. 대표적인 DSL에는 SQL, HTML, CSS, 정규표현식(Regex) 등이 있습니다. 이들은 각각 데이터 질의/조작, 문서 구조 정의, 스타일링, 문자열 패턴 매칭처럼 명확한 목적을 갖는 도메인에서 매우 강력한 표현력을 보여줍니다. 예를 들어 SQL(Structured Query Language)은 데이터 필터링과 정렬을 직관적으로 표현할 수 있는 대표적인 D.. 2025. 12. 3. [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. [ETC] 스프링 이벤트 (1) 들어가기 전앞선 글에서 분산 트랜잭션의 개념과 이를 해결하기 위한 두 가지 주요 패턴인 2-Phase Commit과 SAGA 패턴을 살펴보았습니다.하지만 서비스 간 트랜잭션 관리뿐만 아니라 시스템의 확장성과 유지보수성을 고려한 아키텍처 설계도 중요한 요소입니다. 특히 모놀리틱 애플리케이션(Monolithic Application) 환경에서는 서비스 간 상호작용이 대부분 직접적인 메서드 호출이나 API 호출을 통해 이루어지지만 서비스의 규모가 커지고 기능 간 의존성이 증가할수록 서비스간 강한 결합이 발생하고 하나의 서비스 변경이 전체 시스템에 영향을 미치는 리스크도 커집니다. 이를 해결하기 위한 접근 방식 중 하나가 이벤트 기반 아키텍처(Event-Driven Architecture, EDA) 이며 이를 .. 2025. 3. 26. [ETC] 분산 트랜잭션 들어가기 전하나의 서비스가 특정 비즈니스 로직을 수행할 때 종종 다른 서비스와 연계되어 함께 작업을 진행해야 할 때가 많습니다. 이때 두 가지 이상의 서비스에서 트랜잭션이 실행되면 "모두 실패하거나" 또는 "모두 성공하거나" 하는 상황이 자연스럽게 요구됩니다. 일부 서비스는 작업이 절반만 완료되고 다른 서비스는 작업이 실패하는 경우를 상정하고 시스템을 설계하지 않을뿐더러 그런 일은 발생해서는 안되기 때문입니다.또 다른 예로 사용자 경험을 개선하기 위해 빠른 응답을 제공하기 위해서 서비스 로직이 비동기로 처리되는 경우도 있습니다. 예를 들어 회원 가입 후 안내 메일을 발송하는 로직을 있을 때 이 메일 발송 기능이 특정 이유로 오래 걸린다면 사용자는 가입이 완료되었다는 응답을 지연받게 됩니다. 이를 방지하기.. 2024. 10. 8. [Java] Stream 과 Optional 의 map, flatMap 출처 Java 의 Stream API 는 컬렉션 데이터를 효율적으로 처리하기 위한 도구로 이때 자주 사용되는 map 과 flatMap 메소드는 각각 변환과 스트림 평면화를 담당합니다. 비슷하게 Optional 클래스도 map 과 flatMap 메소드를 제공하는데 Optional 은 null 처리를 깔끔하게 하기 위한 도구로 map 과 flatMap 을 사용하면 더 안전하고 직관적으로 데이터를 다룰 수 있습니다.Streammap()map 은 Stream API 가 제공하는 중간 연산 메소드로 각각의 엘리멘트에 접근하여 특정 작업을 수행하고 그 결과를 새로운 스트림으로 반환합니다.데이터를 변환하고자 할 때 매우 유용하게 사용됩니다. 아래 예제를 통해 Member 객체 리스트에서 이름만 추출해 리스트로 변환하.. 2024. 9. 6. [Spring] SpringBoot 의 다중 요청 처리 이전 글에서 자바의 스레드와 스레드풀에 대해 다루며 스레드를 이용해 여러 작업을 동시에 처리하는 방법 그리고 스레드풀을 통해 효율적으로 스레드를 관리하는 방법에 대해 알아보았습니다. 이제 스레드와 스레드풀의 개념을 조금 더 확장해서 스프링 부트를 사용하면서 서버에서 여러 사용자의 요청을 동시에 처리하는 상황에 대해서 살펴보도록 하겠습니다.MVC출처위 이미지는 사용자의 요청이 서블릿을 통해 컨트롤러 그리고 서비스와 리포지토리로 전달된 후 다시 응답이 사용자에게 돌아가는 과정을 설명합니다. 사실 우리가 흔히 보는 MVC 구조는 한 사용자의 요청 흐름을 설명하는 데 중점을 둡니다. 하지만 실제 애플리케이션 환경에서는 많은 사용자가 동시에 요청을 보내며, 이러한 요청은 모두 서버에서 병렬로 처리되어야 합니다. .. 2024. 8. 22. [Java] Thread Pool 이전 글에서 스레드에 대해 알아보았습니다. 스레드는 병렬 처리를 가능하게 하여 여러 작업을 동시에 실행할 수 있게 해주지만 사실 스레드를 직접 생성하고 해제하는 것은 상당히 복잡함을 요구합니다. 자원: 스레드 생성 시 운영체제는 스레드에 필요한 메모리와 다른 자원을 할당해야함.시간: 스레드를 생성하고 해제하는 작업은 시간 소모적이기 때문에 이로 인한 오버헤드가 발생할 수 있음. 관리: 스레드를 직접 관리하는 것은 동시성 문제, 스케줄링, 예외 처리등 다양한 문제들이 복잡하게 엮여 있기 때문에 오류가 발생하기 쉬움. 즉 위와 같은 문제들로 인해 요청이 빠르게 많이 들어 오고 가는 실제 운영 환경에서 지속적으로 스레드를 생성하게 되면 어느 순간 응답이 불가능한 상태에 빠지게 됩니다. 이런 상황 속에서 조.. 2024. 7. 18. 이전 1 2 3 4 ··· 9 다음