: 사건의 발생을 알려주기 위한 메개체, 메시지
-> 유저의 생성과 삭제 사건이 일어났다는 걸 알려줌 + 추가적인 작업(EventListner) 실행
=> 클래스 및 기능 분리로 SRP와 OCP 원칙을 지킬 수 있게 해줌!
@Service
@RequiredArgsConstructor
public class MemberService {
private final AlarmService alarmService;
private final AlimTalkService alimTalkService;
public void registerUser(String name) {
// 회원가입 처리 로직
System.out.println("회원 추가 완료");
// 가입 축하 푸시 알림
alarmService.send(name);
// 카카오 알림톡 전송
alimTalkService.send(name);
}
}
위의 코드엔 총 세가지의 문제점이 있는데,
=> Event를 사용하면 registerUser가 회원가입만 담당할 수 있고, 각 EventListener도 기능별로 클래스로 분리할 수 있다. (SRP),
부가적인 기능이 생겨도 EventListener만 추가해주면 되므로 OCP도 지킬 수 있다.
(registerUSer 메소드 수정 필요 X)
public class UserEvent extends ApplicationEvent {
private final UserEventType eventType;
private final String message;
public UserEvent(Object source, UserEventType eventType, String message) {
super(source);
this.eventType = eventType;
this.message = message;
}
public UserEventType getEventType() {
return eventType;
}
public String getMessage() {
return message;
}
}
@Component
public class UserEventNotifier {
@EventListener // userEvent가 발행됐을 때, 스프링이 이 메소드를 호출할 것
public void handleUserEvent1(UserEvent userEvent) {
System.out.println("User event received 1: " + userEvent.getEventType());
}
@EventListener // userEvent가 발행됐을 때, 스프링이 이 메소드를 호출할 것
public void handleUserEvent2(UserEvent userEvent) {
System.out.println("User event received 2: " + userEvent.getEventType());
}
}
@Service
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
private final ApplicationEventPublisher eventPublisher; // User가 생성됐을 때 이벤트를 반환하기 위해 필요
// 생성자 주입
public UserServiceImpl(UserRepository userRepository, ApplicationEventPublisher eventPublisher) {
this.userRepository = userRepository;
this.eventPublisher = eventPublisher;
}
@Override
public UUID registerUser(String userName) {
User user = new User(UUID.randomUUID(), userName);
userRepository.save(user);
UserEvent event = new UserEvent(this, UserEventType.REGISTERED, "User registerd: " + userName);
eventPublisher.publishEvent(event);
return user.id();
}
