Websocket
Spring Websocket
웹소켓(WebSocket)은 하나의 TCP 접속에 전이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜이다. 전이중 통신이란 양방향 동시 통신을 말한다. HTTP 통신과는 구별되며, HTTP 통신을 기반으로 수립된다.
웹소켓을 이용하여 기존의 홈페이지에서 구현할 수 없는 실시간 처리가 가능하도록 할 수 있다. 대표적으로 구현된 예시는 다음과 같다.
주식과 같은 시세 거래 사이트
실시간 채팅 사이트
SNS의 실시간 알림
Gmail의 실시간 메일 수신
프로젝트 생성
프로젝트는 Spring Legacy Project
→ Spring MVC Project
로 생성하여 진행한다.
(인터넷을 찾아보면 거의 모든 예제가 Spring boot로 되어 있다)
프로젝트 정보
프로젝트 정보는 다음과 같이 설정한다.
프로젝트명 : websocket
Top-level package : com.hacademy.ws
의존성 추가
웹소켓을 사용하기 위해서는 다음 의존성이 필요하다.
org.springframework.spring-websocket
: 스프링에서 웹소켓을 지원하는 라이브러리com.fasterxml.jackson.core.jackson-databind
: Object와 JSON string 간의 변환을 담당하는 라이브러리
pom.xml에 다음과 같이 추가한다.
버전은 maven repository에서 검색하여 적절한 버전을 사용한다.
WebSocket 서버 생성
WebSocket 서버를 다음과 같이 생성한다.
com.hacademy.ws.server.WebSocketBasicServer.java
WebSocket Server 등록
웹소켓은 사용자 요청에 의해 생성되므로 DispatcherServlet
설정에 작성해야 한다. 등록을 위해서는 spring-websocket
관련된 namespace가 필요하다.
WebSocket Client Page 생성
웹소켓 서버에 접속할 클라이언트 페이지를 구현한다.
주소는 /websocket/basic
으로 설정한다.
com.hacademy.ws.controller.WebSocketClientController
/WEB-INF/views/websocket/basic.jsp
코드 설명
웹소켓 서버
웹소켓 서버는 세 개의 메소드로 구성되어 있다.
이 메소드들은 상속받은 클래스인 TextWebSocketHandler
를 통해 확인할 수 있다.
public void afterConnectionEstablished(WebSocketSession session)
public void afterConnectionClosed(WebSocketSession session, CloseStatus status)
protected void handleTextMessage(WebSocketSession session, TextMessage message)
afterConnectionEstablished
클라이언트와의 웹소켓 연결이 수립된 직후에 실행되는 핸들러 메소드이다. 실행 시 매개변수로 WebSocketSession
이 제공되며 클라이언트 정보와 관리 명령들이 존재한다.
사용자 접속 시 서버에서 수행해야 할 작업이 있다면 이곳에서 처리한다.(ex : 사용자 등록, 접속 알림 등)
afterConnectionClosed
클라이언트와의 웹소켓 연결이 종료된 직후에 실행되는 핸들러 메소드이다. 실행 시 매개변수로 WebSocketSession
과 CloseStatus
가 제공되며 이는 클라이언트 정보와 종료 상태에 대한 정보를 가지고 있다.
handleTextMessage
클라이언트가 연결된 웹소켓을 통해 전송한 텍스트 메세지를 수신한 직후에 실행되는 핸들러 메소드이다. WebSocketSession
과 TextMessage
가 제공되며 이는 클라이언트 정보와 전송 메세지 정보를 가지고 있다.
WebSocketSession
웹소켓 세션의 정보를 제공하는 클래스. 웹소켓 연결을 통해 메세지를 전송하거나 연결을 종료할 수 있다.
CloseStatus
웹소켓 종료 상태 코드와 원인을 제공하는 클래스. 제공되는 상태 코드는 RFC 6455 규약을 따른다.
TextMessage
웹소켓에서 전송된 텍스트 메세지 정보를 가진 클래스. byte크기, 분할여부, payload를 확인할 수 있다.
웹소켓 서버 등록
웹소켓 서버를 등록하기 위해서는 DispatcherServlet
설정파일인 servlet-context.xml
에 websocket 태그를 사용해야 한다.
위의 코드를 이용하여 WebSocketBasicServer
를 Spring bean으로 등록하고, 아래 코드를 이용하여 WebSocket 서버로 설정한다.
mapping에는 등록된 bean의 id를 작성하고, path에는 현재 프로젝트의 기본 웹소켓 접속주소인 ws://localhost:8080/websocket
을 제외한 뒷부분의 주소를 작성한다.
따라서 basicServer의 접속 주소는 다음과 같다.
ws://localhost:8080/websocket/basic
웹소켓 클라이언트
웹소켓 클라이언트 페이지에서는 Javascript WebSocket API
를 사용한다. Mozila Reference 보기를 눌러서 확인할 수 있다.
웹소켓 연결 함수
웹소켓의 연결 작업을 처리할 수 있도록 connect
함수를 생성한다.
웹소켓 주소 생성
connect
함수에 웹소켓 연결을 위한 주소 변수를 생성한다. 웹소켓의 주소는 ws
로 시작한다.
(sockjs
를 사용하면 http
로 접속이 가능하지만 지금 문서에서는 다루지 않는다)
이식성을 높이기 위해서 다음과 같이 계산하여 작성할 수 있다.
jsp 페이지에서는 EL을 사용하여 다음과 같이 context path 계산이 가능하다.
웹소켓 연결 생성
웹소켓 연결은 다음 코드 형태로 생성이 가능하다.
주소는 접속 가능한 웹소켓 주소를 작성하며, 옵션은 생략이 가능하다. 예제 코드에서는 socket 변수의 활용범위를 넓히기 위하여 다음과 같이 생성하였다.
다음과 같이 window에 등록하여 사용해도 된다(단, 이름 충돌에 유의해야 한다).
콜백 함수 설정
connect
함수에서 웹소켓을 생성한 뒤 다음과 같은 콜백 함수
를 설정할 수 있다.
onopen : 웹소켓 연결이 수립된 후 실행될 함수
onclose : 웹소켓 연결이 종료된 후 실행될 함수
onerror : 웹소켓 연결 오류 발생 후 실행될 함수
onmessage : 웹소켓을 통해 메세지가 수신되었을 경우 실행될 함수
콜백 함수는 예약작업이라고 생각하면 이해하기 쉬우며, 필요하지 않을 경우 설정하지 않아도 된다. 이 문서의 클라이언트 예제파일에서는 console.log 함수를 이용하여 콘솔 메세지만 출력하도록 구성하였다.
웹소켓 종료 함수 생성
웹소켓을 원하는 시점에 연결 종료할 수 있도록 disconnect
함수를 생성한다.
웹소켓 연결 종료
웹소켓 연결 종료는 disconnect
함수에서 다음 코드로 수행한다.
연결/종료 버튼 생성
연결과 종료 버튼을 다음과 같이 생성하여 각각의 함수와 연결한다.
메세지 전송 함수 생성
웹소켓 연결 후 메세지 전송을 위하여 send
함수를 생성한다.
메세지 작성창/전송버튼 구현
메세지 작성창은 input
태그로, 전송버튼은 button
태그로 구현한다.
전송버튼을 누르면 send
함수가 실행되도록 작성한다.
메세지 전송
메세지 전송을 위해서는 입력창의 값을 알아야 한다.
입력창의 값이 없을 경우는 전송하지 않는다.
실제 전송을 수행한다.
전송 후 입력창에 작성되어 있는 글자를 삭제한다.
Last updated