사용 기술에 따른 Task 에 대한 고민 - team-yaza/mozi-client GitHub Wiki

Service Worker

  • 서비스워커에는 생명주기가 있어서 이쪽 부분에서 계속해서 현재 위치를 받아서 서버에 보내거나 하는 작업은 불가능
  • 서버에서 웹 알림 이벤트를 발생하면 받아서 알림 보여주는 기능은 가능

Server

  • 서버에서 모든 사용자에 대한 위치와 알림데이터를 비교하여 알림을 보내줘야하는지 판단해서 클라이언트에 알림을 보내주는건 말이 안됨.
  • 클라이언트에서 현재 위치에 대한 정보를 계속 받아서 등록되어있는 알림과 비교하여 알림을 보내줘야한다면 서버에 요청을 보내주는게 적절하다.
  • 서버는 해당 요청이 들어오면 알림을 보내줘야하는 해당 유저에게 알림을 보내준다.

Cordova or React-Native

  • 백그라운드에서 현재 사용자의 위치와 등록되어있는 위치 정보를 계속해서 연산하면서 알림을 받아야 하는지 조건을 체크한다.
  • 어차피 현재 위치를 계속해서 받는 건 Web API만으로는 불가능하기 때문에 이 기능만큼은 네이티브 기능을 사용하는 것도 좋아보임.

Web

  • 그렇다면 알림에 대한 정보는 IndexedDB에 저장을 할 필요가 있나..?
  • 현재 위치를 주기적으로 받는 기능을 100% Cordova or RN을 사용한다면 장소에 대한 알림 정보가 등록되어있는 부분도 웹이 아니라 네이티브 기기가 되는게 자연스럽지 않나? 라는 생각.
  • 그럼 데스크탑에서 장소 알림을 등록하면 어떻게 하지?
  • 데스크탑에서는 백그라운드에서 계속 무언가 하는게 안되는데,,, 그럼 결국엔 서버에서 처리해줘야하네?

결론

  1. 원래는 거리 위치 확인을 각각의 기기(프론트엔드)에서 하고 알림을 보내야하는 조건이 되면 서버에 요청을 보내고 서버에서 맞는 클라이언트에게 푸시 알림을 보내도록 구현하고 싶었다.
  2. 이렇게 구현한다면 데스크탑에서 장소를 등록하는 경우 데스크탑의 프론트엔드에서는 장소를 확인하고 조건을 확인하는게 백그라운드에서 불가능하기 때문에 서버에 해당 기능을 위임해야한다.
  3. 앱에서 장소 알림을 등록하면 프론트엔드에서 조건을 확인하고, 데스크탑에서 장소 알림을 등록하면 서버에서 조건을 확인한다는게 어색하다.
  4. 따라서 그냥 서버에서 모든 유저에 대한 조건을 다 확인하고 특정한 클라이언트에게 웹 푸시를 주는게 맞다.
  5. 웹: 브라우저가 켜져있는 경우만 현재 위치를 받아서 서버에 보냄
  6. 앱: 백그라운드에서 지속적으로 현재 위치를 받아서 서버에 보냄
  7. 그렇다면 같은 유저에 대해서 앱에서 백그라운드에서 돌아가는데 웹에서 접속한다고 이 값을 보내줄 필요가 없음.
  8. 앱에서 돌아가고 있는지에 대한 로직이 필요하다. 그래서 중복으로 사용자의 위치를 보내주지 않게 (서버에 부하를 줄일수 있도록) 설계하는게 중요할듯 !