Post

[Netty] Netty in Action 요약 및 실무 활용

⚡ Netty in Action 요약과 실무 활용

Netty는 Java 기반의 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크입니다.
Netty in Action은 Netty의 핵심 개념과 실무 적용법을 자세히 설명합니다.

이 글에서는 다음 내용을 다룹니다:

  • Netty 핵심 개념
  • 아키텍처 및 이벤트 처리 모델
  • Channel, Pipeline, Handler 이해
  • TCP/UDP 서버/클라이언트 실무 활용
  • 실무에서 Netty 활용 팁

1️⃣ Netty 핵심 개념

  • 비동기(Asynchronous): 모든 I/O 작업이 논블로킹 방식
  • 이벤트 기반(Event-driven): 이벤트 발생 시 Handler가 동작
  • Reactor 패턴: 이벤트 루프(EventLoop)가 I/O 이벤트를 감지하고 분배

🔹 장점: 고성능, 높은 동시성, 낮은 스레드 오버헤드


2️⃣ 아키텍처 개요

Netty의 아키텍처는 Channel → Pipeline → Handler 구조를 중심으로 이해합니다.

1
2
3
4
5
Client/Server
│
Channel ──> Pipeline ──> Handler

  • Channel: 소켓 연결, 읽기/쓰기 I/O 인터페이스
  • Pipeline: Channel 이벤트를 처리할 Handler의 연결 체인
  • Handler: 실제 이벤트 처리 로직, 인코딩/디코딩, 비즈니스 로직 담당

3️⃣ EventLoop와 Thread 모델

  • Netty는 Reactor + EventLoop 모델 사용
  • EventLoop가 I/O 이벤트를 감지하고 등록된 Handler 호출
  • 하나의 EventLoop는 여러 Channel을 처리 가능 → 스레드 최소화
1
2
3
4
5
EventLoopGroup
├─ EventLoop 1 → Channel A, B
├─ EventLoop 2 → Channel C, D

🔹 Thread-per-connection 모델보다 훨씬 효율적


4️⃣ TCP 서버 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
    ServerBootstrap b = new ServerBootstrap();
    b.group(bossGroup, workerGroup)
     .channel(NioServerSocketChannel.class)
     .childHandler(new ChannelInitializer<SocketChannel>() {
         @Override
         public void initChannel(SocketChannel ch) {
             ch.pipeline().addLast(new MyBusinessHandler());
         }
     });
    ChannelFuture f = b.bind(8080).sync();
    f.channel().closeFuture().sync();
} finally {
    bossGroup.shutdownGracefully();
    workerGroup.shutdownGracefully();
}
  • ServerBootstrap: 서버 설정
  • ChannelInitializer: Pipeline 설정
  • MyBusinessHandler: 이벤트 처리

5️⃣ UDP 서버 예제

1
2
3
4
5
6
7
8
9
10
Bootstrap b = new Bootstrap();
b.group(new NioEventLoopGroup())
 .channel(NioDatagramChannel.class)
 .handler(new SimpleChannelInboundHandler<DatagramPacket>() {
     @Override
     protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) {
         // 패킷 처리
     }
 });
b.bind(9999).sync().channel().closeFuture().await();
  • NioDatagramChannel: UDP 지원
  • Handler에서 패킷 단위로 처리

6️⃣ 실무 활용 팁

  • 📝 Handler 분리: 인코딩/디코딩과 비즈니스 로직을 분리
  • 📝 Pipeline 활용: ChannelPipeline을 통해 이벤트 흐름 제어
  • 📝 Backpressure 관리: Channel 옵션과 수신 처리 속도 조절
  • 📝 Connection 관리: IdleStateHandler로 연결 유지/종료 관리
  • 📝 Netty + Spring Boot: Embedded Netty 서버로 비동기 REST/WebSocket 구현 가능

7️⃣ 요약

  • Netty = 비동기 + 이벤트 기반 + Reactor 패턴 기반 네트워크 프레임워크
  • 핵심 구조: Channel → Pipeline → Handler
  • TCP/UDP 모두 지원, 고성능 서버 개발에 최적화
  • 실무에서는 Handler 설계, Pipeline 구조, 이벤트 흐름 이해가 핵심

💡 결론: Netty는 단순 I/O 라이브러리가 아니라, 고성능 네트워크 애플리케이션을 구조적으로 설계할 수 있는 프레임워크입니다.

This post is licensed under CC BY 4.0 by the author.