팀원이 설정한 알람이 내 폰에서 울려야한다.
팀원이 설정/수정한 알림이 내 폰에서 울려야한다.
서론
프로젝트를 전부 구현해놨더니 기획을 엎어버렸다.
내가 기획팀한테 타 서비스와의 차별성과 방향성이 애매하다고 하긴했지만, 이런 결과를 원한 것은 아니다.. ㅠㅠ
지인들은 기획팀을 엎으라고 했지만, 더 나은 결과물을 위한 것이니 좋게 생각하고 있다.
개선된 기획안은 이렇다.
"열정은 있지만 팀프로젝트를 할 사람이 필요한 사람들에게 마음맞는 팀원을 구할 수 있는 TODO 및 캘린더 기능과 커뮤니티를 제공해준다."
여기서 TODO, 캘린더 기능이 팀 단위로도 설정할 수 있기 때문에 본인이 아닌 다른 팀원이 추가, 수정한 알람이 내 폰에서 울려야한다.
본론
FCM쓰면 되긴하는데 학생이니 구현 경험을 쌓고 싶었다..
내가 조사해본 결과 우리 프로젝트에 가장 적절한 팀 알람의 방식은 이렇다.
이렇게 서버에서 추가된 알람을 클라이언트에게 알려주는 방식은 크게 3가지가 존재한다.
- 폴링
- 소켓
- SSE(Server-Sent-Events)
결과부터 말하자면, 알람 기능을 구현할 때는 SSE방식이 가장 적절하다.
폴링
폴링은 단순하게 API를 주기적으로 여러번 날려서 변경되었는지 확인하는 방식이다.
폴링 방식의 예시는 Node.js의 동기&논 블로킹 방식이다. (다른 방식도 존재하는데 왜 Node.js가 다른 방식을 이용하는지도 궁금해졌다.)
유사품으로 롱폴링 방식이 존재하지만, 폴링와 유사하기에 넘어간다.
폴링 방식은 여러번 호출해야하기 때문에 통신 비용이 증가한다.
소켓
소켓 방식의 예시는 채팅이다. Node.js에서는 socket.io 기능을 제공하기에 그 기능을 사용하면 쉽게 만들 수 있다.
통신 과정은 이렇다.
이렇게되면 폴링방식과 비교했을 때는 효율적으로 구현이 가능하다.
하지만, 이 방식은 꽤 무거운 방식이다. 다음에 설명 하는 SSE 방식을 사용하면 더 효율적인 방식으로 구현 가능하다.
SSE(Sever-Sent-Events)
소켓이 참가한 채팅방에서 서로 양방향에서 메세지를 보낼 수 있다면,
SSE는 서버에서 클라이언트으로 단방향으로 메세지를 보낼 수 있다.
다음과 같은 SSE를 사용하여 알람 업데이트를 개발을 해보려고 한다.
그럼 알람 기능은 어떻게 구현할까?
SSE를 사용하여 알람 업데이트를 클라이언트에게 알려줄 수 있다.
그렇게 나온 흐름도는 이렇다.
플로우
- A: 팀 알람 추가
- 서버: B에게 알람 변경 사항 알려주기.
- B: 팀 알람 수정
- 서버: A에게 알람 변경 사항 알려주기.
구현 방식
- 각 멤버는 고유 SSE이 존재한다.
- 본인이 속한 팀들에서 알람의 변경사항(추가, 삭제도 포함)이 발생 시, SSE를 통해 알려준다.
팀별로 SSE가 있는 경우도 생각해봤지만 서버에서 구현하여 프론트의 부담을 조금 줄여주려고 한다.
SSE 구현