Skip to content

3. 부트스트랩

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

3. 부트스트랩

부트스트랩 설정

  • 이벤트 루프
    • 소켓 채널에서 발생한 이벤트를 처리하는 스레드 모델에 대한 구현
  • 채널의 전송 모드
    • 블로킹, 논블로킹, epoll
    • epoll은 입출력 다중화 기법으로써 현재까지 알려진 입출력 방식 중에 가장 빠르다. 하지만 리눅스에서만 동작하며 커널 버전 2.6부터 사용할 수 있다.
  • 채널 파이프라인
    • 연결된 채널에서 사용할 데이터 핸들러에 대한 내용을 포함

3.1 부트스트랩의 정의

부트스트랩은 네티로 작성한 네트워크 애플리케이션의 동작 방식과 환경을 설정하는 도우미 클래스이다.

예시

  • NIO 소켓 모드를 지원하는 서버 소켓 채널
  • 데이터를 변환하여 데이터베이스에 저장하는 데이터 처리 이벤트 핸들러
  • 애플리케이션이 사용할 8088번 포트 바인딩
  • 단일 스레드를 지원하는 이벤트 루프에 대한 설정

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(OioServerSocketChannel.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();
    }
  }
}