개인 공부

WebSocket 공부하기

orin602 2024. 12. 29. 16:23

WebSocket???

WebSocket은 클라이언트와 서버간의 양방향 통신을 실시간으로 지원하는 프로토콜이다. HTTP와 달리 WebSocket은 연결이 한 번만 설정해도 지속적으로 유지되며, 클라이언트와 서버가 데이터를 자유롭게 주고받을 수 있다.

>> 채팅 애플리케이션, 실시간 알림 시스템 등으로 사용 가능.

 

  1. 양방향 통신 : 클라이언트와 서버가 데이터를 동시에 주고받을 수 있음.
  2. 연결 지속성 : 연결이 생성된 후 별도 요청 없이 데이터 전송이 가능.
  3. 효율성 : HTTP처럼 요청-응답 구조를 반복하지 않아 네트워크를 대역폭 절약할 수 있음.

이런 특성 덕분에 WebSocket은 채팅 애플리케이션, 실시간 알림 시스템, 게임 등에서 많이 사용됩니다.

 

1. 의존성 주입(pom.xml)

 

2. Websocket 핸들러 생성

package com.demo.websocket;

import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class ChatWebSocketHandler extends TextWebSocketHandler {

	@Override
	public void handleTextMessage(WebSocketSession session, TextMessage message) 
			throws Exception {
		String payload = message.getPayload(); // 클라이언트에서 보낸 메세지
		System.out.println("Message : " + payload);
		session.sendMessage(new TextMessage("응답 : " + payload)); // 메세지 응답
	}
}

 

3. Websocket 설정

package com.demo.websocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebsocketConfig implements WebSocketConfigurer {

	@Override
	public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
		// url 매핑
		registry.addHandler(new ChatWebSocketHandler(), "/chat")
				.setAllowedOrigins("*"); // 모든 도메인 허용

	}

}

 

4. html, javascript 구현

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>웹 소켓</title>
</head>
<body>
<div class="websocket">
	<h1>웹 소켓</h1>
	<div class="input">
		<input type="text" id="messageInput" placeholder="메세지를 작성하세요..">
		<button onclick="sendMessage()">전송</button>
	</div>
	
	<div class="output" id="output"></div>
	<script>
		const socket = new WebSocket("ws://localhost:1234/chat"); // websocket 연결 생성
		
		// 서버에서 받은 메세지 처리
		socket.onmessage = function(event) {
			const outputDiv = document.getElementById('output');
			const newMessage = document.createElement('div');
			newMessage.textContent = event.data;
			outputDiv.appendChild(newMessage);
		};
		
		// 메세지 서버로 전송
		function sendMessage() {
			const input = document.getElementById("messageInput");
			socket.send(input.value); // 입력값 전송
			input.value = ''; // 입력 필드 초기화
		}
		
		// WebSocket 연결 상태 확인 및 에러 처리
		socket.onopen = function() {
		    console.log("WebSocket 연결 성공");
		};
		
		socket.onerror = function(error) {
		    console.error("WebSocket 에러 발생: ", error);
		};
		
		socket.onclose = function() {
		    console.log("WebSocket 연결 종료");
		};
	</script>
</div>
</body>
</html>

 

5. Controller 구현

package com.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class WebSocketController {

	@GetMapping("/websocket")
	public String websocketView() {
		return "websocket/websocket";
	}
}

 

++ 테스트 ++

 

지금까지 Websocket에 대해서 간단하게 알아보고, 테스트를 해봤으면

다음은 Websocket을 활용해서 채팅과 스케줄 작성 및 알람기능을 구현해 보고 테스트..를 해....Continue...