지난번에 Redis를 이용해 채팅 기능을 구현을 했었는데, 제대로 정리도 안 하고 한 것 같아서 복습 차원으로 다시 하나씩 구현하면서 정리를 하려고 한다!! 먼저 Redis를 사용하기 전에 WebSocket만으로 구현을 하고 하나씩 개선해 나가는 방향으로 정리를 해보자.
웹소켓이란?
웹소켓이 등장하게 된 이유와 장단점을 정리하기에는 이 글의 주제가 아니기 때문에 간단하게 정리하고 넘어가도록 하자.
채팅 프로그램을 만들때 HTTP 요청을 통해 구현할 수도 있겠지만 웹소켓을 사용하는 이유가 무엇일까?
채팅 메세지를 보낼 때마다 HTTP(GET, POST든..) 요청을 보내게 된다면 모든 요청에 대해 TCP/IP 연결을 맺고 끊고 하기 때문에 자원의 낭비가 심하다!! (이 말이 이해가 안 된다면 Stateless, Statefull에 대해 한번 보는 것을 추천한다)
이러한 자원의 낭비를 막기 위해 HTTP 프로토콜을 통해 웹소켓을 열고 웹소켓에서 채팅 기능을 구현하였습니다.
(결과적으로 모든 애플리케이션 메시지는 동일한 TCP 연결에서 흐른다)
구현 방법
implementation 'org.springframework.boot:spring-boot-starter-websocket'
가장 먼저 스프링 부트에서 웹소켓을 사용하기 위해 의존성을 추가를 했다.
웹소켓 서버를 만드는 것은 아주 간단하다. 아래 그림은 WebSocketHandler를 상속받는 모습을 보여준다.
여기서 우리는 TextWebSocketHandler나 BinaryWebSocketHandler를 상속받아 Handler를 구현할 수 있는데 그중에서 채팅하기 위해 구현하기 때문에 TextWebSocketHandler를 상속받아 구현해 보겠습니다.

@Component
@RequiredArgsConstructor
public class WebSocketHandler extends TextWebSocketHandler {
private final ObjectMapper objectMapper;
private final ChatService chatService;
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
ChatMessage chatMessage = objectMapper.readValue(payload, ChatMessage.class);
ChatRoom chatRoom = chatService.findRoomById(chatMessage.getRoomId());
chatRoom.handlerActions(session, chatMessage, chatService);
}
}
다음으로 만들어준 핸들러를 웹소켓 설정에 달아주면 된다!!
@Configuration
@EnableWebSocket
@RequiredArgsConstructor
public class WebSockConfig implements WebSocketConfigurer {
private final WebSocketHandler webSocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(webSocketHandler, "ws/chat").setAllowedOrigins("*");
}
}
Config에는 핸들러 등록뿐만 아니라 메시지 크기나 버퍼 사이즈도 설정할 수 있지만 간단한 예제이기 때문에 해당 설정은 하지 않겠다!!
setAllowedOrigins 설정 또한 예제이기 때문에 모든 것을 허용하도록 설정을 했다.
정말 이렇게만 설정을 해서 구현하면 끝이다!!

localhost:8080/chat를 통해 socket 연결을 한 후에 생성된 roomId로 웹소켓에 메시지를 전달하면 된다!!

구글 크롬 확장 프로그램인 WebSocketTestClient을 통해 테스트를 진행을 했고 정상적으로 되는 것을 확인했다.
공식 문서를 참고해서 순서대로 구현을 하였는데 아직 SockJs, STOMP 부분이 남았으니 다음에 Redis로 구현하면서 해당 내용에 대해 한번 정리 후 넘어가도록 하자.
참고했던 곳!
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#websocket
'개발 일지' 카테고리의 다른 글
| Bench Mark 스터디 회고 (0) | 2024.05.15 |
|---|---|
| 조금 늦은 2023년 회고 (1) | 2024.02.09 |
| Programmers 자바 알고리즘 후기 (0) | 2023.02.17 |
| 2022 회고 (2) | 2023.01.08 |
| Web server failed to start. Port 8080 was already in use 에러.. (0) | 2022.05.14 |
댓글