티스토리 뷰

728x90
반응형
728x170

포스팅은 JEUS의 Websocket 활용 가이드입니다.


웹 소켓은 서버와 클라이언트가 HTTP를 이용해 한 번 연결한 후에는 필요한 통신 모두를 그 연결상에서 웹 소켓 전용 프로토콜을 기반으로 수행할 수 있습니다. 접속 시간을 장시간 유지할 수 있고, HTTP와 달리 경량 프로토콜을 사용하기 때문에 통신 손실이 적습니다. 또한 하나의 연결로 모든 데이터 송수신이 가능하므로 동일한 서버에 연결한 다른 응용 프로그램에 의한 영향이 적다는 장점이 있습니다.


WebSocket의 정의부터 살펴 보겠습니다.
HTML5의 주요 기능이라고 할 수 있는 WebSocket은 웹 서버와 웹 브라우저가 지속적으로 연결된 TCP 라인을 통해 실시간으로 데이터를 주고 받을 수 있도록 하는 HTML5의 새로운 사양입니다.
웹 브라우저와 웹 서버 모두에서 WebSocket을 지원한다면 WebSocket를 이용하여 일반적인 TCP소켓과 같이 연결지향 양방향 전이중 통신이 가능합니다.
이와 같은 특징으로 웹에서도 채팅이나 게임, 실시간 주식 차트와 같이 실시간이 요구되는 응용프로그램의 개발을 한층 효과적으로 구현할 수 있게 되었습니다.


WebSocket은 다음과 같은 전용 프로토콜을 사용합니다.
WebSocket은 다른 HTTP 요청과 마찬가지로 80번 포트를 통해 웹 서버에 연결합니다. HTTP 프로토콜의 버전은 1.1이지만 Upgrade 헤더를 사용하여 웹 서버에 요청합니다. 이때 클라이언트인 브라우저와 마찬가지로 웹 서버도 WebSocket 기능을 지원해야 합니다.
Handshake 과정이 성공적으로 끝나면, HTTP를 웹소켓 프로토콜로 바꾸는 protocol switching 과정이 진행되고 이 과정이 끝나면 HTTP 대신 ws와 wss 프로토콜이 흐르게 됩니다. 
ws프로토콜은 일반적인 웹소켓 프로토콜 입니다. HTTP와 같이 80 Port를 기본으로 사용합니다.
wss프로토콜은 데이터 보안을 위해서 SSL을 적용한 프로토콜 입니다. HTTPS와 같이 443 Port를 기본으로 사용합니다.

 

WebSocket HandShake 과정은 다음과 같습니다.

WebSocket HandShake는 클라이언트가 먼저 HandShake 요청을 보내고 이에 대한 응답을 서버가 클라이언트로 보내는 구조입니다.
서버와 클라이언트는 HTTP 1.1 프로토콜을 사용하여 요청과 응답을 보냅니다.

Request Header 중 Sec-WebSocket-Key와 Response Header 중 Sec-WebSocket-Accept로 상대방을 인증하여 사용합니다.

 
다음은 이에 대한 JEUS 설정 방법에 대해 알아보도록 하겠습니다.
WebSocket은 Java EE 7에 포함되어 있습니다.
WebSocket Protocol을 지원하기 위해 JEUS7에서는 Java EE6 스팩을 준수합니다.
WebSocket을 지원하는 WebSocket 컨네이너가 내부적으로 포함되어 있는 형태로 사용하기 위해서는 deploy AP의 jeus-web-dd.xml에 websocket을 설정하여야 합니다.

JEUS WebSocket 컨테이너의 역할에 대해 살펴 보겠습니다.
웹 컨텍스트에 포함된 WebSocket Server Endpoint 개체들을 deploy합니다.
클라이언트로부터 WebSocket Handshake 요청이 왔을 때 이에 매핑되는 Server Endpoint 개체를 연결시킵니다.
클라이언트와의 연결 후, WebSocket Session을 생성하고, Session 개체에 대한 라이프 사이클 관리합니다.

