vue.js + spring boot
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
compileOnly 'org.projectlombok:lombok:1.18.36'
annotationProcessor('org.projectlombok:lombok')
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
우선 이 클래스의 메서드들을 오버라이딩 해주겠습니다.
//연결이 수립된 이후 실행될 메서드!
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
System.out.println("클라이언트가 연결했다!");
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println("메시지를 받았다!");
}
//연결 종료될 때 실행될 메서드!
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
System.out.println("클라이언트가 연결을 종료했다!");
}
테스트 용도로 콘솔에 연결되었음을 표시해주었습니다.
오버라이딩 메서드는 차례대로 다음의 역할을 합니다.
- 연결이 되었을 때 실행될 메서드
- 메시지를 받았을 때 실행될 메서드
- 연결이 종료되었을 때 실행될 메서드
웹 소켓 설정 클래스
@EnableWebSocket
@RequiredArgsConstructor
@Configuration
public class WebSocketConfig implements WebSocketConfigurer {
private final MessageHandler messageHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(messageHandler, "/ws/chat") //end-point
.setAllowedOrigins("*"); //cors
}
}
프론트 웹 소켓 코드 작성
<template>
<div>채팅 목록</div>
<input v-model="message" type="text" placeholder="메시지 입력" />
<button>전송</button>
</template>
<script setup>
import { ref, onMounted } from "vue";
const message = ref("");
const socket = ref(null);
const connectWebSocket = () => {
//생성자의 파라미터에는 서버 주소와 웹 소켓이 열려있는 엔드 포인트
socket.value = new WebSocket("ws://localhost:8080/ws/chat");
socket.value.onopen = () => {
console.log("서버에 연결 했다.");
};
socket.value.opmessage = (event) => {
console.log(event.data + "메시지를 받았다.");
};
socket.value.onclose = () => {
console.log("서버와 연결이 해제 됐다.");
};
};
onMounted(() => {
connectWebSocket();
});
</script>
<style lang="scss" scoped></style>
결과
브라우저(프론트 결과)
서버(sprig boot)
일단 여기까지 각 메서드가 어떤 역할을 하는지 파악해야 합니다.
MessageHandler
연결이 수립된 이후 실행 afterConnectionEstablished
메시지 받았을 때 실행 handleTextMessage
연결 종료될 때 실행 afterConnectionClosed
Vue - WebSocket
웹 소켓 생성 WebSocket(ws://(서버주소):(포트)/(서버의 웹 소켓 엔드포인트))
서버에 연결하는 메서드 - socket.value.onopen
서버에 메시지를 전달하는 메서드 - socket.value.opmessage
서버와 연결을 해제하는 메서드 - socket.value.onclose
이제 서버가 클라이언트가 보낸 메시지들을
afterConnectionEstablished
다른 클라이언트들에게 전송해줘야 합니다.
//메시지를 받았을 때 실행될 메서드
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println("메시지를 받았다!");
}
이 부분을 고쳐주면 될거 같은데, 클라이언트들 이라는 정보를 담을 변수가 현재 코드에 없기 때문에 이 정보를 저장할 변수를 하나 만들어 주어야 합니다.
이 클라이언트 정보는 어디서 저장해야 할까? → 클라이언트가 접속했을 때, 저장하자!
→ afterConnectionEstablished
@Component
public class MessageHandler extends TextWebSocketHandler
// 접속한 사용자 정보 저장!
private final Set<WebSocketSession> sessions = new HashSet<>();
//연결이 수립된 이후 실행될 메서드!
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
System.out.println("클라이언트가 연결했다!");
}
메시지를 받았을 때 이 메시지를 다른 클라이언트에게 전송하자! → handleTextMessage 메서드
//메시지를 받았을 때 실행될 메서드
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
for(WebSocketSession session2 : sessions){
// 내가 보낸 메시지를 내가 다시 받을 필요 X
if(!session.equals(session2)){
session2.sendMessage(new TextMessage(message.getPayload()));
}
}
System.out.println("메시지를 받았다!");
}
이런 식으로 웹 소켓을 사용하는 방법에 대해서 알아보았습니다.
'Server' 카테고리의 다른 글
PinPoint (0) | 2025.02.21 |
---|---|
CQRS (0) | 2025.02.19 |
멀티파트 폼 데이터(Multipart Form Data) (0) | 2025.01.11 |
Spring boot 애플리케이션 ec2에 jar로 배포 (0) | 2023.07.23 |
aws ec2에서 Nginx + Spring boot Application 연동 (0) | 2023.07.23 |