항해99

23.10.16 항해 99 16기 실전 프로젝트 11일차

김용글 2023. 10. 16. 22:36

오늘 공부한 것

* 채팅 기능 구현

 

오늘 오전에는 디자이너님과 회의가 있었다

UI는 어느정도 구현이 된듯하였으나 프런트엔드쪽에서 속도가 생각보다 나지 않았다

 

백엔드는 어떻게 할까 이야기를 나누어 보았는데

각자 구현하고 싶은 기능을 구현하거나 현 기능을 리팩토링 하는 형식으로 하기로했다

 

그래서 나는 지난 금요일에 공부하던 WebSocket을 계속 공부했고

일부 코드를 구현했다. 하지만 이게 맞게 구현되었는지는 잘 모르겠다

공부중에 간간히 서버에 코드를 수정하고 업데이트 하는 작업을 계속했다

 

아직 WebSocket은 공부중이고 채팅 기능을 구현한다는 것이 정확히 어떻게 구현되는지

파악이 잘 안되었다 일단은 공부한대로 구현해보고 입맛에 맞게 바꿔야겠다

 

1. Config

package com.sparta.team2project.chatting.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker // 웹소켓 서버를 사용한다는 설정
public class WebSoketConfig implements WebSocketMessageBrokerConfigurer {

        // 메세지 브로커에 관한 설정
        @Override
        public void configureMessageBroker(MessageBrokerRegistry registry) {
            // 서버 -> 클라이언트로 발행하는 메세지에 대한 endpoint 설정 : 구독
            registry.enableSimpleBroker("/queue", "topic"); // 발행자가 queue (1:1) topci (1:다)의 경로로 메세지를 주면 구독자들에게 전달
            // 클라이언트 -> 서버로 발행하는 메세지에 대한 endpoint 설정 : 구독에 대한 메세지
            registry.setApplicationDestinationPrefixes("/app"); // 메세지 앞에 app이 붙어있는 경로로 발신되면 해당 경로를 처리하고 있는 핸들러로 전달됨 @MessageMapping 어노테이션이 붙은 곳을 타겟으로 한다는 설정
        }

        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) {
            WebSocketMessageBrokerConfigurer.super.registerStompEndpoints(registry);
            // 웹 소켓이 hanshake를 하기 위해 연결하는 endpoint
            registry.addEndpoint("/ws") // WebSocket 또는 SockJS가 웹소켓 핸드세이크 커넥션을 생성할 경로
                    .setAllowedOriginPatterns("*")
                    .withSockJS(); // WebSocket을 지원하지 않는 브라우저에서 HTTP의 Polling과 같은 방식으로 WebSocket의 요청을 수행하도록 도와줌
        }
    }

 

2. Handler

package com.sparta.team2project.chatting.handler;

import lombok.extern.log4j.Log4j2;
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.util.ArrayList;
import java.util.List;

@Component
@Log4j2
public class ChatHandler extends TextWebSocketHandler {

    private static List<WebSocketSession> list = new ArrayList<>();

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        log.info("payload : " + payload);

        for (WebSocketSession sess : list) {
            sess.sendMessage(message);
        }
    }
}