Netty 핸들러 =========== 이번 챕터는 숙련자용으로 Xitrum을 보통으로 사용하시는 분은 읽지 않아도 됩니다. 이해를 위해서는 `Netty `_ 를 반드시 숙지해야 합니다. `Rack `_ , `WSGI `_ , `PSGI `_ 라는 미들웨어 아키텍처가 있습니다. Xitrum은 `Netty `_ 를 기본으로 하고 같은 핸들러를 사용합니다. 핸들러를 생성하여 추가할 수 있고 채널의 파이프라인을 수정하여 케이스별 서버의 성능을 극대화 할 수 있습니다. 이 장의 설명: * Netty 핸들러 구조 * Xitrum이 제공하는 핸들러와 기본순서 * 핸들러를 생성하고 수정하는 방법 Netty 핸들러 구조 ------------------- 각각의 커넥션은 채널 파이프라인이 있고 IO 데이터를 조작합니다 채널 파이프 라인은 여러 개의 핸들러로 구성되어 있으며 두 가지 종류의 핸들러가 있습니다: * 인바운드(Inbound): 요청 방향 클라이언트 -> 서버 * 아웃바운드(Inbound): 응답 방향 서버 -> 클라이언트 `ChannelPipeline `_ 은 여기에서 더 자세한 정보를 얻을 수 있습니다. :: I/O Request via Channel or ChannelHandlerContext | +---------------------------------------------------+---------------+ | ChannelPipeline | | | \|/ | | +---------------------+ +-----------+----------+ | | | Inbound Handler N | | Outbound Handler 1 | | | +----------+----------+ +-----------+----------+ | | /|\ | | | | \|/ | | +----------+----------+ +-----------+----------+ | | | Inbound Handler N-1 | | Outbound Handler 2 | | | +----------+----------+ +-----------+----------+ | | /|\ . | | . . | | ChannelHandlerContext.fireIN_EVT() ChannelHandlerContext.OUT_EVT()| | [ method call] [method call] | | . . | | . \|/ | | +----------+----------+ +-----------+----------+ | | | Inbound Handler 2 | | Outbound Handler M-1 | | | +----------+----------+ +-----------+----------+ | | /|\ | | | | \|/ | | +----------+----------+ +-----------+----------+ | | | Inbound Handler 1 | | Outbound Handler M | | | +----------+----------+ +-----------+----------+ | | /|\ | | +---------------+-----------------------------------+---------------+ | \|/ +---------------+-----------------------------------+---------------+ | | | | | [ Socket.read() ] [ Socket.write() ] | | | | Netty Internal I/O Threads (Transport Implementation) | +-------------------------------------------------------------------+ 핸들러의 수정 ------------------ Xitrum 서버가 구동될 때 `ChannelInitializer `_ 를 설정할 수 있습니다: :: import xitrum.Server object Boot { def main(args: Array[String]) { Server.start(myChannelInitializer) } } HTTPS서버의 경우에는 Xitrum은 자동으로 SSL 핸들러를 파이프라인 앞에 준비합니다. Xitrum 핸들러를 파이프라인에서 재사용이 가능합니다. Xitrum 핸들러 ------------------------ `xitrum.handler.DefaultHttpChannelInitializer `_ 를 참고하세요. 공유가능한 핸들러(다중연결에서 공유된 같은 인스턴스들) ``DefaultHttpChannelInitializer`` 개체 위에 존재하며 수정된 파이프 라인을 통하여 사용하기 원하는 어플리케이션에 쉽게 사용이 가능합니다. 이 어플리케이션들은 기본 핸들러의 집합입니다 예를 들어, 어플리케이션이 자신의 디스패쳐를 사용하고(Xitrum의 라우팅/디스패쳐가 아닌) Xitrum의 빠른 정적 파일만 사용한다면 다음의 핸들러만 사용하면 됩니다. 인바운드(Inbound): * ``HttpRequestDecoder`` * ``PublicFileServer`` * 자신의 dispatcher 아웃바운드(Outbound): * ``HttpResponseEncoder`` * ``ChunkedWriteHandler`` * ``XSendFile``