문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
java:guava:eventbus [2017/06/22 23:40] kwon37xi [@Allow] |
java:guava:eventbus [2021/10/28 16:39] (현재) kwon37xi [Guava Event Bus] |
||
---|---|---|---|
줄 1: | 줄 1: | ||
====== Guava Event Bus ====== | ====== Guava Event Bus ====== | ||
+ | * 매우 간단하고 쉬운 [[java: | ||
+ | * [[: | ||
* [[https:// | * [[https:// | ||
* [[http:// | * [[http:// | ||
줄 6: | 줄 8: | ||
===== 왜 필요한가 ===== | ===== 왜 필요한가 ===== | ||
+ | * 개발을 하다보면 본질적인 비즈니스 로직(예: 사용자 가입. 사용자정보 검증 및 DB 저장)과 비본질적인 비즈니스에 대한 후처리 로직(예: 가입 축하 Email발송, | ||
* 실제 비즈니스 로직과 그 후처리 로직을 완전히 분리하여 비즈니스 로직을 간결하게 유지하며 코드 유지보수성을 높인다. | * 실제 비즈니스 로직과 그 후처리 로직을 완전히 분리하여 비즈니스 로직을 간결하게 유지하며 코드 유지보수성을 높인다. | ||
* 비즈니스 로직과 후처리 로직이 섞여 있으면 후처리 로직에서 발생하는 예외 등으로 인해 비즈니스 로직이 영향을 받을 수 있는데 Event Bus를 사용하면 서로간의 영향을 분리할 수 있다. | * 비즈니스 로직과 후처리 로직이 섞여 있으면 후처리 로직에서 발생하는 예외 등으로 인해 비즈니스 로직이 영향을 받을 수 있는데 Event Bus를 사용하면 서로간의 영향을 분리할 수 있다. | ||
- | * 비즈니스에 직접적인 관련이 없는 코드를 추가할 일이 있을 때마다 비즈니스 코드 자체를 수정하는 것은 [[https:// | + | * 비즈니스에 직접적인 관련이 없는 코드를 추가할 일이 있을 때마다 비즈니스 코드 자체를 수정하는 것은 [[https:// |
+ | * 비즈니스 코드의 마지막에서 Event를 발생시키고, | ||
- | ===== 종류 | + | ===== 정리 |
* [[https:// | * [[https:// | ||
* 이벤트를 발생('' | * 이벤트를 발생('' | ||
줄 16: | 줄 20: | ||
* [[https:// | * [[https:// | ||
* 이벤트를 발생시킨 쓰레드가 지정된 쓰레드풀의 **별도 쓰레드**에서 처리 | * 이벤트를 발생시킨 쓰레드가 지정된 쓰레드풀의 **별도 쓰레드**에서 처리 | ||
+ | |||
+ | * '' | ||
+ | * 첫번째 인자값으로 된 이벤트를 받아서 처리한다. 이 메소드는 **무조건 하나의 파라미터**만 가지고 있어야 한다. | ||
+ | * '' | ||
+ | * 하나의 Listener 클래스에는 여러개의 '' | ||
* 간단한 동기 / 비동기 이벤트 예제 : [[https:// | * 간단한 동기 / 비동기 이벤트 예제 : [[https:// | ||
<code java> | <code java> | ||
줄 59: | 줄 68: | ||
</ | </ | ||
- | 결과.. EventBus는 '' | + | 결과.. |
- | < | + | |
- | 22: | + | |
- | 22: | + | |
- | 22: | + | |
- | 22: | + | |
- | 22: | + | |
- | 22: | + | |
- | 22: | + | |
- | 22: | + | |
- | 22: | + | |
- | 22: | + | |
- | 22: | + | |
- | 22: | + | |
- | </ | + | |
===== @AllowConcurrentEvents ===== | ===== @AllowConcurrentEvents ===== | ||
- | * '' | + | * 기본적으로 |
+ | * '' | ||
+ | * 멀티 쓰레드 환경(Web 환경 등)에서는 **특별한 사유가 없다면 '' | ||
+ | * [[https:// | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ===== DeadEvent 받기 ===== | ||
+ | * 어떠한 subscriber도 없는 죽은 이벤트 받기 | ||
+ | <code java> | ||
+ | @Subscribe | ||
+ | public void handleDeadEvent(DeadEvent deadEvent) { | ||
+ | // do something | ||
+ | } | ||
+ | </ | ||
===== 주의할 점 ===== | ===== 주의할 점 ===== | ||
- | * 특별한 이유가 없다면 '' | + | * Guava EventBus 는 메시지 객체의 Type 검사를 하지 않기 때문에 쉽게 잘못된 객체를 메시지로 던지는 실수를 할 수 있다. |
- | * Spring 연동시 Listener의 '' | + | * 트랜잭션이 연결된 쓰레드에서 이벤트가 발생할 경우, 만약 이벤트 버스에서 오류가 발생하면 해당 트랜잭션 전체가 롤백될 수 있다. |
+ | * Spring 연동시 Listener의 '' | ||
+ | * Spring | ||
* 따라서 EventBus 선언과 '' | * 따라서 EventBus 선언과 '' | ||
- | * '' | + | |
+ | | ||
* subscribe 메소드에서 예외를 발생시키지 말도록 한다. EventBus가 예외를 로깅해주긴 하지만 그것에 의존하지 말 것. | * subscribe 메소드에서 예외를 발생시키지 말도록 한다. EventBus가 예외를 로깅해주긴 하지만 그것에 의존하지 말 것. | ||
+ | * '' |