안녕세계
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 = "o..
그라파나와 로키 그리고 프롬테일 그라파나(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") 라이브러리를..
EventListener vs TransactionalEventListener 스프링 4.2 이상 버전에서 @EventListener와 @TransactionalEventListener 두 가지로 애플리케이션 이벤트를 수신할 수 있습니다. 두 어노테이션은 리스너 어노테이션이 설정된 메서드 인자의 이벤트 객체를 받아서 처리한다는 공통점이 있지만 약간의 차이 점이 존재합니다. 이번 포스팅에서는 두 어노테이션의 사용 방법과 차이 점을 살펴봅니다. 😊 EventListener 우선, EventListener는 애플리케이션에서 모든 타입의 이벤트를 수신하는 가장 단순한 방법입니다. EventListener는 트랜잭션에 참여하지 않으므로 트랜잭션 관련된 동작이 없으며 동기적으로 실행됩니다. 동기적으로 수행한다는 의..
안녕하세요. 지난 포스팅에서는 SpringBoot 환경에 MyBatis를 연동해보았습니다. 이번 포스팅에서는 SpringBoot 환경에서 MyBatis를 활용한 API 개발 예제에 대해 알아봅니다. JPA에서는 Entity 클래스를 생성하고, Entity에 대응되는 JpaRepository를 생성해주어야 하는데, MyBatis에서는 Mapper 인터페이스를 생성하고, Mapper 클래스에 대응되는 XML 파일을 만들어야합니다. 본 예제에서는 API 요청을 위한 Controller를 먼저 만들고, Controller에서 필요한 클래스부터 파일을 하나씩 생성해봅니다. 😎 1. Controller 클래스 생성 // kim.junhong.expmybatish2.api.test.controller @RestCon..