(1) Netty Bootstrap이란?


- 애플리케이션의 동작 및 설정을 지정해주는 헬퍼클래스






(2)  Bootstrap의 종류


- ServerBootstrap

- bootstrap


=> bootstrap은 클라이언트에서 사용하며, 구조적으로 ServerBootstrap과 동일








(3)  Bootstrap의 논리적구조






(4)  Bootstrap의 예제코드


public EchoServer() {


   public static void main(String[] args){

        bossGroup = new NioEventLoopGroup(1);  // 생성자에 1이므로 단일스레드로 동작하는 객체

        workerGroup = new NioEventLoopGroup(); // 생성자 인수가 없으면 cpu 코어 수에 따라 설정된다.


    bootstrap = new ServerBootstrap();

    bootstrap.group(bossGroup, workerGroup) // boss – 연결, worker - 입출력

        .channel(NioServerSocketChannel.class) // 부모쓰레드(boss) 입출력모드 설정 NIO모드

        .childHandler(new ChannelInitializer<SocketChannel>() { //worker쓰레드 자식 채널의 초기화

          @Override

          protected void initChannel(SocketChannel socketChannel) throws Exception {

            ChannelPipeline pipeline = socketChannel.pipeline();

            // 핸들러 추가

            pipeline.addLast(new EchoServerHandler());

          }

        });


     }

 bootstrap.bind(host,port).sync();  //socket 주소와 port binding

  }






(5)  Bootstrap의 구체적인 옵션


group: 이벤트 루프 설정

클라이언트와 달리 이벤트 루프가 2개 필요


channel: 소켓 입출력 모드 설정

LocalServerChannel: 로컬 가상 통신을 위한 소켓 채널

OioServerSocketChannel: Blocking 소켓 채널

NioServerSocketChannel: Nonblocking 소켓 채널

EpollServerSocketChannel: epoll 소켓 채널 (리눅스에서만적용)

OioSctpServerChannel: Blocking sctp 소켓 채널

NioSctpServerChannel: Nonblocking sctp 소켓 채널

SCTP(Stream Control Transmission Protocol): Layer 4 protocol

NioUdtByteAcceptiorChannel: Nonblocking udt 소켓 채널

NioUdtMessageAcceptorChannel: blocking udt 소켓 채널

UDT(UDP-Based Data Transfer): Layer 7 protocol


channelFactory: 소켓 입출력 모드 설정

Netty에서 기본 제공하는 channel class보다 더 복잡한 로직이 필요할 때 사용


handler: 서버 소켓 채널의 이벤트 핸들러 설정

부모 쓰레드에서 발생한 이벤트만 처리


childHandler: 클라이언트 소켓 채널의 이벤트 핸들러 설정

자식 쓰레드에서 발생한 이벤트만 처리


option - 서버 소켓 채널의 소켓 옵션 설정

기본적으로 자바에서 설정할 수 있는 모든 소켓 옵션 설정 가능

TCP_NODELAY: Nagle 알고리즘 비활성화 여부 설정

SO_KEEPALIVE: 정해진 시간마다 keepalive packet 전송

SO_SNDBUF: 커널 송신 버퍼 크기

SO_RCVBUF: 커널 수신 버퍼 크기

SO_REUSEADDR: TIME_WAIT 상태의 포트에도 bind 가능해짐

SO_LINGER: 소켓을 닫을 때 송신 버퍼에 남은 데이터 전송 대기 시간

SO_BACKLOG: 동시에 수용 가능한 소켓 연결 요청 수


childOption: 클라이언트 소켓 채널의 소켓 옵션 설정









Netty Framework


네티는 전 세계에서 많은 개발자가 사용하는 범용 자바 네트워크 애플리케이션 프레임워크입니다.


다양한 오픈소스 프레임워크 내부에서 사용되고 있으며, 카카오/라인/애플/트위터 등 서비스 제공 업체에서도 사용됩니다.


네티는 Non-block 비동기 처리가 가능하기에 고성능으로 시스템을 유지할 수 있습니다.


또한, 상당 부분 프로그래머의 귀찮은 작업을 네티가 알아서 처리해줍니다.. ( 멀티 쓰레드 처리와 같은..)


훌륭하게도, 최소 10만 이상의 클라이언트의 접속이 가능합니다. 


Netty의 구조와 주요특징을 정확하게 알고 사용법을 익힌다면 , 효과적으로 네티 프레임워크를 사용할 수 있을 것입니다.




https://netty.io/


네티 공식 사이트에서 네티를 다음과 같이 정의하고 있습니다.



Netty는 비동기 이벤트 기반 네트워크 응용 프로그램 프레임 워크입니다.

유지 보수가 가능한 고성능 프로토콜 서버 및 클라이언트를 신속하게 개발할 수 있습니다.


Netty는 프로토콜 서버 및 클라이언트와 같은 네트워크 응용 프로그램을 빠르고 쉽게 개발할 수있는 NIO 클라이언트 서버 프레임 워크입니다.

 TCP 및 UDP 소켓 서버와 같은 네트워크 프로그래밍을 크게 간소화하고 간소화합니다.








주요 특징



네티 공식 홈페이지에선, 네티의 주요 특징을 첫줄에 정의하고 있습니다.

1. 비동기 이고 , 2. block&non-block 이 가능한, 3. 이벤트 기반 네트워크 프레임워크이다.





(1) 동기 / 비동기 처리 

- 동기: 특정 서비스를 호출하면 처리가 완료될 때까지 기다렸다가 결과를 받는 방식

-  비동기: 서비스를 호출하여 즉시 응답을 받고, 다른 작업을 하다가 처리가 완료되었는지 확인하여 결과를 받는 방식. NettryReactor 패턴 사용하고 있습니다.



(2)블로킹/논블로킹 소켓

블로킹 : read, write, accept 등의 메서드가 호출되면 완료될 때까지 쓰레드가 멈춤

- 논블로킹: 하나의 스레드로 여러 클라이언트 대응 가능




(3)이벤트 기반 프로그래밍

- 네트워크 이벤트의 주체는 소켓

- 데이터를 소켓에 전달하기 위해 데이터 핸들러 이용

- 로직 분리, 코드 재사용성 증가, 에러 처리 부담 완화


이벤트의 예) 연결 요청 , 데이터 전송, 데이터 수신







=> 다음과 같은 3가지 특징과 구조를 생각하며 , 네티를 사용한다면 조금 더 구조적으로 혹은 단계적으로 손쉽게 접근이 가능 할 것 같습니다.




참고

- https://netty.io/

- 자바 네트워크 소녀 Netty 

















+ Recent posts