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