본문 바로가기

Back/Java

[Spring/WebSocket] 초초초기본편 웹소켓 통신해보기 (1)

오늘의 주제

Spring boot WebSocket

basic으로 구현해보기

초초초기본으루다가!😎

 

 

배경

채팅서버를 구현하기 위해 웹소켓을 공부하던중, 제일 기본적인 웹소켓부터 사용해보기로 함.

 

 

 

목표

간단한 기본적인 기능만 구현해서 사용해보기.

- 소켓 연결

- 웹브라우저에서 보낸 메시지 받기 (서버에서)

- 서버에서 브라우저로 메시지 보내기

깐딴쓰~ >.< 

 

 

 

따라할 페이지

https://daddyprogrammer.org/post/4077/spring-websocket-chatting/

 

 

실행하기

소켓 URL 설정

소켓에 연결할 url을 매핑한다.

WebSocketHandlerRegistry registry 는 handler를 등록하는 객체

package com.example.websocket.config;

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

@RequiredArgsConstructor
@Configuration
@EnableWebSocket
public class ChatWebSocketConfig implements WebSocketConfigurer {
    private final WebSocketHandler webSocketHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(webSocketHandler, "/basic/chat").setAllowedOrigins("*");
    }
}

 

웹소켓 핸들러 구현

ChatWebSocketHandler는 위에 매핑했던 url로 웹소켓이 연결될때 최전방에서 핸들링하는 클래스

웹소켓이 연결(connection)되면 afterConnectionEstablished 메서드가 실행됨.

메시지가 들어올때, handleTextMessage 메서드가 실행됨.

package com.example.websocket.handler;

import com.example.websocket.controller.ChatService;
import com.example.websocket.controller.dto.ChatMessage;
import com.example.websocket.dto.ChatRoom;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;

@Slf4j
@RequiredArgsConstructor
@Component
public class ChatWebSocketHandler extends TextWebSocketHandler {

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
        String payload = message.getPayload();
        session.sendMessage(new TextMessage(payload));
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        session.sendMessage(new TextMessage("welcome!!! green house! :)"));
        //TODO: session 에서 token으로 사용자 가져오기.
    }
}

 

연결된 소켓으로 받았던 메시지를 그대로 보내줌.

그러나 지금 서버에서는 연결된 그 하나로만 보내주기 때문에!

다른 클라이언트(웹브라우저)를 켜도 다른 창에서 보낸 메시지가 전달되지 않음!!

 

추가로 구현할 사항

- 세션을 저장해놨다가 메시지가 들어올때 채팅방에 연결된 모든 세션에 메시지를 보내주는 코드가 필요함

- TODO로 적어놓은.. 나중에는 세션연결할때 token을 받아서 계정을 확인하는 작업을 할 수 있지 않을까??