Java/Netty

[Netwok/Netty]06. Netty 구축을 위한 beans(2) - ServerBootstrap

양승길 2017. 10. 20. 22:15

[Netwok/Netty]06. Netty 구축을 위한 beans(1) - ServerBootstrap

(출처 : http://javafactory.tistory.com/1382)

1. Beans

    • public abstract class AbstractBootstrap<Generic........>
      bootstrab의 사전적 의미는 한 번 시작하면 알아서 진행되는 일련의 과정을 말한다.
      이 추상클래스는 헬퍼클래스로서 서버든 클라이언트든 이를 상속시켜주어 실제 소켓을 구현하게 도움을 준다.
      특히 단어의 특성에 따라 method chaining이 가능하다.
      기동을 하기위한 전체적인 일종의 틀 혹은 컨테이너.
    • public class ServerBootStrap
      extends AbstractBootstrap<ServerBootstrap, ServerChannel>
      실제 서버를 구현하는 부트스트랩.
      클라이언트의 연결을 수락하고 연결된 클라이언트 소켓에 대하여 입출력을 처리하는 두 개의 쓰레드 그룹을 관리한다.
      하나의 쓰레드 그룹으로도 지정할 수는 있지만, 원활한 병행처리를 위하여 두 개의 그룹을 생성하기를 권장한다.

    • public class BootStrap extends AbstractBootstrap<Bootstrap, ServerChannel>
      실제 클라이언트를 구현하는 부트스트랩. connect라는 method를 통해 해당 주소에 연결한다.
2. Methods
    • public ServerBootstrap group
      (EventLoopGroup parentGroup, EventLoopGroup, childGroup)
      이벤트 루프 설정.
      클라이언트의 연결을 수락하고 연결된 클라이언트 소켓에 대하여 입출력을 처리하는 두 개의 쓰레드 그룹을 관리한다.
      하나의 쓰레드 그룹으로도 지정할 수는 있지만, 원활한 병행처리를 위하여 두 개의 그룹을 생성하기를 권장한다.
    • public B channel(Class<? extends C> channelClass)
      '해당 서버 부트스트랩에 지정할 채널에 대하여 어떤 방식으로 통신할 것인가'를 지정한다.
      부모클래스의 AbstractBootstrap을 상속받고 있고 개발자가 원하는 채널을 지정할 수 있다.
      지금은 nio만 할 것이므로 NioServerSocketChannel.class를 사용한다.
    • public <T> B option(ChannelOption<T> option, T value)
      AbstractBootstrap으로 부터 상속받았다.
      상속받은 method들은(option, handler) 최초 서버 기동에 대한 초기설정에 불과하다.
      최초 클라이언트로부터 연결에 대한, 서버 자신의 채널(혹은 소켓)옵션을 지정한다.
      이 종류는 ChannelOption에서 확인이 가능하다. 

      참고로 매개변수 SO_BACKLOG, 100의 의미는 
      클라이언트로부터의 연결이 들어오는 큐에 대하여 몇 개까지 지정할 수 있는가를 말한다.

    • public B handler(ChannelHandler handler)
      본 method를 통해 해당 서버소켓(혹은 채널)에서 발생 되는 이벤트들을 담당한다.
      LoggingHandler는 서버에서 발생되는 모든 이벤트들을 Log로 출력한다.
      본 Bean을 들여다보면 
      ChannelInboundHandler를 상속받고 ChannelOutboundHandler를 구현받고 있다.
      이 말인 즉슨 서버입장에서 당발, 타발에 대한 이벤트들을 Log로 출력한다는 의미로 볼 수 있다.

    • public ServerBootstrap childHander(ChannelHander handler)
      ServerBootstrap에서 구현된 child method(childHandler, childOption)이다.
      클라이언트로 부터 연결이 들어 올 때, 본 method를 통해서 해당 클라이언트와의 발생되는 이벤트들을 관리하게 된다.
      매개변수는 ChannelInitializer를 작성함으로서, 새로 연결된 Channel과 환경설정을 지정해준다.
      대부분 ChannelPipeline을 이용하여 handler들을 계속 추가한다.
      실제 이벤트가 발생되면 어떤 동작을 취하는지는 본 method를 통해 작성할 수 있다.

    • public <T> ServerBootstrap childOption
      (ChannelOption<T> childOption, T value)
      클라이언트로 부터 연결이 온 후에 해당 소켓(혹은 채널)에 대한 옵션을 지정한다.
      SO_KEEPALIVE의 의미는 해당 클라이언트와 연결한 세션에 대하여 종료여부를 감지하는 것을 말한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public static void main(String[] args) {
        
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        
        try{
            // 서버 부트스트랩 생성
            ServerBootstrap b = new ServerBootstrap();
            
            // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 서버 회선 설정 시작. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        
            // 이벤트루프 설정
            b.group(bossGroup, workerGroup)
            // 채널입출력방식 설정
            .channel(NioServerSocketChannel.class)
            
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 서버부트스트랩의 초기화가 진행될때. 시작 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            // 최초 클라이언트로부터의 연결이 들어오는 큐에 대하여 100개까지 지정.
            .option(ChannelOption.SO_BACKLOG, 100)
            // 이벤트 핸들러 설정 - 로그핸들러로 지정.
            .handler(new LoggingHandler(LogLevel.INFO))
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 서버부트스트랩의 초기화가 진행될때. 끄읕 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            
            
            // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 클라이언트로부터 연결이 완료된 후. 시작 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            // 새로 연결된 채널과 이벤트 핸들러 설정
            .childHandler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel paramC) throws Exception {
                    paramC.pipeline().addLast(new ByteArrayDecoder());
                    paramC.pipeline().addLast(new EchoServerHandler());
                    paramC.pipeline().addLast(new ByteArrayEncoder());
                }
            })
            // 세션 해제 여부 감지.
            .childOption(ChannelOption.SO_KEEPALIVE, true);
            // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 클라이언트로부터 연결이 완료된 후. 끄읕 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            
            // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 서버 회선 설정 끄읕. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            
            ChannelFuture f = b.bind(PORT).sync();
            f.channel().closeFuture().sync();
            
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
cs