[SpringBoot] WebSocket, STOMP - 실시간 채팅①, 정의 및 구조

SihoonCho·2023년 3월 25일
2
post-thumbnail

※ 읽기에 앞서


본 시리즈는 작성자의 이해와 경험을 바탕으로 실습 위주의 설명을 기반으로 작성되었습니다.
실습 위주의 이해를 목표로 하기 때문에 다소 과장이 많고 생략된 부분이 많을 수 있습니다.
따라서, 이론적으로 미흡한 부분이 있을 수 있는 점에 대해 유의하시기 바랍니다.

또한, SpringBoot 기반의 Backend 위주의 설명을 포함하고 있으니
Frontend 에 대해서는 별도로 참고자료를 찾아보시기를 권장드립니다.


📌 WebSocket & STOMP


'SpringBoot로 WebSocket, STOMP 실시간 채팅 구현'에 들어가기에 앞서,
WebSocket이 무엇인지, STOMP가 무엇인지 간단하게 짚고 넘어가겠습니다.


📖 WebSocket


다음은 WebSocket 위키백과에 기재된 WebSocket의 정의입니다.

웹소켓(WebSocket)은 하나의 TCP 접속에 전이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜이다.

간단히 정리하면, 다음과 같습니다.

서버-클라이언트 간에 단일 TCP 커넥션을 이용해서 양방향 통신을 제공한다.

특징으로는

  • 기존의 다른 TCP 기반의 프로토콜과 다르게,
    WebSocketHTTP 요청 기반으로 Handshake 과정을 거쳐 커넥션을 생성한다.
  • 덕분에, 초기 WebSocket Handshake 요청은 추가적인 방화벽 설정없이,
    80, 443 포트를 사용하여 양방향 통신이 가능하다.
  • HTTP 규격 그대로 유지할 수 있기 때문에
    HTTP 인증, CORS 등을 동일하게 적용할 수 있다.

📖 STOMP


STOMP(Simple Text Oriented Messaging Protocol)는 pub/sub(발행/구독)을 기반으로 동작한다. 메세지 송신/수신에 대한 처리를 명확하게 정의할 수 있고, WebSocketHandler를 직접 구현할 필요 없이, @MessageMapping 어노테이션을 사용해, 메세지 발행 시 엔드포인트를 별도로 관리할 수 있다.

즉, pub/sub(발행/구독)을 기반으로 @MessageMapping 을 통해,
메세지를 더 효율적으로 처리할 수 있는 프로토콜

Spring에서의 WebSocket STOMP를 간단하게 정리하면 위와 같습니다.


📌 프로젝트 구조


본격적으로 실습에 들어가기에 앞서 전체 구조에 대해 알아보겠습니다.
기본적으로 MVC 패턴을 따라갈 것이며, 채팅로그 기록을 위해 MySQL을 사용합니다.
MVC 패턴에 대해 모른다면 본 Velog의 'MVC 패턴 시리즈'를 확인하시기 바랍니다.


📖 MVC 패턴


MDN(Mozila Developer Network) Web Docs의 정의에 따르면 다음과 같습니다.

MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있습니다. 이러한 "관심사 분리" 는 더나은 업무의 분리와 향상된 관리를 제공합니다. MVC 에 기반을 둔 몇 가지 다른 디자인 패턴으로 MVVM (모델-뷰-뷰모델), MVP (모델-뷰-프리젠터), MVW (모델-뷰-왓에버) 가 있습니다. - MDN Web Docs -

├── config
│   └── WebSocketConfig.java
├── domain
│   ├── ChatRoom.java
│   └── ChatMessage.java
├── dto
│   ├── ChatRoomRequestDto.java
│   ├── ChatRoomResponseDto.java
│   ├── ChatMessageRequestDto.java
│   └── ChatMessageResponseDto.java
├── repository
│   ├── ChatRoomRepository.java
│   └── ChatMessageRepository.java
├── service
│   ├── ChatRoomService.java
│   └── ChatMessageService.java
├── controller
│   ├── ChatRoomRestController.java
│   ├── ChatMessageRestController.java
│   └── LiveChatController.java

본 시리즈에서는 위의 MVC 패턴 구조를 사용할 것입니다.


📖 Repository


여러 경로로 조사해본 결과, 추후 DB를 적용한다하고 Map이나 HashSet 등을 통해
임시로 Repository를 생성하거나 Repository 자체를 생략하고 바로 Service 단에서
기능을 구현하는 등 임시방편으로 DB를 대체하는 방식의 설명글이 주를 이루는 경우가 많았습니다.

본 시리즈는 채팅로그 기록을 위한 DB적용 등 실무에 가깝게 MVC 패턴을 따르기 위해
Entity, Repository 등 Database 부분을 포함한 WebSocket 기능구현에 대해 설명하고 있습니다.


📖 RESTful API


RESTful API를 적용한 Controller 구현을 목표로 하고 있습니다.


📌 결론


생각보다 SpringBoot 기반의 WebSocket, STOMP를 활용한
실시간 채팅 기능에 관해 잘 정리된 글이 없는 것 같습니다.

본 시리즈는 SpringBoot 기반의 WebSocket, STOMP 실시간 채팅기능 구현을 목표로
최근 트렌드와 함께 WebSocket, STOMP의 정형화된 기초개념을 정립하기 위해 작성되었습니다.

WebSocket을 찾아 헤매는 모든 이들에게 이 글을 바칩니다.


본 시리즈는 작성자의 이해와 경험을 바탕으로 실습 위주의 설명을 기반으로 작성되었습니다.
실습 위주의 이해를 목표로 하기 때문에 다소 과장이 많고 생략된 부분이 많을 수 있습니다.
따라서, 이론적으로 미흡한 부분이 있을 수 있는 점에 대해 유의하시기 바랍니다.

또한, SpringBoot 기반의 Backend 위주의 설명을 포함하고 있으니
Frontend 에 대해서는 별도로 참고자료를 찾아보시기를 권장드립니다.
profile
꾸준히 노력하는 개발자

1개의 댓글

comment-user-thumbnail
2023년 7월 23일

감사합니다 해당 포스트 시리즈를 쭉 따라가며 부족한 부분들을 배워보도록 하겠습니다

답글 달기