[Spring Boot] 웹 소켓(Web Socket)을 사용해 실시간 채팅 구현

2025. 3. 17. 20:20· BE/Spring Boot
목차
  1. 웹 소켓(Web Socket)이란?
  2. ✅ 웹 소켓의 특징
  3. 웹 소켓으로 실시간 채팅 구현하기
  4. 웹 소켓 라이브러리 추가
  5. 프론트엔드
  6. 백엔드
  7. 테스트
  8. 웹 소켓 세션 저장 (Set)
  9. 세션 확인 후 처리 (내가 보낸 메시지 안 받게 설정)
728x90

웹 소켓(Web Socket)이란?

웹 소켓(Web Socket)은 클라이언트와 서버 간의 양방향 통신을 지원하는 프로토콜로, HTTP보다 효율적인 실시간 데이터 전송이 가능하다.

HTTP는 요청과 응답을 기반으로 한 단방향 통신이지만, 웹 소켓은 연결을 유지하면서 양방향으로 데이터를 주고받을 수 있다.

 

✅ 웹 소켓의 특징

  • 양방향 통신 : 클라이언트와 서버가 실시간으로 데이터를 주고받을 수 있다.
  • 지속적인 연결 유지: 최초 handshake 후 지속적인 연결을 유지하면서 데이터 전송 가능
  • 낮은 오버헤드: HTTP 요청/응답보다 헤더 크기가 작아 네트워크 부하 감소
  • 빠른 응답 속도: 실시간 서비스(채팅, 알림 등) 등에 적합

 


웹 소켓으로 실시간 채팅 구현하기

웹 소켓 라이브러리 추가

 

build.gradle 파일에 웹 소켓 라이브러리를 추가해준다.

implementation 'org.springframework.boot:spring-boot-starter-websocket'

 


프론트엔드

 

vue 코드

<script setup>
import { ref, onMounted } from 'vue'
const message = ref('')
const socket = ref(null);
const sendMessage = () => {
console.log(message.value)
socket.value.send(message.value);
}
const connectWebsocket = () => {
// 웹 소켓 열기
socket.value = new WebSocket('ws://localhost:8080/ws/chat');
// 연결되었다면 연결 확인 메시지 출력
socket.value.onopen = () => {
console.log('서버에 연결');
};
// 메시지를 받았으면 메시지 출력
socket.value.onmessage = (e) => {
console.log(event.data + "메세지를 받음");
};
// 닫혔으면 연결 해제 메시지 출력
socket.value.onclose = () => {
console.log('서버와 연결이 해제');
};
}
onMounted(() => {
connectWebsocket();
});
</script>
<template>
<div>
채팅목록
</div>
<input v-model="message" type="text" placeholder="메세지를 입력하세요">
<button @click="sendMessage">전송</button>
</template>

 


 

백엔드

MessageHandler

메시지를 처리할 메소드들을 작성한다.

@Component
public class MessageHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session)throws Exception {
System.out.println("클라이언트가 연결했다");
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println(message + "메시지를 받았다.");
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
System.out.println("클라이언트가 연결을 종료했다.");
}
}

 

 

 

WebSocketConfig

웹 소켓 설정을 작성한다.

/ws/chat 경로에서 웹 소켓 핸들러를 등록하고, 모든 도메인에서 접근을 허용해준다.

@EnableWebSocket
@RequiredArgsConstructor
@Configuration
public class WebSocketConfig implements WebSocketConfigurer {
private final MessageHandler messageHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(messageHandler, "/ws/chat").setAllowedOrigins("*");
}
}

 

 

 

 


테스트

프론트엔드

 

 

 

백엔드

 

 

 

 


웹 소켓 세션 저장 (Set)

 

연결된 모든 클라이언트에게 메시지를 전달한다.

