본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.




패스트캠퍼스의 '9개 도메인 프로젝트로 끝내는 백엔드 웹 개발 (Java/Spring) 초격차 패키지 Online' 강의 수강 44일차!
오늘은 Websocket을 활용한 실시간 메시징 도메인 서버의 프로젝트 생성, 웹소켓을 사용한 간단한 채팅 서비스 구현 작업을 진행하였다.
part4 강의에서는 채팅 상담 기능을 제공하는 백엔드 서비스를 만들 계획이다.
서버에 연결된 복수의 사용자들이 서로 메세지를 주고 받을 수 있는 간단한 채팅 기능을 WebSocket과 STOMP를 이용하여 각각 구현해보는 작업을 진행하기로 하였다. 먼저, 이번 강의에서는 웹소켓을 이용하여 개발을 진행하였다.
@Slf4j
@Component
public class WebSocketChatHandler extends TextWebSocketHandler {
final Map<String, WebSocketSession> webSocketSessionMap = new ConcurrentHashMap<>();
// 웹소켓 클라이언트가 서버로 연결을 한 이후에 실행되는 로직
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
log.info("{} connected", session.getId());
this.webSocketSessionMap.put(session.getId(), session);
}
// 웹소켓 클라이언트에서 메세지가 왔을 때 처리하는 로직
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
log.info("{} sent {}", session.getId(), message.getPayload());
this.webSocketSessionMap.values().forEach(
webSocketSession -> {
try {
webSocketSession.sendMessage(message);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
);
}
// 서버에 접속해 있던 웹소켓 클라이언트가 연결을 끊었을 때 처리하는 로직
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
log.info("{} disconnected", session.getId());
this.webSocketSessionMap.remove(session.getId());
}
}
TextWebSocketHandler를 상속받고, 세 개의 메서드를 오버라이드하여 웹소켓 핸들러를 구현했다.
세션을 map 형태로 저장해둔 후, 연결된 모든 사용자에게 메세지를 전송하는 형식이다.
@RequiredArgsConstructor
@EnableWebSocket
@Configuration
public class WebSocketConfiguration implements WebSocketConfigurer {
final WebSocketChatHandler webSocketChatHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(webSocketChatHandler, "/ws/chats");
}
}
Spring에 웹소켓 서버 설정을 하기 위해 WebSocketConfigurer 인터페이스를 구현한 설정 파일을 생성하였다.
웹소켓 요청이 "/ws/chats" 경로로 들어오면 WebSocketHandler가 처리하도록 등록했다.


다른 브라우저에서 localhost에 접속한 후, 각각 connect하고 메세지를 send하면 두 개의 창에서 실시간으로 전송된 메세지가 출력되는 것을 확인할 수 있다!
웹소켓만 가지고 정말 간단한 채팅 기능을 구현해 보았다.
너무 신기하다! 다음 강의에서 STOMP로 구현할 때는 어떤 차이가 있을지 궁금하다.