Skip to content

3.2 부트스트랩의 구조

Junggeun Lee edited this page Aug 10, 2019 · 1 revision

3.2 부트스트랩의 구조

  • 전송 계층(소켓 모드 및 I/O 종류)
  • 이벤트 루프(단일 스레드, 다중 스레드)
  • 채널 파이프라인 설정
  • 소켓 주소와 포트
  • 소켓 옵션

실제로 부트스트랩은 네트워크 애플리케이션 설정에 필요한 모든 내용을 담고 있다.

네티 부트스트랩

  • 서버 애플리케이션을 위한 ServerBootstrap 클래스
  • 클라이언트 애플리케이션을 위한 Bootstrap 클래스

부트스트랩은 빌더 패턴을 사용하여 구현되어 있기 때문에 다양한 설정을 쉽게 할 수 있다.

일반적으로 블로킹 소켓을 지원하는 서버 애플리케이션을 논플로킹 모드로 변환하는 데아주 많은 코드를 변경해야 하지만 네티는 부트스트랩의 설정을 통해서 데이터 처리 코드를 변경하지 않고 BlockingServer 또는 NonBlockingServer와 동일한 동작을 하는 애플리케이션을 작성할 수있다.

3.3 ServerBootstrap

예제 3-3 논블로킹 입출력 모드를 지원하는 ServerBootstrap 초기화

public class EchoServer {
  public static void main(String[] args) throw Exception {
    EventLoopGroup bossGroup = new NioEventGroup(1); //(1)
    EventLoopGroup workerGroup = new NioEventGroup(); //(2)
    try {
      ServerBootstrap b = new ServerBootstrap();  // (3)
      b.group(bossGroup, workerGroup)	// (4)
        .channel(NioServerSocketChannel.class) // (5) NIO 모드(논블로킹 입출력)
        .childHandler(new ChannelInitializer<SocketChannel>() {	// (6) 자식체널의 초기화 방법 정의
          @Overrode
          public void initChannel(SocketChannel ch) {	// (7)
            ChannelPipeline p = ch.pipeline();	// (8)
            p.addLast(new EchoServerHandler());	// (9) 클라이언트의 연결이 생성되었을 때 데이터 처리를 담당
          }
        });
      .... 생략 ...
    }
    finally {
      workerGroup.shutdownGracefully();
      bossGroup.shutdownGracefully();
    }
  }
}

(4)

  • bossGroup : 클라이언트의 연결을 수락하는 부모 스레드 그룹
    • 스레드 그룹네에서 생성할 최대 스레드 수를 1로 설정하였으므로 부모 스레드 그룹은 단일 스레드로 동작한다.
  • workerGroup : 클라이언트의 소켓으로부터 데이터 입출력 및 이벤트 처리를 담당하는 자식 스레드 그룹
    • 인수 없는 생성자는 사용할 스레드 수를 서버 애플리케이션이 동작하는 하드웨어 코어 수를 기준으로 결정한다.

예제 3-4 블로킹 입출력 모드를 지원하는 ServerBootstrap 초기화

public class BlockEchoServer {
  public static void main(String[] args) throw Exception {
    EventLoopGroup bossGroup = new OioEventGroup(1); //(1)
    EventLoopGroup workerGroup = new OioEventGroup(); //(2)
    try {
      ServerBootstrap b = new ServerBootstrap();  
      b.group(bossGroup, workerGroup)	
        .channel(``1.class) // (3) OIO 모드(블로킹 입출력)
        .childHandler(new ChannelInitializer<SocketChannel>() {	
          @Overrode
          public void initChannel(SocketChannel ch) {	
            ChannelPipeline p = ch.pipeline();	
            p.addLast(new EchoServerHandler());	
          }
        });
      .... 생략 ...
    }
    finally {
      workerGroup.shutdownGracefully();
      bossGroup.shutdownGracefully();
    }
  }
}