sproutt / eussya-eussya-api

개발자 동기부여 서비스 플랫폼 '으쌰으쌰'
20 stars 1 forks source link

[Back] 채팅 기능 및 관련 api 구현 #142

Closed Bellroute closed 2 years ago

Bellroute commented 3 years ago

STOMP 기반 채팅 기능 구현

- websocket 연결 요청 : GET "/ws-stomp"
- pub endpoint : "/pub/chat/message"
- sub endpoint : "/sub/chat/rooms/{room_id}"

관련 도메인 설명

- ChatRoom : 채팅방 정보 (id, type)
- ChatRoomJoin : 채팅방-회원 간 연결 테이블 (id, chatRoom_id, member_id) => 다대다 연결관계 매핑 막기 위해
- ChatMessage : 채팅 메세지 정보 (id, sender_id, room_id, message, time...)

image

채팅 관련 api

- 1대1 채팅방 정보 요청 : PUT "/chat/rooms/one-on-one"
    - 두 사용자가 db에 존재하는 사용자인지 체크
    - 두 사용자가 포함된 1대1 채팅방이 존재하는 경우 기존 채팅방 정보 리턴
    - 두 사용자가 포함된 1대1 채팅방이 존재하지 않는 경우 새로운 채팅방 생성 후 리턴

- 채팅방 히스토리 요청 : GET "/chat/rooms/{chatRoomId}/messages"
    - 요청자가 채팅방 구성원이 맞는지 체크
    - 최근 시간 기준으로 정렬한 채팅 메세지를 30개 단위로 페이징 처리하여 리턴

고민되던 부분

websocket 연결 시 http 요청으로 handshake 과정을 거치는데 리서치를 해보니 이 경우엔 커스텀 헤더를 추가할 수 없기 때문에 기존에 요청 헤더에 토큰을 담는 것이 불가능하다고 합니다. 그런데 예상과 다르게 서버 쪽에서 테스트 코드를 작성하여 테스트할 때는 커스텀 헤더가 추가됨을 확인했습니다. 조금 헷갈려서 다시 찾아보니 프론트에서 사용하는 sockjs-client 라이브러리에서 요청시에 커스텀 헤더를 추가할 수 없다고 합니다.

현재 구현한 방법은 http 요청 대신 socket 통신 간에 커스텀 헤더를 추가할 수 있었기 때문에 websocket handshake 요청은 인증 필터를 거치지 않도록 제외시키고, 연결 요청 이후 websocket 통신에서 STOMP CONNECT 커맨드가 들어오는 경우에 헤더에 담긴 토큰 유효성을 체크하도록 구현하였습니다.

hyukjin-lee commented 3 years ago

pr description 에 적힌 그림이 다대다인 케이스가 다대일 케이스로 적힌게 좀 있는 것 같은데 확인 부탁드립니다