느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라
article thumbnail
Published 2020. 11. 23. 09:39
Netty로 echo서버 만들기 IT/Netty

 이번에 공부한 챕터에서는 Netty로 Echo서버를 만드는 예제를 실습하였다. 예제의 경우 메이븐 프로젝트로 다중모듈프로젝틀르 구현하였지만, 나는 gradle로 프로젝트를 구현하였다.

 

 딱히, 블로그에 정리해서 올릴 만한 챕터는 아니었지만, 틈틈이 블로그에 올리는 습관을 들이지 않으니 요즘들어 도통 이런 정리글을 쓰지 않는듯 하여 이러한 뻘글(?) 이라도 계속 업로드 하고자 한다. 

 

 

예제 애플리케이션의 기능

  • 클라이언트가 메시지를 전송하면 서버가 이 메시지를 반향 출력하는 아주 간단한 예제이지만, 다음 두 가지 이유로 아주 중요한 연습 과정이다.

  1. 개발 툴과 환경을 설정하고 확인하는 시험대를 마련할 수 있다. 

  2. 네티의 핵심 요소인 ChannelHandler를 이용해 애플리케이션의 논리를 구축하는 과정을 체험할 수 있다.

 

--- 개발환경 구성 생략(단, github 링크를 남길것) ---

 

네티 클라이언트/ 서버 개요

 

 

위와같이 클라이언트에서 "ABC"라는 메시지를 서버로 보내면 "ABC"라는 메시지를 전달 받는 것이 이번 챕터에서 만들려는 서버의 목적이다.

 

Echo서버 만들기

 

모든 네티 서버에는 다음 항목이 필요하다.

  • 하나 이상의 ChannelHandler : 이 컴포넌트는 클라이언트로부터 받은 데이터를 서버측에서 처리하는 비즈니스 논리를 구현한다.

  • 부트스트랩 : 서버를 구성하는 시동 코드를 의미한다. 최소한 서버가 연결 요청을 수신하는 포트를 서버와 바인딩하는 코드가 있어야 한다. 

 

ChannelHandler와 비즈니스 논리

 

Echo서버는 들어오는 메시지에 반응해야 하므로 인바운드 이벤트에 반응하는 메서드가 정의된 ChannelInboundHandler 인터페이스를 구현해야 한다. 이 애플리케이션은 소수의 메서드를 이용하는 간단한 애플리케이션이므로 ChannelInboundHandler의 기본 구현을 제공하는 ChannelInboundHandlerAdapter의 하위 클래스를 만드는 것으로 충분하다.

 

관심을 가질 메서드

  • channelRead() : 메시지가 들어올 때마다 호출된다.

  • channelReadComplete() : channelRead()의 마지막 호출에서 현재 일괄 처리의 마지막 메시지를 처리했음을 핸들러에 통보한다.

  • exceptionCaught() : 읽기 작업 중 예외가 발생하면 호출된다. 

 

서버 부트스트랩

 

지금까지 EchoServerHandler가 구현하는 핵심 비즈니스 논리를 살펴봤다. 이제 다음 과정을 포함하는 서버의 부트스트랩을 진행해야 한다.

  • 서버가 수신할 포트를 바인딩하고 들어오는 연결 요청을 수락한다.

  • EchoServerHandler 인스턴스에 인바운드 메시지에 대해 알리도록 Channel을 구성한다.

 

구현코드

github.com/jabel123/netty-study/tree/master/chap02

 

jabel123/netty-study

Contribute to jabel123/netty-study development by creating an account on GitHub.

github.com

 

profile

느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라

@주현태

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!