SlideShare a Scribd company logo
1 of 27
정경석
Going asynchronous
with Netty
에어라이브코리아 – 인프라팀
2015.10.27
발표자 소개
● 정경석
● 20세기와 21세기를 둘 다 겪은 오래된(?) 백엔드 개발자
● MS ASP를 시작으로 개발자의 길로
● 현재 AireLive 메시징 API와 영상 검색 서비스 개발
목차
● 네티란?
● 네티는 어떻게 구성되는가?
● 네티의 주요 컴포넌트
● 이벤트모델과 이벤트루프
● 네티의 비동기 처리방법
● 네티의 사용처
네티란?
● Java 네트워크 애플리케이션 프레임워크
● 이벤트 기반 비동기 처리
● 쉽고 빠른 네트워크 애플리케이션 작성
● IO API 추상화
● 애플, 트위터, 페이스북 등에서 사용중
● 현재 안정화 버전 3.10.5.Final, 4.0.32.Final, 5.0.0-Alpha2
네티는 어떻게 구성되는가?
개발자가 알아야 할 구성
부트스트랩
채널 파이프라인
코덱코덱
이벤트 루프
코덱
부트스트랩이란
부트스트랩
전송계층
이벤트 루프
소켓 옵션
소켓 주소
채널 파이프라인
코드
코드
채널 파이프라인
● 채널에서 발생한 이벤트가 이동하는 통로
이벤트 처리 코드
이벤트 핸들러
이벤트 처리 코드
이벤트 핸들러
이벤트이벤트이벤트
코덱
● 인코더와 디코더의 합성어
영상 인코딩 MP4
압축
MPEG4 코덱
디코딩 영상
복원
MPEG4 코덱
코덱
● 소켓 채널을 기준으로 인코딩과 디코딩이 이루어짐
데이터 인코딩 디코딩패킷 데이터
로직처리 후 패킷 변환
인코더
데이터 변환 후 로직처리
디코더
코덱
● 인바운드와 아웃바운드
클라이언트 서버
소켓 서버소켓
Outbound
지금 10시야!
지금 몇 시니?
Outbound
Inbound
Inbound
사용자 정의 코덱 작성
● ChannelInboundHandler, ChannelOutboundHandler
인코더
ChannelOutboundHandler
디코더
ChannelInboundHandler
● channelActive
● channelInactive
● channelRead
● channelReadComplete
● channelRegistered
…
● bind
● close
● connect
● deregister
● disconnect
…
코덱
● 애플리케이션의 로직 = 코덱
● 네티의 기본 제공 코덱 목록
zlib, gzip, Snappy
압축 코덱
websocket, CORS
HTTP 코덱
Marshaller,
Unmarshaller
marshalling 코덱
TLS, SPDY
spdy 코덱
base64
BASE64 코덱
RxtxChannel
rxtx 코덱
MqttDecoder,
MqttEncoder
mqtt 코덱
ProtobufDecoder,
ProtobufEncoder
protobuf 코덱
등등 수 많은 코덱
네티의 이벤트
● 네티의 이벤트는 비동기로 처리됨
● 필요에 따라서 동기로 처리할 수 있음
● 이벤트는 모두 이벤트 루프에서 수행됨
● 네티는 단일 이벤트 루프, 다중 이벤트 루프를 제공
● 네티의 이벤트는 발생순서와 실행 순서가 항상 일치
이벤트루프
객체
이벤트 루프
코드
● 단일 이벤트 루프
이벤트이벤트 이벤트
이벤트이벤트
이벤트루프
● 다중 이벤트 루프
객체 코드
이벤트 루프 이벤트 루프…
이벤트이벤트 이벤트
이벤트이벤트
이벤트루프
● 이벤트 처리순서
객체
이벤트 루프 이벤트 루프이벤트1
이벤트3
이벤트5
이벤트4
이벤트2
이벤트루프
● 네티의 이벤트
이벤트 루프 이벤트 루프
채널 채널
이벤트3
이벤트1이벤트2
이벤트3
이벤트1이벤트2
성능 향상 임계점
● 암달의 법칙
- 시스템의 특정 부분을 개선했을 때 얻을 수 있는 성능 향상치
1-범위 + 성능 향상률
1
범위
성능 향상 임계점
● 코드의 절반이 2배의 성능을 낼 수 있도록 튜닝 했을 때 얻을 수 있는 이득
1-0.5 +
2
1
0.5
= 133%
네티의 비동기 처리
● ChannelHandlerContext, ChannelFuture
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
// IO 처리 메서드 read, write, close, connect …
ChannelFuture future = ctx.write(msg);
// write 메서드의 작업이 완료되었을 때 이벤트를 받을 수 있는 리스너 설정
future.addListener(listener);
// IO 작업이 완료되었는지 확인할 수 있음.
future.isDone();
// IO 작업이 완료될 때까지 대기
future.sync();
}
네티의 비동기 처리
● ChannelFutureListener
네티가 제공하는 기본 ChannelFutureListener
● ChannelFutureListener.CLOSE
● ChannelFutureListener.CLOSE_ON_FAILURE
● ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ChannelFuture future = ctx.write(msg);
future.addListener(ChannelFutureListener.CLOSE );
}
네티의 사용처
● Facebook
- Netty-based Thrift transport implementation, Nifty
● Apple
- Java service server
● AireLive
- TCP based Messaging server, HTTP based API server
● ElasticSearch core
- HTTP based API service, Client transport layer
● Apache Spark
- Cluster data transfer
● Google – gRPC, Red Hat – Infinispan, Typesafe - Play Framework
마치며
● 네티 4.0이상부터 안드로이드를 공식 지원
● 하나의 네티 애플리케이션에서 두 개의 포트를 바인딩
- 부트스트랩의 바인드 메서드를 두 번 호출
● 성능은 애플리케이션이 제공하는 기능에 따라서 달라진다.
- 데이터베이스 조회 vs 캐시 조회
● 이벤트 루프의 개수는 테스트를 통해서 선택하라.
- nGrinder, Jmeter
● 네티의 ChannelFuture.sync() 메서드는 신중히 사용할 것.
● 네티의 Channel.write() 메서드는 내부적으로 requestQueue를 관리함.
● 사용자 정의 코덱은 EmbeddedChannel 클래스를 통해서 테스트
THANK YOU!

