TIL - 항해 54일차

스브코·2021년 12월 25일
0

웹소켓, stomp, Redis를 이용한 채팅 구현


웹소켓 통신 이란?

일반적인 http통신을 하는 서버들과 달리 채팅서버는 socket통신을 합니다. 통상적으로 http통신은 client의 요청이 있을 때만 서버가 응답하고 연결을 종료하는 단방향 통신입니다. 그에 반해 socket통신은 server와 client가 지속적으로 연결을 유지하고 양방향으로 통신을 하는 방식입니다. http통신은 클라이언트가 서버에 접속해 콘텐츠를 요청하고 결과를 받아 소비하는 서비스에, 웹소켓통신은 주로 채팅 같은 실시간성을 요구하는 서비스에서 많이 사용됩니다.


웹소켓의 특징

  • 단방향 http 프로토콜과 호환되어 양방향 통신을 제공

  • 일반 소켓통신과 달리 http 80 포트를 이용하여 방화벽에 제약이 없다

  • 접속은 http를 이용하고그 이후의 통신은 자체 웹소켓 프로토콜로 통신


Stomp

Streaming Text Orented Messaging Protocol의 약자로 메시징 전송을 효율적으로 하기 위해 나온 프로토콜이며 기본적으로 pub/sub 구조로 되어 있는 메시지를 발송합니다. 통신 메시지의 헤더에 값을 세팅할 수 있어 헤더값을 기반으로 통신시 인증처리 구현도 가능합니다.

pub//sub이란 메시지를 공급하는 주체와 소비하는 주체를 분리하여 제공하는 메시징 방법입니다. 퍼블리셔(pub)과 구독자(subscriber)의 개념으로, 퍼블리셔가 생성하면 여러 구독자들이 볼 수 있는 개념입니다.

채팅방 생성 -pub/sub구현을 위한 topic생성

채팅방 입장 - topic을 subscribe

메시지 주고받기 - 메시지 발송은 pub, 메시지 수신은 sub


Redis

레디스란 NoSQL의 일종으로 단순 검색 및 추가 작업에 매우 최적화된 키 값 저장 공간으로써, latency와 throughput의 성능 효율에 초점이 맞추어진 용도로 사용된다.

  • in-memory 저장소로 처리속도가 빠르고(디스크를 거치지 않기 때문)
  • 데이터가 메모리에만 저장된다(프로세스가 죽거나 서버가 꺼지면 다날라감)
  • 만료일을 지정하여 자동으로 데이터를 사라지게 할 수 있음(캐시의 용도)
  • 저장소 메모리 재사용 (만료가 되지 않았더라도 더이상 데이터를 넣을 메모리가 없으면 LRU알고리즘이적용되면서 오래된 데이터를 자동 삭제 됨)

레디스를 사용한 이유

  • pub/sub을 제공하는 메세지 브로커의 역할


출처: https://brunch.co.kr/@springboot/374

  • 채팅방의 메인 저장소가 없으므로 서버의 메모리에 적재된 채팅방은 서버를 재시작 할때 마다 초기화 됨. 하여 저장소를 이용하여 채팅방이 계속 유지되도록 처리가 필요함.

  • 채팅서버가 여러대이면 채팅방을 공유할 수가 없음 - 여러개의 서버가 필요할지는 아직 모르겠지만....

규화님께 함께 구현 성공한 채팅 기능

https://github.com/SeongBeomKo/chattingTest

아래 블로그를 보고 따라하는데 생각보다 버그와 고칠부분이 많아서 오래 걸렸다 ㅠㅠ.. 그래도 설명이 자세한 너무 감사한 블로그!

https://daddyprogrammer.org/post/4731/spring-websocket-chatting-server-redis-pub-sub/

profile
익히는 속도가 까먹는 속도를 추월하는 그날까지...

0개의 댓글