사용 기술에 따른 Task 에 대한 고민 - team-yaza/mozi-client GitHub Wiki
Service Worker
- 서비스워커에는 생명주기가 있어서 이쪽 부분에서 계속해서 현재 위치를 받아서 서버에 보내거나 하는 작업은 불가능
- 서버에서 웹 알림 이벤트를 발생하면 받아서 알림 보여주는 기능은 가능
Server
- 서버에서 모든 사용자에 대한 위치와 알림데이터를 비교하여 알림을 보내줘야하는지 판단해서 클라이언트에 알림을 보내주는건 말이 안됨.
- 클라이언트에서 현재 위치에 대한 정보를 계속 받아서 등록되어있는 알림과 비교하여 알림을 보내줘야한다면 서버에 요청을 보내주는게 적절하다.
- 서버는 해당 요청이 들어오면 알림을 보내줘야하는 해당 유저에게 알림을 보내준다.
Cordova or React-Native
- 백그라운드에서 현재 사용자의 위치와 등록되어있는 위치 정보를 계속해서 연산하면서 알림을 받아야 하는지 조건을 체크한다.
- 어차피 현재 위치를 계속해서 받는 건 Web API만으로는 불가능하기 때문에 이 기능만큼은 네이티브 기능을 사용하는 것도 좋아보임.
Web
- 그렇다면 알림에 대한 정보는 IndexedDB에 저장을 할 필요가 있나..?
- 현재 위치를 주기적으로 받는 기능을 100% Cordova or RN을 사용한다면 장소에 대한 알림 정보가 등록되어있는 부분도 웹이 아니라 네이티브 기기가 되는게 자연스럽지 않나? 라는 생각.
- 그럼 데스크탑에서 장소 알림을 등록하면 어떻게 하지?
- 데스크탑에서는 백그라운드에서 계속 무언가 하는게 안되는데,,, 그럼 결국엔 서버에서 처리해줘야하네?
결론
- 원래는 거리 위치 확인을 각각의 기기(프론트엔드)에서 하고 알림을 보내야하는 조건이 되면 서버에 요청을 보내고 서버에서 맞는 클라이언트에게 푸시 알림을 보내도록 구현하고 싶었다.
- 이렇게 구현한다면 데스크탑에서 장소를 등록하는 경우 데스크탑의 프론트엔드에서는 장소를 확인하고 조건을 확인하는게 백그라운드에서 불가능하기 때문에 서버에 해당 기능을 위임해야한다.
- 앱에서 장소 알림을 등록하면 프론트엔드에서 조건을 확인하고, 데스크탑에서 장소 알림을 등록하면 서버에서 조건을 확인한다는게 어색하다.
- 따라서 그냥 서버에서 모든 유저에 대한 조건을 다 확인하고 특정한 클라이언트에게 웹 푸시를 주는게 맞다.
- 웹: 브라우저가 켜져있는 경우만 현재 위치를 받아서 서버에 보냄
- 앱: 백그라운드에서 지속적으로 현재 위치를 받아서 서버에 보냄
- 그렇다면 같은 유저에 대해서 앱에서 백그라운드에서 돌아가는데 웹에서 접속한다고 이 값을 보내줄 필요가 없음.
- 앱에서 돌아가고 있는지에 대한 로직이 필요하다. 그래서 중복으로 사용자의 위치를 보내주지 않게 (서버에 부하를 줄일수 있도록) 설계하는게 중요할듯 !