More Related Content

What's hot

이승재, 실시간 HTTP 양방향 통신, NDC2012
이승재, 실시간 HTTP 양방향 통신, NDC2012이승재, 실시간 HTTP 양방향 통신, NDC2012
이승재, 실시간 HTTP 양방향 통신, NDC2012
devCAT Studio, NEXON
 
[Hello world 오픈세미나]n grinder helloworld발표자료_저작권free
[Hello world 오픈세미나]n grinder helloworld발표자료_저작권free[Hello world 오픈세미나]n grinder helloworld발표자료_저작권free
[Hello world 오픈세미나]n grinder helloworld발표자료_저작권free
NAVER D2
 
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
지환 김
 

What's hot (20)

HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형
HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형
HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형
 
RabbitMQ
RabbitMQRabbitMQ
RabbitMQ
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVA
 
이승재, 실시간 HTTP 양방향 통신, NDC2012
이승재, 실시간 HTTP 양방향 통신, NDC2012이승재, 실시간 HTTP 양방향 통신, NDC2012
이승재, 실시간 HTTP 양방향 통신, NDC2012
 
Kgc2014 one daylearnunitycryptography-f
Kgc2014 one daylearnunitycryptography-fKgc2014 one daylearnunitycryptography-f
Kgc2014 one daylearnunitycryptography-f
 
150416 OpenStack Networking with Neutron Jieun, Kim
150416 OpenStack Networking with Neutron Jieun, Kim150416 OpenStack Networking with Neutron Jieun, Kim
150416 OpenStack Networking with Neutron Jieun, Kim
 
모바일 메신저 아키텍쳐 소개
모바일 메신저 아키텍쳐 소개모바일 메신저 아키텍쳐 소개
모바일 메신저 아키텍쳐 소개
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
 
NLog 소개
NLog 소개NLog 소개
NLog 소개
 
실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기
실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기
실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기
 
Android Push Server & MQTT
Android Push Server & MQTTAndroid Push Server & MQTT
Android Push Server & MQTT
 
[164] pinpoint
[164] pinpoint[164] pinpoint
[164] pinpoint
 
[16.01.05] node.js & mqtt
[16.01.05] node.js & mqtt[16.01.05] node.js & mqtt
[16.01.05] node.js & mqtt
 
[Hello world 오픈세미나]n grinder helloworld발표자료_저작권free
[Hello world 오픈세미나]n grinder helloworld발표자료_저작권free[Hello world 오픈세미나]n grinder helloworld발표자료_저작권free
[Hello world 오픈세미나]n grinder helloworld발표자료_저작권free
 
.Net conf 2019 Korea_ ASP.NET Core를 통한 HealthCheck 서비스 구현
.Net conf 2019 Korea_ ASP.NET Core를 통한 HealthCheck 서비스 구현.Net conf 2019 Korea_ ASP.NET Core를 통한 HealthCheck 서비스 구현
.Net conf 2019 Korea_ ASP.NET Core를 통한 HealthCheck 서비스 구현
 
TCP/IP 발표자료 - 김연수
TCP/IP 발표자료 - 김연수TCP/IP 발표자료 - 김연수
TCP/IP 발표자료 - 김연수
 
자바채팅 다중
자바채팅 다중자바채팅 다중
자바채팅 다중
 
