문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
|
java:guava:eventbus [2017/06/22 23:48] kwon37xi [@AllowConcurrentEvents] |
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:// | ||
| * 이벤트를 발생('' | * 이벤트를 발생('' | ||
| 줄 17: | 줄 21: | ||
| * 이벤트를 발생시킨 쓰레드가 지정된 쓰레드풀의 **별도 쓰레드**에서 처리 | * 이벤트를 발생시킨 쓰레드가 지정된 쓰레드풀의 **별도 쓰레드**에서 처리 | ||
| - | * '' | + | * '' |
| + | * 첫번째 인자값으로 된 이벤트를 받아서 처리한다. 이 메소드는 **무조건 하나의 파라미터**만 가지고 있어야 한다. | ||
| + | * '' | ||
| * 하나의 Listener 클래스에는 여러개의 '' | * 하나의 Listener 클래스에는 여러개의 '' | ||
| * 간단한 동기 / 비동기 이벤트 예제 : [[https:// | * 간단한 동기 / 비동기 이벤트 예제 : [[https:// | ||
| 줄 62: | 줄 68: | ||
| </ | </ | ||
| - | 결과.. EventBus는 '' | + | 결과.. |
| - | < | + | |
| - | 22: | + | |
| - | 22: | + | |
| - | 22: | + | |
| - | 22: | + | |
| - | 22: | + | |
| - | 22: | + | |
| - | 22: | + | |
| - | 22: | + | |
| - | 22: | + | |
| - | 22: | + | |
| - | 22: | + | |
| - | 22: | + | |
| - | </ | + | |
| ===== @AllowConcurrentEvents ===== | ===== @AllowConcurrentEvents ===== | ||
| - | * 기본적으로 '' | + | * 기본적으로 '' |
| * '' | * '' | ||
| * 멀티 쓰레드 환경(Web 환경 등)에서는 **특별한 사유가 없다면 '' | * 멀티 쓰레드 환경(Web 환경 등)에서는 **특별한 사유가 없다면 '' | ||
| * [[https:// | * [[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가 예외를 로깅해주긴 하지만 그것에 의존하지 말 것. | ||
| + | * '' | ||