항해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);
}
}
}