Active MQ
Active MQActive MQ
Active MQ
 
20150525 open flow1.3_ryu_sdn_link aggregation 1_김지은
20150525 open flow1.3_ryu_sdn_link aggregation 1_김지은20150525 open flow1.3_ryu_sdn_link aggregation 1_김지은
20150525 open flow1.3_ryu_sdn_link aggregation 1_김지은
 
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
 

Similar to Going asynchronous with netty - SOSCON 2015

스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
Jeongsang Baek
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
Jeongkyu Shin
 
Multithread pattern 소개
Multithread pattern 소개Multithread pattern 소개
Multithread pattern 소개
Sunghyouk Bae
 
Net debugging 3_전한별
Net debugging 3_전한별Net debugging 3_전한별
Net debugging 3_전한별
Han-Byul Jeon
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim
 

Similar to Going asynchronous with netty - SOSCON 2015 (20)

[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
 
꿀밋업2탄_도메인 모델에 따른 데이터 분리 저장과 API 연결
꿀밋업2탄_도메인 모델에 따른 데이터 분리 저장과 API 연결꿀밋업2탄_도메인 모델에 따른 데이터 분리 저장과 API 연결
꿀밋업2탄_도메인 모델에 따른 데이터 분리 저장과 API 연결
 
Seoul Conference - Iotivity 오픈소스 기술 r2
Seoul Conference - Iotivity 오픈소스 기술 r2Seoul Conference - Iotivity 오픈소스 기술 r2
Seoul Conference - Iotivity 오픈소스 기술 r2
 
IoTivity 오픈소스 기술
IoTivity 오픈소스 기술IoTivity 오픈소스 기술
IoTivity 오픈소스 기술
 
Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용
Python과 Tensorflow를 활용한  AI Chatbot 개발 및 실무 적용Python과 Tensorflow를 활용한  AI Chatbot 개발 및 실무 적용
Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용
 
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
 
MSA 전략 1: 마이크로서비스, 어떻게 디자인 할 것인가?
MSA 전략 1: 마이크로서비스, 어떻게 디자인 할 것인가?MSA 전략 1: 마이크로서비스, 어떻게 디자인 할 것인가?
MSA 전략 1: 마이크로서비스, 어떻게 디자인 할 것인가?
 
Spring one참석기 ksug
Spring one참석기 ksugSpring one참석기 ksug
Spring one참석기 ksug
 
Meetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsMeetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vs
 
Multithread pattern 소개
Multithread pattern 소개Multithread pattern 소개
Multithread pattern 소개
 
The Future of C# and .NET Framework
The Future of C# and .NET FrameworkThe Future of C# and .NET Framework
The Future of C# and .NET Framework
 
Netty 세미나
Netty 세미나Netty 세미나
Netty 세미나
 
[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기[152] 웹브라우저 감옥에서 살아남기
[152] 웹브라우저 감옥에서 살아남기
 
Net debugging 3_전한별
Net debugging 3_전한별Net debugging 3_전한별
Net debugging 3_전한별
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
INFRASTRUCTURE
INFRASTRUCTUREINFRASTRUCTURE
INFRASTRUCTURE
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio
20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio
20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio
 

Going asynchronous with netty - SOSCON 2015

  • 2. 발표자 소개 ● 정경석 ● 20세기와 21세기를 둘 다 겪은 오래된(?) 백엔드 개발자 ● MS ASP를 시작으로 개발자의 길로 ● 현재 AireLive 메시징 API와 영상 검색 서비스 개발
  • 3. 목차 ● 네티란? ● 네티는 어떻게 구성되는가? ● 네티의 주요 컴포넌트 ● 이벤트모델과 이벤트루프 ● 네티의 비동기 처리방법 ● 네티의 사용처
  • 4. 네티란? ● Java 네트워크 애플리케이션 프레임워크 ● 이벤트 기반 비동기 처리 ● 쉽고 빠른 네트워크 애플리케이션 작성 ● IO API 추상화 ● 애플, 트위터, 페이스북 등에서 사용중 ● 현재 안정화 버전 3.10.5.Final, 4.0.32.Final, 5.0.0-Alpha2
  • 6. 개발자가 알아야 할 구성 부트스트랩 채널 파이프라인 코덱코덱 이벤트 루프 코덱
  • 10. 채널 파이프라인 ● 채널에서 발생한 이벤트가 이동하는 통로 이벤트 처리 코드 이벤트 핸들러 이벤트 처리 코드 이벤트 핸들러 이벤트이벤트이벤트
  • 11. 코덱 ● 인코더와 디코더의 합성어 영상 인코딩 MP4 압축 MPEG4 코덱 디코딩 영상 복원 MPEG4 코덱
  • 12. 코덱 ● 소켓 채널을 기준으로 인코딩과 디코딩이 이루어짐 데이터 인코딩 디코딩패킷 데이터 로직처리 후 패킷 변환 인코더 데이터 변환 후 로직처리 디코더
  • 13. 코덱 ● 인바운드와 아웃바운드 클라이언트 서버 소켓 서버소켓 Outbound 지금 10시야! 지금 몇 시니? Outbound Inbound Inbound
  • 14. 사용자 정의 코덱 작성 ● ChannelInboundHandler, ChannelOutboundHandler 인코더 ChannelOutboundHandler 디코더 ChannelInboundHandler ● channelActive ● channelInactive ● channelRead ● channelReadComplete ● channelRegistered … ● bind ● close ● connect ● deregister ● disconnect …
  • 15. 코덱 ● 애플리케이션의 로직 = 코덱 ● 네티의 기본 제공 코덱 목록 zlib, gzip, Snappy 압축 코덱 websocket, CORS HTTP 코덱 Marshaller, Unmarshaller marshalling 코덱 TLS, SPDY spdy 코덱 base64 BASE64 코덱 RxtxChannel rxtx 코덱 MqttDecoder, MqttEncoder mqtt 코덱 ProtobufDecoder, ProtobufEncoder protobuf 코덱 등등 수 많은 코덱
  • 16. 네티의 이벤트 ● 네티의 이벤트는 비동기로 처리됨 ● 필요에 따라서 동기로 처리할 수 있음 ● 이벤트는 모두 이벤트 루프에서 수행됨 ● 네티는 단일 이벤트 루프, 다중 이벤트 루프를 제공 ● 네티의 이벤트는 발생순서와 실행 순서가 항상 일치
  • 17. 이벤트루프 객체 이벤트 루프 코드 ● 단일 이벤트 루프 이벤트이벤트 이벤트 이벤트이벤트
  • 18. 이벤트루프 ● 다중 이벤트 루프 객체 코드 이벤트 루프 이벤트 루프… 이벤트이벤트 이벤트 이벤트이벤트
  • 19. 이벤트루프 ● 이벤트 처리순서 객체 이벤트 루프 이벤트 루프이벤트1 이벤트3 이벤트5 이벤트4 이벤트2
  • 20. 이벤트루프 ● 네티의 이벤트 이벤트 루프 이벤트 루프 채널 채널 이벤트3 이벤트1이벤트2 이벤트3 이벤트1이벤트2
  • 21. 성능 향상 임계점 ● 암달의 법칙 - 시스템의 특정 부분을 개선했을 때 얻을 수 있는 성능 향상치 1-범위 + 성능 향상률 1 범위
  • 22. 성능 향상 임계점 ● 코드의 절반이 2배의 성능을 낼 수 있도록 튜닝 했을 때 얻을 수 있는 이득 1-0.5 + 2 1 0.5 = 133%
  • 23. 네티의 비동기 처리 ● ChannelHandlerContext, ChannelFuture @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { // IO 처리 메서드 read, write, close, connect … ChannelFuture future = ctx.write(msg); // write 메서드의 작업이 완료되었을 때 이벤트를 받을 수 있는 리스너 설정 future.addListener(listener); // IO 작업이 완료되었는지 확인할 수 있음. future.isDone(); // IO 작업이 완료될 때까지 대기 future.sync(); }
  • 24. 네티의 비동기 처리 ● ChannelFutureListener 네티가 제공하는 기본 ChannelFutureListener ● ChannelFutureListener.CLOSE ● ChannelFutureListener.CLOSE_ON_FAILURE ● ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { ChannelFuture future = ctx.write(msg); future.addListener(ChannelFutureListener.CLOSE ); }
  • 25. 네티의 사용처 ● Facebook - Netty-based Thrift transport implementation, Nifty ● Apple - Java service server ● AireLive - TCP based Messaging server, HTTP based API server ● ElasticSearch core - HTTP based API service, Client transport layer ● Apache Spark - Cluster data transfer ● Google – gRPC, Red Hat – Infinispan, Typesafe - Play Framework
  • 26. 마치며 ● 네티 4.0이상부터 안드로이드를 공식 지원 ● 하나의 네티 애플리케이션에서 두 개의 포트를 바인딩 - 부트스트랩의 바인드 메서드를 두 번 호출 ● 성능은 애플리케이션이 제공하는 기능에 따라서 달라진다. - 데이터베이스 조회 vs 캐시 조회 ● 이벤트 루프의 개수는 테스트를 통해서 선택하라. - nGrinder, Jmeter ● 네티의 ChannelFuture.sync() 메서드는 신중히 사용할 것. ● 네티의 Channel.write() 메서드는 내부적으로 requestQueue를 관리함. ● 사용자 정의 코덱은 EmbeddedChannel 클래스를 통해서 테스트