일반적인 http통신을 하는 서버들과 달리 채팅서버는 socket통신을 합니다. 통상적으로 http통신은 client의 요청이 있을 때만 서버가 응답하고 연결을 종료하는 단방향 통신입니다. 그에 반해 socket통신은 server와 client가 지속적으로 연결을 유지하고 양방향으로 통신을 하는 방식입니다. http통신은 클라이언트가 서버에 접속해 콘텐츠를 요청하고 결과를 받아 소비하는 서비스에, 웹소켓통신은 주로 채팅 같은 실시간성을 요구하는 서비스에서 많이 사용됩니다.
단방향 http 프로토콜과 호환되어 양방향 통신을 제공
일반 소켓통신과 달리 http 80 포트를 이용하여 방화벽에 제약이 없다
접속은 http를 이용하고그 이후의 통신은 자체 웹소켓 프로토콜로 통신
Streaming Text Orented Messaging Protocol의 약자로 메시징 전송을 효율적으로 하기 위해 나온 프로토콜이며 기본적으로 pub/sub 구조로 되어 있는 메시지를 발송합니다. 통신 메시지의 헤더에 값을 세팅할 수 있어 헤더값을 기반으로 통신시 인증처리 구현도 가능합니다.
pub//sub이란 메시지를 공급하는 주체와 소비하는 주체를 분리하여 제공하는 메시징 방법입니다. 퍼블리셔(pub)과 구독자(subscriber)의 개념으로, 퍼블리셔가 생성하면 여러 구독자들이 볼 수 있는 개념입니다.
채팅방 생성 -pub/sub구현을 위한 topic생성
채팅방 입장 - topic을 subscribe
메시지 주고받기 - 메시지 발송은 pub, 메시지 수신은 sub
레디스란 NoSQL의 일종으로 단순 검색 및 추가 작업에 매우 최적화된 키 값 저장 공간으로써, latency와 throughput의 성능 효율에 초점이 맞추어진 용도로 사용된다.
출처: https://brunch.co.kr/@springboot/374
채팅방의 메인 저장소가 없으므로 서버의 메모리에 적재된 채팅방은 서버를 재시작 할때 마다 초기화 됨. 하여 저장소를 이용하여 채팅방이 계속 유지되도록 처리가 필요함.
채팅서버가 여러대이면 채팅방을 공유할 수가 없음 - 여러개의 서버가 필요할지는 아직 모르겠지만....
규화님께 함께 구현 성공한 채팅 기능
https://github.com/SeongBeomKo/chattingTest
아래 블로그를 보고 따라하는데 생각보다 버그와 고칠부분이 많아서 오래 걸렸다 ㅠㅠ.. 그래도 설명이 자세한 너무 감사한 블로그!
https://daddyprogrammer.org/post/4731/spring-websocket-chatting-server-redis-pub-sub/