brunch

You can make anything
by writing

C.S.Lewis

by myner Oct 11. 2020

네티

feat. 자바 네트워크 소녀

Netty

NIO기반 고성능 비동기식 Evnet-Driven 네트워크 어플리케이션 프레임워크 (https://github.com/netty/netty, https://netty.io/)


필자는 네티의 팬이기도한데 이 네티는 존경에 마지않는 이희승 님께서 학부 시절 개인 프로젝트로 시작... 하셨다고한다. (나는 학부 때 무엇을 한 거지.....)


유수의 기업들에서 사용 중이며 여러 오픈소스들에서도 네트워크 부분에서 네티를 사용하고 있다. 사실상 자바의 네트워크 개발 시에 필수요소 아닌가 싶다. 네트워크 어플리케이션의 빠르고 쉬운 개발을 가능하게 하는 NIO 클라이언트 서버 프레임워크인데 사용이 어렵지 않다.

네티 설명


Netty 특징


다양한 전송유형을 위한 통합 API를 제공하며 블로킹 & 논블로킹을 지원한다. Concern을 명확하게 분리 할 수 있도록 유연하고 확장 가능한 이벤트 모델 기반 커스터마이징이 가능한 스레드 모델이다.


더 나은 처리량, 더 낮은 대기시간, 자원 소비량 감소, 불필요한 메모리 복사를 최소화한 성능을 보인다.


이벤트에 기반하여 요청을 비동기로 처리하며 Reactor Pattern, EventHandler, EventLister, Future, Callback Method 등을 사용하여 구현되었다.


Reactor Pattern

리액터 패턴은 동시에 서버로 들어온 Request를 처리하기 위한 이벤트 핸들링 패턴이다. 자세한 사항은 필자의 이전 글을 참고하면 된다.


EventLoop 구조

연결의 수명시간 동안 발생하는 이벤트를 처리하는 작업을 나타내는 프로그래밍 구조

while (!terminated) {

     ...

}


변경되지 않는 Thread하나로 동작하는데 모든 입출력과 이벤트는 EventLoop에 할당된 Thread에 의해 처리된다. 그래서 인바운드와 아웃바운드 시에 Thread간 추가적인 컨텍스트 전환이 필요가 없으며 이벤트 처리하는 ChannelHander간의 동기화가 필요 없다.


Netty는 기본적으로 Selector를 멀티플렉서로, EventLoop을 리피터로, Pipeline을 이벤트 프로세서로 사용하여 Reactor 모드를 구현한 것이다. 그러나 일반 Reactor와 달리 Netty는 직렬화를 사용하고 Pipeline에서 책임 체인 모델을 사용한다. NIO의 버퍼와 비교하여 Netty의 버퍼가 최적화되어 성능이 크게 향상되었다.


Netty Server Architeture

네티를 활용해서 서버를 구성하게 되면 아래와 같은 모습으로 구조가 될 것이다.

네티 아키텍처 (Networking in Java with NIO and Netty


Netty를 보는이유


기본적인 NIO 서버 아키텍처에 대해 이해도를 높일 수 있다. 아래의 그림처럼 말이다. 네티를 사용함에 있어서 네티 내부구조를 몰라도 쓸 수는 있다. 하지만 잘 쓰려면 내부 구조를 빠삭하게는 아니어도 그에 대한 기본 개념은 알아야 한다고 생각한다. 그리고 어떻게 하면 고성능 네트워크 프로그래밍을 할 수 있을지에 대해 알 수 있는 맛집이 바로 Netty라고 생각한다. 내가 궁금한 것들과 지금하고 있는 고민은 다른 사람들도 했을 것이고 여러 시간 동안 많은 사람들이 고민하고 해결해온 부분이 오픈 소스프로젝트에서 알 수 있다고 생각한다.

멀티플레싱기반 서버 예제 (Networking in Java with NIO and Netty
멀티플레싱기반 서버 예제 (Networking in Java with NIO and Netty


그래서

앞으로 네티의 주요 클래스와 구조들에 관해 내용을 정리해 보려고 한다. 실제 네티 사용법은 네티 공식사이트, 블로그, 책 등등 좋은 글들이 많다고 생각한다. 필자는 실제 사용보다는 내부 구조를 봐 보려고 한다. 여태까지 글의 순서를 보면 알겠지만 결국 네티를 분석하기 위해 빌드업을 해왔다. 네티를 사용할 때 나의 코드가 어디서 어떻게 작동하는지 / 네티에서는 어떻게 리액터 패턴을 구현했는지 / 어떠한 구조이길래 적은 리소스로 성능을 끌어내는지 등등을 알아보도록 하겠다. 내부 구조를 볼 텐데 물론 버전이 바뀜에 따라 바뀔 수도 있지만 그렇게 드라마틱하게 바뀌지는 않을 것이며 바뀌더라도 배울 점은 많으리라 생각한다.



- https://netty.io/ 

- https://www.slideshare.net/kslisenko/networking-in-java-with-nio-and-netty-76583794 

- https://m.blog.naver.com/PostView.nhn?blogId=shin7688&logNo=220438732135&proxyReferer=https:%2F%2Fwww.google.com%2F

- https://altongmon.tistory.com/500 

- https://parkhyeokjin.github.io/netty/2019/12/22/netty-chap1.html

- https://clairdelunes.tistory.com/60 

- https://zhuanlan.zhihu.com/p/70970558 

- https://sina-bro.tistory.com/7 

- https://jdm.kr/blog/151 



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari