문제
한 유저가 클라이언트에서 서버에 메시지를 전달하고 다른 유저가 메시지를 전달 받을때
이 전달 받을 유저가 누구인지 어떻게 판단하며 유저에게 개별적으로 푸시알람을 전송할 수 있을까?
- 프론트에서 모든 유저의 토큰값을 체크하고 해당 토큰을 가진 유저에게 전달?
- 소켓을 연결해주는 과정을 매번 팔로워 요청할때, 좋아요를 누를때, 댓글을 작성할때 해줘야되는건가?
- 지금은 1번을 구독한 사람들에게 다 보낼텐데 그럼 특정인을 어떻게 구독하는지?
해결
웹소켓의 동작을 이해하기 전까지는 너무 마법같은 일이라고 생각했다.
어떻게 클라이언트에서 각자의 유저를 판단해서 메세지를 전달하고 메시지를 응답 받을 수 있지?
라는 생각을 가지고 있었기 때문이다.
하지만
그저 각각의 유저가 특정한 값을 가지고 이 특정한 값을 개방해놓는다고 생각을 하면 된다.
- 나는 이 특정한 값을 유저의 PK 값으로 저장하였다.
만약 유저의 ID가 1번이라 할때 아무도 쓰지 않는 1번이라는 특정한 값을 개방(Subscribe)해놓는다면
2번 유저가 1번 유저의 게시글에 좋아요와 같은 이벤트를 발생 시켰을때
2번은 1번에게 서버를 통해서 메시지를 보내기만 하면 되는것이다.
요약
소켓을 연결하고 구독을 하고 메시지를 보낼때 서버에서 보내는 값을 서버에서 판단하는게 아니라
만약에 1번을 구독을 하고 메시지를 보내면 1번은 1번방을 열어놓는다고 생각하면된다.
- 웹소켓 연결 후 각각의 유저는 자신을 구별할 수 있는 특정한 값으로 구독을 진행한다.
- 소켓 연결과 구독이 완료되었다면 메시지를 보내는 특정 이벤트가 발생했을때 메시지를 전달 받을 수 있다.
내가 진행한 방식
- 1번 유저와 2번 유저가 로그인을 진행한다.
- 로그인을 완료하면 각각의 유저의 PK 값을 로컬스토리지에 저장한다.
- 소켓을 연결하고 로컬 스토리지에 저장된 PK 값으로 유저들은 구독을 진행한다.
- 2번 유저가 1번 유저에게 팔로워를 진행한다.
- 2번 유저는 서버를 통해서 1번 유저에게 팔로워를 했다는 메시지를 보낸다.
- 현재 로그인 중인 1번 유저는 로그인 과정이 끝난 후 소켓 연결과 구독을 진행하였기 때문에 메시지를 전달 받을 수 있다.
'Spring' 카테고리의 다른 글
[Spring] @RequestBody 어노테이션 사용 요청 매핑 문제 (0) | 2022.02.13 |
---|---|
[Spring] 몽고디비 read 개선 방향 - 1 (0) | 2022.02.13 |
[Spring] Request Mapping Null (0) | 2022.02.13 |
[Spring] HashMap 데이터 삽입시 key의 순서 정렬 문제 (0) | 2022.02.13 |
[Spring] Collections is not mapped - Mongodb Querydsl (0) | 2022.02.07 |
댓글