import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.util.HashSet;
import java.util.Set;
public class MessageHandler extends TextWebSocketHandler {
// 현재 연결된 웹소켓 세션을 저장하는 Set (중복 방지)
private final Set<WebSocketSession> sessions = new HashSet<>();
// 클라이언트가 웹소켓에 연결되었을 때 실행되는 메서드
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session); // 새 클라이언트 세션을 저장
System.out.println("클라이언트가 연결했다");
}
// 클라이언트가 메시지를 보냈을 때 실행되는 메서드
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println(message + " 메시지를 받았다."); // 받은 메시지 출력
// 연결된 모든 클라이언트에게 받은 메시지를 전송 (브로드캐스트)
for (WebSocketSession session1 : sessions) {
session1.sendMessage(message);
}
}
}

 

 

 


세션 확인 후 처리 (내가 보낸 메시지 안 받게 설정)

 

메시지를 보내는 세션과 서버가 메시지를 전달하려고 하는 세션이 같으면 continue로 다음 작업이 실행되게 한다.

@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println(message + "메시지를 받았다.");
for(WebSocketSession session1 : sessions){
// 현재 메시지를 보내려고 하는 세션과 서버가 메시지를 전달하려고 하는 세션이 같으면
if(session1.equals(session)) {
continue;
}
session1.sendMessage(message);
}
}

 

728x90
저작자표시 비영리 변경금지 (새창열림)

'BE > Spring Boot' 카테고리의 다른 글

[Spring Boot] STOMP란? / 간단한 채팅방 구현  (0) 2025.03.18
[Spring Boot] WebSocket과 Kafka로 실시간 채팅 구현  (0) 2025.03.18
[Spring Boot] 자주 쓰는 라이브러리 정리 (build.gradle)  (0) 2025.03.13
[Spring Boot] 로컬 환경에 파일 업로드 (multipart)  (0) 2025.03.03
[Spring Boot] OAuth2 소셜 로그인 (카카오, 구글)  (0) 2025.03.01
  1. 웹 소켓(Web Socket)이란?
  2. ✅ 웹 소켓의 특징
  3. 웹 소켓으로 실시간 채팅 구현하기
  4. 웹 소켓 라이브러리 추가
  5. 프론트엔드
  6. 백엔드
  7. 테스트
  8. 웹 소켓 세션 저장 (Set)
  9. 세션 확인 후 처리 (내가 보낸 메시지 안 받게 설정)
'BE/Spring Boot' 카테고리의 다른 글
  • [Spring Boot] STOMP란? / 간단한 채팅방 구현
  • [Spring Boot] WebSocket과 Kafka로 실시간 채팅 구현
  • [Spring Boot] 자주 쓰는 라이브러리 정리 (build.gradle)
  • [Spring Boot] 로컬 환경에 파일 업로드 (multipart)
셰욘
셰욘
셰욘
seiyeon
셰욘
전체
오늘
어제
  • 분류 전체보기 (176)
    • 알고리즘 (46)
      • 프로그래머스 (2)
      • 백준 (37)
      • 문제 유형 (7)
    • CS (41)
      • Linux (6)
      • DB (15)
      • 자료구조 (3)
      • OOP (2)
      • 아키텍처 (0)
    • BE (42)
      • Java (9)
      • Spring Boot (32)
    • FE (6)
      • Next.js (1)
      • JavaScript (5)
      • Vue.js (7)
      • Web (0)
    • 배포 (5)
    • 회고 (19)
      • BEYOND SW 캠프 (19)
    • 기타 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 블로그 관리

공지사항

인기 글

태그

  • Gateway
  • 네트워크
  • spring boot
  • db
  • 티스토리챌린지
  • 백트래킹
  • 프로그래머스
  • 우선순위 큐
  • 실습
  • dfs
  • cs
  • bfs
  • Java
  • 백준
  • js
  • 그리디
  • 자료구조
  • DP
  • 주간회고
  • 트리
  • fe
  • be
  • 오블완
  • 구현
  • AWS
  • 리눅스
  • web
  • vue
  • 알고리즘
  • 회고

최근 댓글

최근 글

250x250
hELLO · Designed By 정상우.v4.2.1
셰욘
[Spring Boot] 웹 소켓(Web Socket)을 사용해 실시간 채팅 구현
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.