JEUS WebSocket 사용시 제약사항에 대해 알아보겠습니다.
HTTP listener에서만 사용 가능하기 때문에 HTTP listener의 Use Nio 설정을 true로 설정해야 합니다. (WebtoB 연동을 위해서는 4.1.8 이상 버전의 Reverse Proxy와 결합해서 사용하는 것을 권장합니다.)
jeus-web-dd.xml의 websocket 설정이 반드시 필요합니다.
Java API for WebSocket 표준에서 제공하는 Client API는 제공하지 않습니다. Client API는 반드시 Java SE 7을 필요로 하는데 JEUS 7은 Java EE 6 기반 제품으로 Java SE 6로 컴파일해서 제공하므로 Client API를 제공되지 않습니다. Client API에 해당하는 메소드를 호출하는 경우에는 java.lang.UnsupportedOperationException이 발생합니다.

실제 WebSocket 연동 시 WebServer로 연결하는 경우가 많습니다. 이에 간단히 TmaxSoft의 WebServer인 WebtoB의 REVERSE_PROXY 설정에 대해 간단히 살펴보겠습니다.

하위 항목

설명

MaxWebSocket Connections

reverse proxy로 WebSocket을 사용하는 경우 최대 WebSocket connection 수 입니다.
HTTP connection에서 WebSocket connection으로 upgrade된 경우 해당 connection 수에 대한 제한을 설정하며 0으로 설정한 경우 WebSocket connection 수를 제한하지 않습니다.

WebSocket SessionTimeout

reverse proxy로 WebSocket을 사용하는 경우 WebSocket connection에 대한 session timeout입니다.
내부 서버의 WebSocket session에 대한 TimeOut 설정과 맞춰서 설정할 것을 권장하며 0으로 설정한 경우 TimeOut을 체크하지 않습니다.


마지막으로 Websocker을 사용하는 Sample Application에 대해 살펴보고 마무리 하겠습니다.

먼저 Server Side의 소스 구현 방식입니다.

1) MessageHandler의 구성은 다음과 같습니다.
Client에서 전송되는 message를 처리하는 MessageHandler로 TextWebSocketHandler와 BinaryWebSocketHandler로 나뉩니다.
Text Message/Binary Message를 각각 처리하는데 사용됩니다.
Input Text Message에 ECHO:를 붙여주는 형태로 TextMessageHandler를 구성합니다.
2) Spring Configuration에 ConnectionEndpoint 설정를 합니다.
ConnectionEndpoint를 통해서 데이터를 보내고, 받는 작업을 할 수 있습니다.
ConnectionEndpoint를 구성하기 위해서 Spring은 @EnableWebSocket annotation과 WebSocketConfigurer interface를 제공하고 있습니다.
/echo를 ConnectionEndpoint로 만들어주고, Websocket을 /echo에 연결합니다.
3) DispatcherServletInitializer.java 파일을 작성합니다.
web.xml을 대신할 DispatcherWebApplicationIntializer으로 Servlet Configuration에서 만들어진 WebConfig.class를 반환합니다.


다음으로 Client Side의 소스 구현 방식입니다.

1) ws로 시작하는 Websocket서버로 연결합니다.
2) Websocket 연결 요청 시 서버에서 응답하여 연결이 설정되면 발생하도록 합니다.
3) 오류가 있을 때 예외 처리를 수행합니다.
4) 메시지가 수신되는 순간에 대한 구현이 필요합니다.
5) Websocket이 끊어질 경우에 대한 구현이 필요합니다.
6) Websocket Server로 Message를 전송하도록 구현이 필요합니다.
7) Websocket Server로 접속을 종료합니다.


위와 같이 구현이 완료되면 Web/WAS에 각각 구성된 Websocket 연동 설정으로 포워딩 되며 실시간 처리에 강화된 Websocket Application이 동작합니다.


오늘은 JEUS에서 Websocket을 어떻게 반영하고 사용하는지에 대해 알아봤습니다.

- Websocket은 JDK1.7이상에서 실시간 처리를 위해 나온 기술이며, ws 또는 wss protocol을 사용한다.

- Websocket을 사용하기 위해 샘플 코드를 작성해 본다.

맙습니다.


728x90
반응형
그리드형