질문을 삭제하지 말아주세요.!
 
1
0
-1

슬랙에 올라온 질문에 대한 답변입니다. https://modernpug.slack.com/archives/C0MGYSQ0L/p1500860354304850


라라벨 빨간책보면서 이벤트 리스너를 보면서 이벤트가 전체적인 프로세스에 어디에 해당하는지 궁금해서요 진행되는 순서가 어떻게 되나요. ? 
사용자 URL -> ROUTE -> CONTROLLER -> EVENT -> MODEL 요런 순서가 되는건가요. ? 
저는 바로 CONTROLLER -> MODEL 이렇게 호출했었는데.. ㅠㅠ


"빨간책"이라 불리는 것에 무감각해하고 있었는데, 요즘과 같이 컨텐츠가 많지 않던 고딩 시절 친구들과 조퇴하며 돌려보던(내 순서인 날 조퇴 ㅎㅎ) 그 책이 생각납니다. 지금은 이런 기억을 떠 올리는 사람이 거의 없어서 거부감이 전혀 없고, 오히려 책 제목보다는 Red Book, Blue Book 처럼 색깔로 기억하고 불러주시는 분들에게 고마울 따름입니다.

이벤트는 질문에 쓰신것처럼 "순서"라든가 "라이프싸이클"이 딱히 있지는 않습니다. 웹 프런트나 모바일 앱 개발 경험이 있는 분들은 이벤트를 많이 사용하셨을 겁니다. "메뉴 버튼이 클릭되면, 화면을 전환한다"에서 "~하면"이 이벤트입니다. 그리고 "~한다"가 이벤트 핸들러(=~리스너)입니다.

서버 개발에서도 똑 같습니다. 사용자가 로그인하면 최근 로그인 시각을 DB에 기록한다, 주문을 취소하면 환불 프로세스를 시작한다.. 등등 과거에 일어난 어떤 사건이 이벤트입니다. 그리고 과거의 사건에 반응하는 모듈이 이벤트 핸들러입니다.

FooBox를 처리할 수 있는 FooBoxHandler간의 페어를 어딘가에 기록해 놓습니다. 그리고 누군가는 FooBox에 방금 일어난 사건에 대한 정보를 담아 박스를 만들고, FooBox 만들었다고 공표하겠지요. 페어 기록을 알고 있는 Bus+Dispatcher가 FooBox를 처리할 FooBoxHandler에게 박스를 통째로 넘겨주면서, 약속된 함수(=~handle)를 실행시켜 줍니다.

라라벨에서는 `EventServiceProvider`에 `OrderCanceled::class => [RefundHandler::class]`처럼 등록하고, `OrderController`나 `CancelOrderService` 클래스에서 `Event::fire(new OrderCanceled($order));`와 같이 이벤트를 던질 수 있습니다. 그리고, `RefundHandler`는 `RefundService`와 `EmailNotifier`과 같은 객체를 주입받아 환불을 처리하고 처리 결과를 메일로 알려 줄 수 있을 겁니다.

하나의 서비스 클래스에서 여러 개의 모델의 상태를 변경해야 할 때, 서비스간의 "1) 결합도를 낮추기 위해"" 이벤트를 사용하면 좋습니다. 가령 앞서 언급한 주문을 취소하면 환불 처리를 해야 하는데 주문과 환불을 하나의 서비스 클래스에서 동시에 처리해야 하는 상황인거죠(삐~ 엄격하게 따지면 디자인 원칙 위반입니다). 새 회원이 가입하면 가입 확인 메일을 보내는 등의 일 등에 사용합니다. 또는 서로 다른 두 시스템간의 "2) 데이터를 동기화"하기 위해서도 사용합니다.

(물론 비동기를 위한 다른 방법도 많지만) 이벤트가 중요한 또 하나의 이유는 큐 워커를 이용한 비동기 처리를 위해서 입니다. 비동기 관련해서, 아래 그림으로 답변한 적이 있는데, 잘 안찾아지네요.

    CommentAdd your comment...