Event-Driven Programming
Event-Driven Programming은 기존의 절차적 실행흐름이 아니라 이벤트에 의해 실행흐름이 정해지는 프로그래밍 방법입니다. GUI(Graphical User Interface)가 발전하면서 Event-Driven 방식도 발전해왔습니다.
Event-Driven Architecture
위 그림은 Event-Driven Programming 방식을 지원하는 Event-Driven Architecture의 간단한 모식도입니다. 주요 컴포넌트와 그 역할은 아래와 같습니다.
- Event Loop
- Event를 적재하거나 Event의 상태를 관찰합니다.
- Event의 상태 또는 특정 조건에 따라 Event Handler에게 Event 처리 작업을 위임합니다.
- 상황에 따라 여유 공간이 있는 다른 Event Loop에 Event를 전달하기도 합니다.
- Event Handler
- 위임된 Event에 적합한 실제 행동을 수행합니다.
- Event Handler에 적합한 행동을 등록해주면 Event를 간단히 제어할 수 있게 됩니다. 개발자는 Event Handing에 집중할 수 있습니다.
- Exception Handler
- Exception Handler는 Event Handle 작업에서 예외가 발생했을때 처리하는 역할을 합니다.
Event-Driven Architecture를 따르는 프로그램은 각 컴포넌트의 작업을 언어 레벨에서 알아서 처리해줍니다. (Event Loop를 돌면서 Event 발생을 감지하고 적합한 Handler에 위임해주는 부분)
사실 Event-Driven 방식은 효율적인 서버 모델로 활용되고 있습니다. 서버의 관점에서는 Event가 일종의 사용자의 요청과 다를바가 없기 때문입니다. 실례로, Node.js, Spring WebFlux는 Event-Driven Architecture를 따릅니다.
WebFlux Flow
위 그림은 Spring WebFlux의 전반적인 실행 흐름을 나타냅니다. WebFlux에서 모든 요청은 Event와 Callback 정보를 가진채로 Event Loop에 들어옵니다.
그림에는 없지만 Event Loop에는 Event를 받는 역할만을 전담하는 Request Thread가 하나 있습니다. 이 Request Thread는 들어온 요청을 다시 한 Thread Pool에 위임하는데, 이 Pool은 고정 되거나 적은 수의 Thread를 가집니다. (Fixed/Small Number of Threads) 사실 Event Loop의 주요 역할을 이 Thread Pool에서 관리하는 Thread들에서 처리하게 됩니다. Event Loop의 주요 역할은 아래와 같습니다.
- 적합한 Event Hanlder로 Event 처리를 위임하고, 즉시 Request Thread로 부터 들어온 다른 Event를 처리합니다.
- Event Handler로 부터 Event 처리 작업이 완료되면, 그 결과 Event를 받아 초기에 Callback 정보로 Callback 실행을 위임합니다.
WebFlux는 Event-Driven 방식으로 적은 수의 쓰레드를 사용하기 때문에 자연스럽게 적은 메모리를 사용하고 쓰레드간의 context switching도 적기 때문에 성능이 좋아집니다.
'IT > Spring WebFlux' 카테고리의 다른 글
Reactor Core - Mono & Flux (0) | 2020.12.14 |
---|---|
Project Reactor (0) | 2020.12.13 |
Back Pressure (0) | 2020.11.07 |
Non-Blocking (0) | 2020.11.07 |
Spring WebFlux (1) | 2020.11.06 |