반응형
Theo, 테오
시행착오를 줄이는 방법 - 진태양
Theo, 테오
  • 분류 전체보기 (82)
    • General (28)
      • Essay (22)
      • Craftsmanship (2)
      • IT Meet & Hack (4)
    • Finance (1)
      • Portfolio (1)
      • Activity (0)
    • Infrastructure (1)
      • Kubernetes (0)
      • AWS (1)
    • Development (45)
      • News (4)
      • Architecture (4)
      • Web (1)
      • Spring Framework (7)
      • JVM (12)
      • MongoDB (0)
      • Git (2)
      • Algorithm (14)
      • Python (1)
    • Computer Science (1)
      • Network (1)
    • Civic Hacking (3)
      • Code for Korea (3)
    • Know-how (2)
      • IT Service (1)
      • Career (1)
    • English (1)
      • Translation (1)

인기 글

  • [Java & Kotlin] enum class가 완벽한 ⋯
    2021.12.13
    [Java & Kotlin] enum class가 완벽한 ⋯
  • Why DDD, Clean Architecture and ⋯
    2022.03.10
    Why DDD, Clean Architecture and ⋯
  • SpringBoot에서 STOMP로 채팅 애플리케이션 만들⋯
    2021.12.13
    SpringBoot에서 STOMP로 채팅 애플리케이션 만들⋯
  • [번역] 개발자가 잠자는 동안 돈을버는 5가지 방법 | 사⋯
    2022.04.17
    [번역] 개발자가 잠자는 동안 돈을버는 5가지 방법 | 사⋯
  • SpringBoot에서 STOMP로 채팅 애플리케이션 만들⋯
    2021.12.14
    SpringBoot에서 STOMP로 채팅 애플리케이션 만들⋯

블로그 메뉴

  • 홈
  • 관리
  • 방명록
hELLO · Designed By 정상우.
Theo, 테오

시행착오를 줄이는 방법 - 진태양

SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (1)
Development/Spring Framework

SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (1)

2021. 12. 13. 15:52
반응형

목차

  • SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (1) - 현재 게시글
  • SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (2)
  • SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (3)

 

이번에 사이드 프로젝트를 진행하면서 채팅 기능을 구현하게 됐다. 관련하여 공부해본 내용을 작성해본다.

채팅이라고 하면 일반적으로 아래와 같은 프로세스로 통신 하게 된다.

이 때 클라이언트와 서버는 HTTP 통신이 아닌, 소켓 통신을 하게 된다.

Why? 클라이언트와 서버간 연결을 수립해두고, 해당 경로를 통해 통신하기 위함이다. HTTP 통신은 한번 연결 수립 후 응답이 오게 되면 연결이 끊기게 된다.

클라이언트A와 서버가 연결되고, 클라이언트B와 서버가 연결된 상태에서 클라이언트A가 채팅 메시지를 보내면 서버가 클라이언트B에게 보내주는 형태이다.

이러한 방식은 클라이언트A와 B 모두 서버와 연결되어 있을 때만 사용 가능하다. 즉, 한 사람이 채팅 앱을 꺼뒀다면 메시지를 주고 받을 수 없는 것이다. 하지만 카카오톡을 비롯한 채팅 서비스는 그렇지 않다.

실제 상용 채팅 서비스는 클라이언트의 채팅 메시지 전송을 수신한 뒤 데이터베이스에 저장하고, 만약 수신자가 서버와 연결되어 있다면 소켓 통신을 통해 메시지를 곧장 보내주고 그렇지 않다면(앱이나 채팅방을 꺼뒀다면) 앱에 메시지가 왔다는 푸쉬 알람을 보내는 형식으로 동작한다.

오늘은 이 중 소켓 통신을 이용한 클라이언트<->서버<->클라이언트간 통신에 대해 다뤄보고자 한다.

소켓 통신 예시

소켓 통신 시 클라이언트와 서버는 아래와 같은 메시지를 주고 받게 된다.

1. ClientA -> Server

{"type":"ENTER", "sender":"ClientA"}​

2. ClientB -> Server

{"type":"ENTER", "sender":"ClientB"}

3. Server -> ClientA

{"type":"ENTER", "sender":"ClientB"}

4. ClientB -> Server

{"type":"MESSAGE", "sender":"ClientB", "message": "안녕하세요."}

5. Server -> ClientA

{"type":"MESSAGE", "sender":"ClientB", "message": "안녕하세요."}

정말 간단한 예시다. 하지만 이걸 코드로 구현하려면 꽤나 번거롭다.

클라이언트에서 서버로 메시지를 보내는 경로와 서버에서 클라이언트로 메시지를 보내는 경로가 서로 다르고 이걸 관리해야하기 때문이다.

STOMP; Simple (or Streaming) Text Oriented Message Protocol

이걸 조금이나마 쉽게 할 수 있도록 도와주는 프로토콜 중 하나가 STOMP 이다.

풀네임 그대로 텍스트 형태의 메시지를 쉽게 주고받을 수 있는 프로토콜이라 볼 수 있다.

해당 프로토콜은 pub(publish), sub(subscribe)이라는 개념으로 동작하는 프로토콜인데, 클라이언트가 서버로 메시지를 보내는 것을 pub, 클라이언트가 서버로부터 메시지를 받는 것을 메시지를 구독한다는 개념으로 sub이 사용된다.

또한 pub/sub을 중계 해줄 수 있는 브로커(broker)가 필요하다. 유명한 메시징 시스템인 RabbitMQ 같은걸 사용하거나 in-memory broker를 구축 해 사용할 수 있다.

다행스럽게도 SpringBoot에는 pub/sub 개념을 지닌 STOMP 프로토콜을 기반으로 in-memory broker를 함께 제공하는 라이브러리가 존재한다. (물론 in-memory broker는 단점을 지니고 있으며, broker는 외부 메시징 시스템으로 변경할 수 있다)

그래서 이걸 사용하여 시스템을 구현하기로 했다.

다음 편에 계속 - SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (2)

반응형
저작자표시 비영리 변경금지

    ☕️ Networking

    기술 직군의 기술적인 교류, 커리어 이야기, 직군 무관 네트워킹 모두 환영합니다!

    위클리 아카데미 오픈 채팅방(비밀번호: 9323)

    kakaotalk: https://open.kakao.com/o/gyvuT5Yd

    'Development/Spring Framework' 카테고리의 다른 글
    • [토비의 스프링 3.1] 1장 오브젝트와 의존관계
    • SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (3)
    • SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (2)
    • DI(Dependency Injection)는 왜 필요한가?
    Kotlin, springboot, Stomp, 소켓 채팅, 소켓 통신, 코프링
    Theo, 테오
    Theo, 테오
    Java/Kotlin, Spring 백엔드 관련 기술을 익히고 공유합니다.
    SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (2)
    다음 글
    SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (2)
    DI(Dependency Injection)는 왜 필요한가?
    이전 글
    DI(Dependency Injection)는 왜 필요한가?

    티스토리툴바