"자바 네트워크 소녀 Netty" 공부하면서 정리한 내용입니다.
1. 부트스트랩이란?
부트스트랩은 네티로 작성한 네트워크 애플리케이션의 동작 방식과 환경을 설정하는 도우미 클래스이다.
부트스트랩의 구조 및 네티 환경 설정은 다음과 같다
- 전송 계층(소켓 모드 및 I/O 종류)
- 이벤트 루프(단일 스레드, 다중 스레드)
- 채널 파이프라인 설정
- 소켓 주소와 포트
- 소켓 옵션
부트스트랩은 빌더 패턴을 사용하여 구현되어 있기 때문에 다양한 설정을 쉽게 할 수 있다.
부트스트랩은 ServerBootstrap / Bootstrap 클래스로 나뉘며, 둘다 AbstractBootstrap 추상클래스를 상속받는다.
2. ServerBootstrap
서버 애플리케이션을 구현할 때 사용.
a. ServerBootstrap 설정 예시
EventLoopGroup bossEventLoopGroup = new NioEventLoopGroup(1); // 1
EventLoopGroup workerEventLoopGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap(); // 2
bootstrap.group(bossEventLoopGroup, workerEventLoopGroup) // 3
.channel(NioServerSocketChannel.class) // 4
.childHandler(new ChannelInitializer<SocketChannel>() { // 5
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception { // 6
ChannelPipeline p = socketChannel.pipeline(); // 7
p.addLast(new EchoServerHandler()); // 8
}});
} finally {
workerEventLoopGroup.shutdownGracefully();
bossEventLoopGroup.shutdownGracefully();
}
1. NioEventLoopGroup 객체를 할당.생성자에 인수가 없으면 cpu 코어수에 따라 스레드가 결정남. 인수를 주면 인수만큼 스레드를 사용한다.(ex. boosEventLoopGroup은 단일스레드로 동작)
2. ServerBootstrap 생성
3. 부트스트랩에 쓰레드를 등록한다. 첫번째 인수는 부모, 두번째는 자식인데 부모스레드는 연결 요청을 담당하고 자식스레드는 I/O 처리를 담당한다.
4. 부모 스레드가 사용할 네트워크 입출력 모드를 설정 (NIO 모드로 설정)
5. 자식 채널 초기화 방법 설정
6. 연결된 채널이 초기화 설정 메서드
7. 채널 파이프라인 객체 생성
8. 파이프라인에 핸들러 등록 (연결이 되었을 때 데이터 처리 담당)
b.입출력 모드 변경
- 논블로킹 I/O 모드 : NioEventLoopGroup, NioServerSocketChannel, NioSocketChannel
블로킹 I/O 모드: OioEventLoopGroup, OioServerScoketChannel, OioSocketChannel- Epoll I/O 모드: EpollEventLoopGroup, EpollServerSocketChannel, EpollSocketChannel (Linux 환경에서만 사용가능)
OioEventLoopGroup 블로킹 I/O 모드는 deprecated 됨.
c. Serverbootstrap API
- group: 이벤트 루프 설정
- Serverbootstrap은 연결요청 담당, I/O 담당 2개의 이벤트 루프가 필요(클라이언트는 1개)
- channel: 소켓 입출력 모드 설정
- LocalServerChannel: 가상 통신을 위한 서버 소켓 채널을 생성
- OioServerSocketChannel: 블로킹 모드의 서버 소켓 채널을 생성
- NioSeverSocketChannel: 논블로킹 모드의 서버 소켓 채널을 생성
- EpollServerSocketChannel: 리눅스 커널의 epoll 입출력 모드를 지원하는 서버 소켓 채널을 생성
- OioSctpServerSocketChannel: SCTP 전송계층을 사용하는 블로킹 모드의 서버 소켓 채널을 생성
- NioSctpServerSocketChannel: SCTP 전송계층을 사용하는 논블로킹 모드의 서버 소켓 채널을 생성
- NioUdtByteAcceptorChannel: UDT 프로토콜을 지원하는 논블로킹 모드의 서버 소켓 채널을 생성(내부적으로 스트림 데이터를 처리)
- NioUdtMessageAcceptorChannel: UDT 프로토콜을 지원하는 블로킹 모드의 서버 소켓 채널을 생성(내부적으로 데이터 그램 패킷을 처리)
- channelFactory: Netty에서 기본 제공하는 channel class보다 더 복잡한 로직이 필요할 때 사용
- handler: 서버소켓 채널의 이벤트 핸들러 설정(부모스레드에서 발생한 이벤트만 처리)
- childHandler: 클라이언트 소켓 채널의 데이터 가공 핸들러 설정(자식 스레드에서 발생한 이벤트 처리)
- option: 서버 소켓 채널의 소켓 옵션 설정
- TCP_NODELAY: 데이터 송수신에 *네이글 알고리즘의 비활성화 여부(기본값: false 비활성화)
- SO_KEEPALIVE: 운영체제에서 지정된 시간에 한번씩 keepAlive 패킷을 상대방에게 전송(기본값: false 비활성화)
- SO_SNDBUF: 상대방으로 송신할 커널 송신 버퍼 크기(커널 설정에 따라 다름)
- SO_RCVBUF: 상대방으로 수신할 커널 송신 버퍼 크기(커널 설정에 따라 다름)
- SO_REUSEADDR: TIME_WAIT 상태의 포트를 서버 소켓에 바인드할 수 있게 한다. (기본값: false 비활성화)
- SO_LINGER: 소켓을 닫을 때 커널의 소신 버퍼에 전송되지 않은 데이터의 전송 대기시간을 지정( (기본값: false 비활성화)
- SO_BACKLOG: 동시에 수용 가능한 소켓 연결 요청
- childOption: 클라이언트 소켓 채널의 소켓 옵션 설정
네이글 알고리즘
전송측에서 hello와 world 보낸다고 가정하자.
전송측 커널 송신 버퍼에서 적당한 크기로 hello를 수신측에 보낸다. 전송측은 수신측에서 hello에 대한 ACK를 받을 때까지 보내지 않고, ACK를 받으면 다음 world 데이터를 전송하게 된다.
즉, 네이글 알고리즘을 활성화 할 경우에 ACK를 받아야 다음 데이터를 보낼 수 있기 때문에 응답시간이 중요한 네트워크 애플리케이션 환경에서는 적합하지 않다.
3. Bootstrap
클라이언트 애플리케이션을 구할 때 사용
a. Bootstrap 설정 예시
EventLoopGroup eventLoopGroup = new NioEventLoopGroup(1);
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(eventLoopGroup)
.channel(NioSocketChannel.class)
.remoteAddress(new InetSocketAddress(host, port))
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel channel) throws Exception {
ChannelPipeline p = channel.pipeline();
p.addLast(new EchoClienHandler)
}
});
ServerBootstrap 설정과 비슷하다.
1. Bootstrap은 하나의 EventLoopGroup이 필요하다.
2. 연결할 서버 주소이다.
b. Bootstrap API
- group: 이벤트 루프 설정
- ServerBootstrap과 달리 하나의 이벤트루프를 설정
- channel: 소켓 입출력 모드 설정
- LocalChannel: 가상 통신을 위한 클라이언트 소켓 채널을 생성
- OioSocketChannel: 블로킹 모드의 클라이언트 소켓 채널을 생성
- NioSocketChannel: 논블로킹 모드의 클라이언트 소켓 채널을 생성
- EpollSocketChannel: 리눅스 커널의 epoll 입출력 모드를 지원하는 서버 소켓 채널을 생성
- OioSctpSocketChannel: SCTP 전송계층을 사용하는 블로킹 모드의 클라이언트 소켓 채널을 생성
- NioSctpSocketChannel: SCTP 전송계층을 사용하는 논블로킹 모드의 클라이언트 소켓 채널을 생성
- channelFactory: Netty에서 기본 제공하는 channel class보다 더 복잡한 로직이 필요할 때 사용
- handler: 클라이언트 소켓 채널의 이벤트 핸들러 설정
- option: 소켓 채널의 소켓 옵션 설정
'Programming > etc' 카테고리의 다른 글
[Netty] Netty 단위 테스트 작성하기 (0) | 2024.01.17 |
---|---|
[Netty] 바이트버퍼(ByteBuffer) (0) | 2024.01.15 |
[Netty] 이벤트 모델 (0) | 2024.01.15 |
[Netty] 채널 파이프라인과 코덱 (0) | 2024.01.12 |
[Netty] 네트워크 프레임워크 Netty란? (1) | 2024.01.11 |