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

네티의 핵심 인터페이스(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 에 대해서 정리 해보겠습니다.