JVM/Spring
[Spring] @EventListener
글을 쓰는 개발자
2022. 10. 6. 15:51
반응형
구조 파악하기
@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에만 넘김으로서 느슨한 결합을 유지하며 레이어도 유지할 수 있게 된다.
다이어그램을 표현하면 다음과 같다.
다음과 같은 상황이 올 수 있다.
여러 도메인에서 들어오는 요청값이 다양할 수 있다. 하지만 처리에 필요한 것은 특정 값은 하나다.
그런 상황에서 비동기로 처리하기 좋은 방식은 다음 위 다이어그램과 같다.
이렇게 구성하면 느슨한 결합으로 확장성 있는 구조를 작성할 수 있게 된다.
반응형