스프링
옵저버 패턴을 이용하여 결합도를 낮출 수 있다.
스프링의 내장객체 ApplicationEvent
와 ApplicationEventPublisher
가 이 기능을 제공해준다.
예
private final ApplicationEventPublisher publisher;
//...
@Transactional
public RsData cancel(LikeablePerson likeablePerson) {
publisher.publishEvent(new EventBeforeCancelLike(this,likeablePerson));
//...
}
publisher를 통해 이벤트를 발생시킬 수 있다.
@Component
@RequiredArgsConstructor
public class InstaMemberEventListener {
private final InstaMemberService instaMemberService;
@EventListener
@Transactional
public void listen(EventAfterModifyAttractiveType event) {
instaMemberService.whenAfterModifyAttractiveType(event.getLikeablePerson(), event.getOldAttractiveTypeCode());
}
@EventListener
public void listen(EventAfterLike event) {
instaMemberService.whenAfterLike(event.getLikeablePerson());
}
@EventListener
public void listen(EventBeforeCancelLike event) {
instaMemberService.whenBeforeCancelLike(event.getLikeablePerson());
}
@EventListener
public void listen(EventAfterFromInstaMemberChangeGender event) {
instaMemberService.whenAfterFromInstaMemberChangeGender(event.getInstaMember(), event.getOldGender());
}
}
빈의 메소드가 @EventListener로 설정돼있는 경우 특정 이벤트가 발생하면
그 이벤트 객체를 인자로 받아 메서드가 실행된다.
마치 catch절이 특정 클래스의 exception에 반응하는 것과 비슷하다.