HTTP, REST에 대한 부분 복습, Spring에서 사용되는 Socket통신에 대해 정리.
즉, Client는 Server에게 자신이 어떤 데이터를 받고싶은지 Server에 요청을 해야, Server가 그 요청에 맞는 데이터를 제공해주는 방식이다.
위 상황을 풀어보자면 Client가 Web Browser를 통해 Server에 request(요청)을 보내면, 해당 요청을 받은 Server는 해당 요청에 알맞은
response(응답)을 반환한 후 연결을 끊어 > 독립된 상태를 유지한다.
위 세 가지의 내용만으로는 REST를 이해하기에는 부족한 것 같다.
HTTP에는 이미 REST 원칙이 녹아 들어 있다.
CRUD Operation
하지만 기본적으로 HTTP 통신 원칙에 따르면, Client가 요청을 해야 Server가 응답을 하게 된다. 이러한 이유로 인해 client2는 자신에게 온 메시지를 확인 할 수 가없다.
위 같은 단점을 보완하기 위해 나온 기술이 웹 소켓
이다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
org.springframework
com.fasterxml.jackson.core
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
(바뀐line)xmlns:websocket="http://www.springframework.org/schema/websocket"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
(바뀐line)http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket.xsd">
***생략***
<websocket:handlers>
<websocket:mapping handler="echoHandler" path="/echo" />
<websocket:sockjs />
</websocket:handlers>
<beans:bean id="echoHandler" class="com.mvc.template.common.socket.EchoHandler"></beans:bean>
@RequestMapping("/user/socket/echo")
public class EchoHandler extends TextWebSocketHandler{
private List<WebSocketSession> sessionList = new ArrayList<WebSocketSession>(); //세션 리스트
private static Logger logger = LoggerFactory.getLogger(EchoHandler.class);
//클라이언트가 연결 되었을 때 실행
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessionList.add(session);
logger.info("{} 연결됨", session.getId());
}
//클라이언트가 웹소켓 서버로 메시지를 전송했을 때 실행
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
logger.info("{}로 부터 {} 받음", session.getId(), message.getPayload());
//모든 유저에게 메세지 출력
for(WebSocketSession sess : sessionList){
sess.sendMessage(new TextMessage(message.getPayload()));
}
}
//클라이언트 연결을 끊었을 때 실행
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessionList.remove(session);
logger.info("{} 연결 끊김.", session.getId());
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.1.5/sockjs.min.js"></script>
</head>
<body>
<input type="text" id="message" />
<input type="button" id="sendBtn" value="submit"/>
<div id="messageArea"></div>
</body>
<script type="text/javascript">
$("#sendBtn").click(function() {
sendMessage();
$('#message').val('')
});
let sock = new SockJS("http://localhost:8220/ex/echo/");
sock.onmessage = onMessage;
sock.onclose = onClose;
// 메시지 전송
function sendMessage() {
sock.send($("#message").val());
}
// 서버로부터 메시지를 받았을 때
function onMessage(msg) {
var data = msg.data;
$("#messageArea").append(data + "<br/>");
}
// 서버와 연결을 끊었을 때
function onClose(evt) {
$("#messageArea").append("연결 끊김");
}
</script>
</html>