[Java] Netty를 활용한 안전한 HTTP 서버 구현

post-thumbnail

Netty 라이브러리를 사용하여 안전한 HTTP 서버를 구현하는 내용을 정리해보려고 합니다.
각 클래스와 주요 기능에 대해 간단히 정리해보겠습니다.

1. HttpServerStart 클래스

public class HttpTestStart {
    public static int HTTPS_PORT = 1234;
    public static int HTTPS_Client_PORT = 1235;

    public static void main(String[] args) throws Exception {
        // 커맨드 라인 파싱 및 서버 초기화
        // HTTPS 포트 및 우리서버에 정보를 보내는 상대방 HTTPS 서버 포트, 로그 경로, 서버 모드를 커맨드 라인 인자로 받아옴
        // SSL 설정, 이벤트 루프 그룹 초기화, 서버 부트스트랩 설정 등
        // HTTP 및 HTTPS 포트 설정과 각각의 핸들러를 등록하여 서버 시작
    }
}
  • 역할
    서버의 초기화 및 실행을 담당하는 클래스입니다.
    서버 설정을 수행하고 Netty를 사용하여 서버를 시작합니다.

  • 내용
    main 메서드에서 인자를 순서대로 HTTPS 포트, 보내는 HTTPS 포트, 로그 경로, 서버 모드를 설정합니다.
    SSL 설정 및 이벤트 루프 그룹 초기화를 수행하고, Netty의 ServerBootstrap을 사용하여 서버를 설정합니다.
    HTTP 및 HTTPS 포트를 설정하고, 필요한 각각의 포트에 대한 핸들러를 HttpTestHandler로 등록합니다.
    서버를 시작하고 종료될 때까지 대기합니다.

안전한 통신 및 이벤트 처리

// SSL 및 이벤트 루프 초기화
EventLoopGroup masterGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();

// 서버 부트스트랩 설정
ServerBootstrap serverBootstrapHttps = new ServerBootstrap();
serverBootstrapHttps.group(masterGroup, workerGroup);
serverBootstrapHttps.channel(NioServerSocketChannel.class);
serverBootstrapHttps.localAddress(new InetSocketAddress(HttpTestStart.HTTPS_PORT));
serverBootstrapHttps.childHandler(new HttpTestHandler());

// HTTPS 서버 시작
ChannelFuture channelFutureHttps = serverBootstrapHttps.bind().sync();

// 서버 종료까지 대기
channelFutureHttps.channel().closeFuture().sync();
  • 내용
    안전한 통신을 위해 SSL 및 이벤트 루프 그룹을 초기화합니다.
    ServerBootstrap을 생성하여 HTTP 서버를 설정합니다.
    HttpTestHandler를 등록하고 HTTPS 포트로 서버를 시작합니다.
    서버가 종료될 때까지 대기합니다.

2. HttpHandler 클래스

public class HttpTestHandler extends ChannelInitializer<SocketChannel> {
    public HttpTestHandler() {}

    protected void initChannel(SocketChannel socketChannel) throws Exception {
        // SSL 핸들러 및 HTTP 요청 처리 핸들러 등록
        SslHandler sslHandler = SSLHandler.getSSLHandler();
        // HTTP 요청 처리 핸들러는 FullHttpRequest를 처리하여 비즈니스 로직을 수행
        protected void channelRead0(ChannelHandlerContext channelHandlerContext, FullHttpRequest fullHttpRequest) throws Exception {
        	// 비즈니스 로직 처리
        	// 결과에 따라 적절한 응답을 생성하고 클라이언트에게 전송
        }
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // 채널 읽기 완료 시 채널을 닫음
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // 예외 발생 시 로그를 출력하고 채널을 닫음
    }
}
  • 역할
    클라이언트의 요청을 처리하는 핵심 비즈니스 로직이 구현된 클래스입니다.
    SSL 핸들러와 HTTP 요청 처리 핸들러를 등록하여 안전한 통신 및 비즈니스 로직을 처리합니다.
  • 내용
    - initChannel 메서드 : SSL 핸들러와 HTTP 서버 코덱, 객체 집계기, 비즈니스 로직 핸들러를 등록합니다.
    - HTTP 요청이 들어올 때마다 channelRead0 메서드에서 비즈니스 로직을 처리합니다.
    받아온 HTTP 요청의 본문을 읽어와 JSON 형식으로 변환하고 데이터 검증을 수행합니다.
    검증 결과에 따라 적절한 응답을 생성하고 클라이언트에게 전송합니다.
    - channelReadComplete 메서드 : 채널 읽기가 완료되면 채널을 닫습니다.
    - exceptionCaught 메서드 : 예외가 발생하면 로그를 출력하고 채널을 닫습니다.

요약

Netty를 활용하여 비동기 및 이벤트 기반의 개발 내용 입니다.
SSL을 이용한 안전한 HTTP 통신 및 클라이언트 요청 처리를 효과적으로 수행할 수 있도록 설계되었는데, 오랜 시간 다듬어진 부분이라 적용된 디자인 패턴 등을 공부해 볼 수 있다고 생각하여 서버 설정 부분부터 분석해보았습니다.

profile
숲을 보고 나무도 보자.

0개의 댓글