Netty - bootstrap

가수왕·2023년 1월 12일

정의

  • 네티로 작성한 애플리케이션이 시작할 때 가장 처음 수행되는 부분, 수행할 동작과 각종 설정을 지정함
  • 부트스트랩 설정은 크게 이벤트루프, 채널의 전송모드, 채널 파이프라인으로 나뉜다.
  • 이벤트루프
    • 소켓 채널에서 발생한 이벤트를 처리하는 스레드 모델에 대한 구현이 담겨있다.
    • 소켓 모드에 따라 이벤트루프의 구현체가 달라지기도 함
  • 전송모드
    • 블로킹, 논블로킹, epoll로 지정 가능
  • 채널 파이프라인
    • 소켓 채널로 수신된 데이터를 처리할 핸들러를 지정

부트스트랩의 논리적 구조

  • 부트스트랩에서 위와 같은 설정이 가능하다. 사실상 네트워크 애플리케이션에 필요한 모든 내용을 담고 있다.
  • 네트워크 애플리케이션 구성

💡 소켓 모드/옵션, 데이터처리 스레드, 프로토콜로 구성된다.

  • 부트스트랩의 프로토콜은 채널 파이프라인에 등록되는 인코더, 디코더에서 처리한다.

부트스트랩 사용

//생성자의 인자는 스레드 그룹 내 생성할 최대 스레드 수
//인스턴스는 사용할 소켓 모드에 따라 다름
//NioEventLoopGroup, OioEventLoopGroup, EpollEventGroup
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try{
	ServerBootstrap b = new ServerBootStrap();
	//부트스트랩 초기 설정
	//이벤트루프 설정
	b.group(bossGroup,workerGroup)
		//소켓 모드 및 I/O종류 설정
	 .channel(NioSeverSocketChannel.class)
		//ChannelInitializer는 클라이언트와 연결된 채널이 초기화될 때 해야하는 행동 지정
	 .childHandler(new ChannelInitializer<SocketChannel>(){
			//채널 초기화시 다음과 같은 행동을 함
			@Override
			public void initChannel(SocketChannel ch){
					//채널 파이프라인 객체 생성
					ChannelPipeline p = ch.pipeline();
					//파이프라인에 이벤트 핸들러 등록
					 p.addLast(이벤트핸들러);
			}
		})
}...

group() - 이벤트 루프 설정

  • ServerBootstrap(서버용)은 연결수락 이벤트루프데이터 송수신처리 이벤트루프 등록 가능
  • Bootstrap(클라이언트용) 데이터 송수신처리 이벤트루프 등록 가능
  • 위와 같은 이유로 AbstractBootstrap 클래스의 group()은 하나의 이벤트 루프만 설정 가능 Bootstrap은 해당메소드를 그냥 사용, ServerBootstrap은 group()을 오버라이딩해 2개의 이벤트루프를 인자로 받음

channel() / channelFactory() - 소켓 입출력 모드

  • 소켓 입출력 모드 설정

handler() - 서버 소켓 채널 이벤트 핸들러 설정

  • 서버 소켓채널에서 발생하는 이벤트 수신 및 처리

childHandler() - 소켓 채널 데이터 가공 핸들러 설정

  • 서버에 연결된 클라이언트 소켓 채널 에서 발생하는 이벤트 수신 및 처리

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

  • 종류

childOption() - 클라이언트 소켓 채널 옵션

  • 서버에 접속한 클라이언트 소켓 채널에 대한 옵션을 설정할 때 사용

파이프라인 및 이벤트 핸들러

파이프라인 초기화 순서

  1. 클라이어트 연결에 대응하는 소켓 채널 생성 빈 채널 파이프라인 객체 생성, 소켓 채널에 할당
  2. 소켓 채널에 등록된 ChannelInitializer 인터페이스의 구현체를 가져와 initChannel메소드 호출
  3. 소켓 채널 참조로부터 1에서 등록한 파이프라인을 가져오고 채널 파이프라인에 입력된 이벤트 핸들러 객체를 등록한다.

채널 인바운드 이벤트

  • 인바운드 이벤트
    • 소켓 채널에서 발생한 이벤트 중 연결 상대방이 어떤 동작을 취했을 때 발생
    • 채널 활성화, 데이터 수신등의 이벤트
    • ChannelInboundHandler 인터페이스 제공
    • 주요 이벤트 목록
      • channelRegistered - 2번 발생, 처음 서버 소켓 생성할때 + 클라이언트 소켓 채널 생성될때
      • channelActive
      • channelRead
      • channelReadComplete
      • channelInactive
      • channleUnregisted
  • 아웃바운드 이벤트
    • 네티 사용자가 요청한 동작에 해당하는 이벤트
    • 연결 요청, 데이터 전송, 소켓 닫기 등
    • ChannelOutboundHandler 인터페이스 제공
    • 주요 이벤트 목록
      • bind 이벤트
        서버 소켓 채널이 클라이언트 연결을 대기하는 IP와 포트가 설정되었을 때
      • connect 이벤트
        클라이언트 소켓 채널이 서버에 연결되었을 때
      • disconnect 이벤트
        클라이언트 소켓 채널의 연결이 끊어졌을 때
      • close 이벤트
        클라이언트 소켓 채널의 연결이 닫혔을 때
      • write 이벤트
        소켓 채널에 데이터가 기록되었을 때
      • flush 이벤트
        flush메소드 호출시 발생

이벤트 메소드 실행 순서

  1. 이벤트루프가 채널 파이프라인에 등록된 첫 번째 이벤트 핸들러를 가져옴
  2. 해당 핸들러에 발생한 이벤트 메서드가 구현된 상태면 실행
  3. 그렇지 않으면 다음 이벤트 핸들러 가져옴
  4. 2or3 실행
  5. 마지막 이벤트 핸들러에 도달할 때까지 반복

자바네트워크소녀 네티 참고

0개의 댓글