네티의 핵심 인터페이스 정리(Channel, EventLoop, ChannelFuture, ChannelHandler, ChannelPipeline)


고성능 자바 서버를 만들기 위해 네티 학습 두번째 포스팅 입니다. 이번 포스팅에서는 네티의 핵심 인터페이스에 대해서 정리 해보겠습니다.

네티의 핵심 인터페이스(Channel, EventLoop, ChannelFuture, ChannelHandler, ChannelPipeline)

  1. Channel

    • Channel 인터페이스는 네티의 소켓이나 I/O 의 처리가 가능한 읽기, 쓰기, 연결하기, 바인딩 과 같은 기능을 제공하는 인터페이스 입니다.

    • Channel 은 아래의 기능을 제공 합니다.

      • 채널의 현재 상태 (예 : 열려 있습니까? 연결되어 있습니까?)
      • 채널 의 구성 매개 변수 (예 : 수신 버퍼 크기)
      • 채널이 지원하는 I / O 작업 (예 : 읽기, 쓰기, 연결 및 바인드)
      • ChannelPipeline채널과 관련된 모든 I / O 이벤트와 요청을 처리.
    • netty channel api

    netty channel

    • 대표적인 Channel 기능

      클래스 기능
      EmbeddedChannel 실제 연결없이 ChannelHandlers 의 테스트를 할 수 있도록 구현한 채널 클래스
      EpollChannel 최대 성능을 위해 EPOLL Edge-Triggered Mode 를 사용 하는 Linux 용으로 최적화된 채널 클래스
      KQueueChannel jni 라이브러리를 사용 하는 채널 클래스
      LocalChannel 로컬 채널 클래스
      NioServerChannel NIO 채널 클래스
      SctpChannel 멀티 스트리밍 및 멀치 호밍을 지원하는 메시지 지향 채널 클래스
  2. ChannelFuture

    • 네티의 모든 I/O 처리는 비동기식입니다. 비동기식은 I/O 작업의 호출이 완료 여부와 상관없이 즉시 반환 됩니다.
      이때 ChannelFuture 인터페이스를 통해서 I/O 처리가 완료 되었는지 확인 하고 결과를 검색 할 수 있습니다.

    • ChannelFuture 기능

      • addListener() : 작업 리스너를 등록
      • removeListener() : 작업 리스너를 제거
      • await() : I/O 작업이 완료 되기를 대기함.
      • sync() : I/O 작업이 끝날 때까지 대기 했다가 실패 하면 실패 원인을 반환함.
  3. EventLoop

    • 채널에 등록된 모든 I/O 작업을 처리하는 인터페이스 입니다.

    • EventLoop 구현 클래스

      • NioEventLoop
      • SingleThreadEventLoop
  4. ChannelHandler

    • 네티의 I/O 이벤트를 처리 하거나 작업을 가져와서 다음 처리기로 전달 하는 기능을 하는 인터페이스이며 실제로 비즈니스 로직에 의해 처리되는 부분

    • 인/아웃 바운드 핸들러

      • 인바운드 : ChannelInboundHandler
      • 아웃바운드 : ChannelOutboundHandler
  5. ChannelPipeline

    • ChannelPipeline 은 네티의 I/O 이벤트가 구동되는 순서이며 ChannelHandler 을 정의하는 API를 제공합니다.

    • 네티 이벤트 처리 다이어그램

                                                          I/O Request
                                                     via {@link Channel} or
                                                 {@link ChannelHandlerContext}
                                                               |
           +---------------------------------------------------+---------------+
           |                           ChannelPipeline         |               |
           |                                                  \|/              |
           |    +---------------------+            +-----------+----------+    |
           |    | Inbound Handler  N  |            | Outbound Handler  1  |    |
           |    +----------+----------+            +-----------+----------+    |
           |              /|\                                  |               |
           |               |                                  \|/              |
           |    +----------+----------+            +-----------+----------+    |
           |    | Inbound Handler N-1 |            | Outbound Handler  2  |    |
           |    +----------+----------+            +-----------+----------+    |
           |              /|\                                  .               |
           |               .                                   .               |
           | ChannelHandlerContext.fireIN_EVT() ChannelHandlerContext.OUT_EVT()|
           |        [ method call]                       [method call]         |
           |               .                                   .               |
           |               .                                  \|/              |
           |    +----------+----------+            +-----------+----------+    |
           |    | Inbound Handler  2  |            | Outbound Handler M-1 |    |
           |    +----------+----------+            +-----------+----------+    |
           |              /|\                                  |               |
           |               |                                  \|/              |
           |    +----------+----------+            +-----------+----------+    |
           |    | Inbound Handler  1  |            | Outbound Handler  M  |    |
           |    +----------+----------+            +-----------+----------+    |
           |              /|\                                  |               |
           +---------------+-----------------------------------+---------------+
                           |                                  \|/
           +---------------+-----------------------------------+---------------+
           |               |                                   |               |
           |       [ Socket.read() ]                    [ Socket.write() ]     |
           |                                                                   |
           |  Netty Internal I/O Threads (Transport Implementation)            |
           +-------------------------------------------------------------------+
      

정리

네티의 핵심 인터페이스의 기능 및 구현 클래스에 대해서 정리 해보았습니다.
아직 네티를 학습 하는 시작 단계이기 때문에 각 인터페이스의 의미만 조금 알았다는 것에 이번 시간을 정리 합니다.
다음 시간에는 네티의 데이터 처리를 위한 ByteBuf 에 대해서 정리 해보겠습니다.

Back to blog