[java] 자바 네티 (Java Netty)에서 웹소켓을 사용하는 방법은?

네티 (Netty)는 자바로 개발된 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크로, 웹소켓과 같은 다양한 프로토콜을 처리하는 데 사용됩니다. 웹소켓은 실시간 통신을 가능하게 해주는 프로토콜로, 클라이언트와 서버 간 양방향 통신을 제공합니다.

네티 (Netty)를 사용하여 웹소켓을 구현하는 방법에 대해 알아보겠습니다.

1. 의존성 추가

네티 (Netty)를 사용하기 위해 먼저 프로젝트의 의존성에 네티 (Netty)를 추가해야 합니다. Maven을 사용하는 경우, pom.xml 파일에 다음 의존성을 추가합니다.

<dependencies>
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.1.61.Final</version>
    </dependency>
</dependencies>

2. 웹소켓 서버 구현

네티 (Netty)를 사용하여 웹소켓 서버를 구현하기 위해 다음과 같은 단계를 따릅니다.

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpRequestDecoder;
import io.netty.handler.codec.http.HttpResponseEncoder;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;

public class WebSocketServer {
    private final int port;
    
    public WebSocketServer(int port) {
        this.port = port;
    }
    
    public void start() throws Exception {
        NioEventLoopGroup group = new NioEventLoopGroup();
        
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(group)
                .channel(NioServerSocketChannel.class)
                .childHandler(new WebSocketServerInitializer());
            
            Channel ch = b.bind(port).sync().channel();
            ch.closeFuture().sync();
        } finally {
            group.shutdownGracefully().sync();
        }
    }
    
    public static void main(String[] args) throws Exception {
        int port = 8080;  // 포트 번호 설정
        new WebSocketServer(port).start();
    }
}

class WebSocketServerHandler extends SimpleChannelInboundHandler<WebSocketFrame> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) {
        // 웹소켓 프레임 처리 로직 작성
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        // 클라이언트 연결 시 처리 로직 작성
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        // 클라이언트 연결 해제 시 처리 로직 작성
    }
}

class WebSocketServerInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    public void initChannel(SocketChannel ch) {
        ChannelPipeline pipeline = ch.pipeline();
        
        // HTTP 프로토콜 관련 핸들러 추가
        pipeline.addLast(new HttpRequestDecoder());
        pipeline.addLast(new HttpResponseEncoder());
        pipeline.addLast(new HttpObjectAggregator(65536));
        
        // 웹소켓 프로토콜 핸들러 추가
        pipeline.addLast(new WebSocketServerProtocolHandler("/websocket"));
        
        // 웹소켓 이벤트 핸들러 추가
        pipeline.addLast(new WebSocketServerHandler());
    }
}

위의 예제 코드에서는 /websocket로 들어오는 연결을 처리하기 위해 WebSocketServerProtocolHandler를 사용하고 있습니다.

3. 웹소켓 클라이언트와 통신하기

웹소켓 클라이언트와 통신하기 위해서는 WebSocketServerHandler 클래스의 channelRead0 메소드를 사용하여 웹소켓 프레임을 처리합니다. 이 메소드는 클라이언트로부터 전달된 웹소켓 프레임을 받아 처리하는 로직을 작성하는 부분입니다.

4. 서버 실행하기

WebSocketServer 클래스의 main 메소드를 실행하여 웹소켓 서버를 실행합니다. 서버가 성공적으로 실행되면 클라이언트와 웹소켓 통신이 가능해집니다.

이제 자바 네티 (Java Netty)를 사용하여 웹소켓을 구현하는 방법을 알아보았습니다. 자세한 내용은 네티 (Netty) 공식 문서를 참조하시기 바랍니다.