티스토리 뷰

JVM/Spring

[Spring] @EventListener

글을 쓰는 개발자 2022. 10. 6. 15:51
반응형

참고 글: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/event/EventListener.html

구조 파악하기

@EventListener를 사용하는 방법은 다음과 같다.

 

 

EventPublisher

@Component
@RequiredArgsConstructor
public class EventPublisher {
    private final ApplicationEventPublisher publisher;
    public void publish(PublicEvent event) {
        publisher.publishEvent(event);
    }
}

EventSubscriber

@Component
@RequiredArgsConstructor
public class EventSubscriber {
    private final EventService service;

    @Async
    @EventListener
    public void subscribe(PublicEvent event) throws InterruptedException {
        service.doing(event);
    }
}

 

SurfaceService

@Slf4j
@Service
@RequiredArgsConstructor
public class SurfaceService {
    private final EventPublisher publisher;

    public void surface(PublicEvent event) {
        log.info("start surface");
        publisher.publish(event);
        log.info("finish surface");
    }
}

 

호출 시

2022-10-09 20:51:01.160 INFO 14161 --- [nio-8080-exec-1] c.p.s.pubsub.SurfaceService : start surface 2022- 2022-10-09 20:51:01.161 INFO 14161 --- [nio-8080-exec-1] c.p.s.pubsub.SurfaceService : finish surface 2022-10-09 20:51:03.168 INFO 14161 --- [cTaskExecutor-1] c.p.s.pubsub.EventService : eventName = hi

 

@Async만 써도 되는 데 굳이 왜 Pub Sub을 따로 구성하는 이유가 뭘까?

무엇보다 강한 레이어를 분리하는 것이 가장 큰 목표다.

 

Subscriber 는 A만 알면 되는데 그 이상의 정보를 넘기는 순간 애플리케이션 레이어 및 로직들이 꼬이게 된다.

그렇기에 Publisher에서 특정 정보만 다듬어서 Subscriber에만 넘김으로서 느슨한 결합을 유지하며 레이어도 유지할 수 있게 된다.

 

다이어그램을 표현하면 다음과 같다.

 

 

다음과 같은 상황이 올 수 있다.

 

여러 도메인에서 들어오는 요청값이 다양할 수 있다. 하지만 처리에 필요한 것은 특정 값은 하나다.

그런 상황에서 비동기로 처리하기 좋은 방식은 다음 위 다이어그램과 같다.

 

이렇게 구성하면 느슨한 결합으로 확장성 있는 구조를 작성할 수 있게 된다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함