안녕세계

Transaction PropagationTransaction Propagation은 트랜잭션이 다른 트랜잭션을 호출할 때, 그 트랜잭션이 어떻게 전파될지를 정의하는 개념입니다. 즉, 하나의 트랜잭션이 다른 메서드나 서비스에서 실행되는 트랜잭션에 참여할지, 새로운 트랜잭션을 생성할지 등을 결정하는 것입니다. Propagation은 애플리케이션 내부에서 트랜잭션의 전파 방식을 관리하며, 이를 Spring의 트랜잭션 매니저가 제어합니다. 참고로, Transaction Propagation은 애플리케이션 단(예: Spring Framework)에서 제공하는 개념이며, DB 트랜잭션은 단일 connection에서 시작과 종료로 관리되기 때문에 DB 자체에는 Propagation이 존재하지 않습니다. DB는 단순..

ProxyFactorySpring의 ProxyFactory는 AOP를 구현할 때 핵심 역할을 하는 도구입니다. ProxyFactory를 사용하면 target 객체를 감싸는 proxy 객체를 동적으로 생성할 수 있으며, 이 proxy 객체를 통해 메서드 호출 시 부가적인 행동(예: 로깅, 트랜잭션 관리 등)을 추가할 수 있습니다. Spring에서 ProxyFactory를 활용해서 동적 proxy를 만드는 방법은 JDK 동적 프록시와 CLIB이 존재합니다.JDK 동적 proxy: 인터페이스를 기반으로 동적 proxy 생성 (리플렉션 사용)JDK 동적 proxy는 인터페이스 기반으로 만들었기 때문에, 구현 클래스로 타입 캐스팅이 불가능합니다.CGLIB: 인터페이스 없이 구체 클래스만으로도 동적 proxy 생성..

Spring Bean은 Spring IoC Container에 의해 관리되는 객체를 의미합니다. Spring IoC Container가 생성, 의존성 주입, 초기화, 사용, 소멸 과정을 책임지게 되는데, 이때 Spring Bean Life Cycle은 다음과 같습니다. 1. 객체 생성: IoC Continaer가 Bean을 생성2. 의존성 주입: Bean 의존성 주입3. 초기화: Bean을 사용 가능한 상태로 초기화 작업 실행4. 사용: 애플리케이션에서 Bean을 사용5. 소멸: 애플리케이션이 종료되거나 Bean 수명이 끝나면 소멸 작업 실행1. 객체 생성Spring IoC Container는 애플리케이션의 Bean 정의에 따라 객체를 생성합니다. Bean 정의 방법은 (1) XML Config, (2)..

@PostPersist와 @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)는 모두 Spring에서 트랜잭션 관련 이벤트를 처리하는데 사용됩니다. 두 어노테이션은 동작 시점과 사용 용도가 다르므로 차이를 이해하고 사용해야합니다. 본 포스팅에서는 두 어노테이션의 차이점에 대해 알아봅니다. @PostPersist동작 시점엔티티가 영속성 컨텍스트에 저장된 직후 호출됩니다. 즉, persist 메서드가 호출된 후를 의미합니다.데이터베이스에 INSERT 연산이 수행된 후 호출되며, 트랜잭션 commit이 되기 전에 호출됩니다.fun main() { val emf: EntityManagerFactory = Persistence.createEn..

SSE(Server-Sent-Events)란? 웹 페이지가 새로운 데이터를 받기 위해서는 일반적으로 서버에 요청을 보내야 합니다. 그러나 SSE(Server-Sent Events)를 사용하면 서버가 요청 없이도 웹 페이지에 새로운 데이터를 전송할 수 있습니다. 이는 서버에서 클라이언트로 데이터를 주기적으로 전송해야 할 경우에 특히 유용합니다. 예를 들어, 서버가 특정 데이터의 변경 사항을 주기적으로 클라이언트에 알려주어야 하고, 클라이언트는 이를 대시보드 등의 화면에서 실시간으로 표시해야 하는 상황에서 활용될 수 있습니다. 웹소켓을 통한 구현도 가능하지만, 양방향 통신이 필요 없고 오직 서버에서 클라이언트로의 단방향 통신만 필요한 경우 SSE의 사용이 권장됩니다. SSE는 HTML5부터 지원되는 표준 스..
들어가기 전에API 요청과 응답에는 entity를 사용하지 않고, API 스펙에 따라 별도의 DTO를 만드는 것을 권장합니다.🙅♀️ 요청/응답에 entity를 사용하면? 특정 API 전용의 DTO가 아니기 때문에 어떤 요청이 넘어올지 알기 어렵습니다.entity 정의가 바뀌면 API 스펙이 변경되어 API가 깨집니다.🙆♂️ 요청/응답에 DTO를 사용하면? entity와 presentation layer를 분리할 수 있습니다.entity는 DB에서 사용되는 데이터 구조를 정의하고 DB와 상호작용하는 클래스입니다.persentation layer는 클라이언트가 요청한 데이터를 받아 그 데이터를 가공하여 응답하는 역할을 합니다.예제 entity 정의@Entity@Table(name = "orders")..

그라파나와 로키 그리고 프롬테일 그라파나(Grafana) 그라파나는 오픈소스 데이터 시각화 및 분석 도구입니다. 그라파나는 다양한 데이터소스로부터 데이터를 가져와서 대시보드와 그래프 등으로 데이터를 시각화할 수 있으며 프로메테우스(Prometheus), 로키(Loki), 엘라스틱서치(ElasticSearch, ES) 등과 통합이 잘 되어 있습니다. 로키(Loki) 로키는 프로메테우스와 함께 사용하기 위해 개발된 시스템으로 프로메테우스와 마찬가지로 그라파나 랩스(Grafana Labs)에서 개발하고 있습니다. 프로메테우스는 수집된 메트릭을 저장하고 그래프로 시각화할 수 있도록 지원하는 시스템입니다. 하지만, 로그 데이터를 수집하고 검색하는 기능은 제공하지 않습니다. 이에 반해 로키는 프로메테우스의 기본 데..

액츄에이터(Actuator) 서비스 운영시에는 서비스에 문제가 없는지 모니터링할 수 있는 metric(지표)을 추가하여 감사(auditing)가 필요합니다. 이처럼 서비스 모니터링에 필요한 metric을 스프링부트 액츄에이터(SpringBoot Actuator)를 사용하면 손 쉽게 확인할 수 있습니다. 그리고 액츄에이터는 마이크로미터(micrometer), 프로메테우스(Prometheus), 그라파나(Grafana)와 같은 모니터링 시스템과 연동할 수 있는 기능도 함께 제공하고 있습니다. 액츄에이터가 제공하는 기능을 사용하기 위해서는 라이브러를 먼저 추가해야합니다. implementation("org.springframework.boot:spring-boot-starter-actuator") 라이브러리를..