Spring Event, 스프링 이벤트, ApplicationEventPublisher

2024. 1. 27. 16:30·Spring
728x90

 

Spring Event

  • 스프링 프레임워크를 사용할 때 빈(Bean) 간 데이터를 주고받는 방식
  • 이벤트를 발행(Publish)하고 이벤트를 수신 또는 구독하여 소비(Listen/Subscribe)하는 기능을 제공
  • 기존 로직에 트리거와 같은 후처리를 추가하면서 관심사 분리 (낮은 결합도)

 

1. 이벤트 클래스

  • 이벤트 클래스는 이벤트를 처리하는 데 필요한 최소한의 데이터 포함하여 생성
  • 이너 클래스 생성하여 사용 가능
@Getter
@RequiredArgsConstructor
public class AddPersonEvent {
    PersonDto personDto;
}

 

2. 이벤트 디스패처

  • 이벤트 발행을 위해 스프링에서 제공하는 ApplicationEventPublisher을 사용
@Slf4j
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class PersonService {
    private final ApplicationEventPublisher publisher;

    @Transactional
    public void test(PersonDto personDto) {
        log.info("test");

        publisher.publishEvent(new AddPersonEvent(personDto)); // 이벤트 발행

    }
}

 

3. 이벤트핸들러, 이벤트리스너

  • 이벤트를 처리할 핸들러는 Spring에서 제공하는 @EventListener 애너테이션을 사용해서 구현
  • 수신하여 이벤트를 처리
  • @Async 어노테이션을 사용하여 비동기 처리 가능
  • @TransactionalEventListener 어노테이션을 사용하여 동작하는 메서드가 트랜잭션을 적용해야 하는 경우 사용
@TransactionalEventListener

1. @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
default 값이며, 트랜잭션이 commit 되었을 때 이벤트를 실행합니다.
2. @TransactionalEventListener(phase = TransactionPhase.ROLLBACK)
트랜잭션이 rollback 되었을 때 이벤트를 실행합니다.
3. @TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)
트랜잭션이 completion(commit 또는 rollback)되었을 때 이벤트 실행합니다.
4. @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
트랜잭션이 commit 되기 전에 이벤트를 실행합니다.
@Component
@RequiredArgsConstructor
public class EventHandler {

    private final TestService testService;

    @Async // 비동기 처리
    @EventListener(AddPersonEvent.class) // 수신할 이벤트 클래스 지정
    public void handle(AddPersonEvent event){
        testService.add(event.getPersonDto()); // 이벤트 처리 로직
    }
}
728x90
'Spring' 카테고리의 다른 글
  • [Spring WebFlux] 3. Non-Blocking, WebClient, Mono, subscribe
  • [Spring Webflux] WebClient (HTTP 클라이언트)
  • Spring Batch, 배치와 스케줄러의 차이, Job, Tasklet, Chunk
  • Spring Jsch SSH Private Key, Dockerfile 복사, Jsch kubernetes pod
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    이분탐색
    최단거리
    재귀
    그래프
    최대공약수
    구현
    플로이드워셜
    알고리즘
    스택
    큐
    동적계획법
    덱
    정렬
    DP
    월간코드챌린지
    자료구조
    백준
    BFS
    트리
    힙
    Algorithm
    그리디
    구간합
    DFS
    파이썬
    LIS
    다익스트라
    프로그래머스
    조합
    최소신장트리
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
Spring Event, 스프링 이벤트, ApplicationEventPublisher
상단으로

티스토리툴바