소개
두개 이상의 기능이 동기적으로 처리가 되지 않아도 될 때,
서비스 간의 결합도를 낮추기 위해 같은 로직 내에서 처리하지 않도록 만들어준다
기본적으로 Event가 발행될 때 동기로 진행되며, 설정에 따라 비동기로 처리가 가능하다
Event Class
- 일반
java@Getter @AllArgsConstructor public UserRegisteredEvent { private fianl String email; private final String nickname; }
- jdk 21 이상 record 클래스 활용
javapublic record UserRegisteredEvent(String email, String nickname) {}
EventListener Class
UserRegisteredEvent를 실행하면UserRegisteredEvent클래스가 매개변수로 들어가있는 이벤트들이 순차적으로 실행이 된다.- 만약 순서를 만든다면
@Order(1)을 넣으면 된다.- 단 Async는 보장되지 않는다.
java@Component public class UserEventListener { @EventListener public void sendWelcomeEmail(UserRegisteredEvent event) { // 실제로는 이메일 발송 서비스 호출 System.out.println(event.email() + "님에게 환영 이메일을 발송했습니다."); } @EventListener public void giveWelcomePoints(UserRegisteredEvent event) { // 가입 축하 포인트 지급 로직 System.out.println(event.nickname() + "님에게 가입 축하 1,000 포인트를 지급했습니다."); } @Async @EventListener public void sendWelcomeEmailAsync(UserRegisteredEvent event) { ... } @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void handleAfterCommit(UserRegisteredEvent event) { ... } }
EventPublisher Class
UserRegisteredEvent실행시 상단의UserEventListener의 함수가 순차적으로 동작한다. (위 설명과 동일한 말을 다시 적어두었다.)
java@Service @RequiredArgsConstructor public class UserService { private final ApplicationEventPublisher eventPublisher; @Transactional public void registerUser(String email, String nickname) { // 1. 회원 저장 로직 (MariaDB) System.out.println("회원 데이터 저장 완료: " + email); // 2. 이벤트 발행 eventPublisher.publishEvent(new UserRegisteredEvent(email, nickname)); } }