위에 spark 님이 좋은 답변을 남기셔서
저는 개발 리스크에 대한 추가 코멘트만 하겠습니다.
[코멘트1]
같은 app을 사용하고 있는 사람들 이라는 정의를 정확하게 내려야 합니다.
1. 당연히, 앱을 설치한 사람 전체는 아닐 겁니다. 앱이 실행되지 않은 동안에 어디에 있을 지 모르기 때문이죠.
2. 앱을 사용하려고 실행해서 항상 그 앱이 가장 상단에 있는 경우에만 메시지를 보낸다면,
즉 중간에 전화받고 해당 앱을 최상단에 놓지 않았다면, 앱은 Suspended 되어 있을 겁니다.
아무 것도 못하고 있다는 이야기죠.
3. 만약에 앱을 실행한 뒤에 다른 앱을 사용해도 서비스를 계속 해야 한다면},
서비스 레벨로 개발을 해야 합니다.
4. 폰인 Deep Sleep으로 넘어가면, 모든 앱은 통신을 못하고 푸시만 받을 수 있고, 푸시 받고 다시 멍청한 상태로 돌아가는데, 이걸 방지 하려면 폰을 계속 wake 상태로 두는 기능을 추가해야 합니다.
이런 요소를 미리 고려해야 한다는 겁니다.
Activity에 코드 다 만들어 놓고,
나중에 이 문제에 봉착해서 Service로 옮기게 되면,
구조가 많이 변하게 될 수도 있습니다.
[코멘트2]
만약에 채팅 서비스라고 가정해 봅시다.
앱이 구동되어 서버에 한번 위치 등록을 한 뒤에 사용자가 강제로 앱을 죽이면 어떻게 될까요?
그런 상태에서 서버에서 계속 메시지를 보내면 사용자가 매우 짜증이 나겠죠.
그러면 앱이 어떤 이유에던 죽었다면 메시지를 보내지 않는게 유효할 겁니다.
앱이 죽기 전에 서버로 "나 죽어가, 메시지 보내지마" 라고 보내고 서버가 받으면 처리가 가능하나..
미처 서버로 가기전에 앱이 죽거나, 순간 네트워크가 안되어 유실 될 수도 있습니다.
이런 경우를 방지하기 위해서
GPS를 특정 주기 + 특정 범위가 벗어났을 때
서버로 위치 정보를 줍니다.
예를들어 1분에 한번씩 서버에 위치 정보를 주기로 했다면,
서버에서 최소한1분 안에 위치 정보가 올라온 사람들 한테만 메시지를 보내면 됩니다.
1분이 지나면 expired 시키는 거죠.
앱이 죽으면 위치 정보를 보내지 못하기 때문에,
1분 뒤에는 서버에서 아무런 메시지도 보내지 않겠죠.
[코멘트 3]
같은 지역에 있는 유저를 가져오는 가장 쉬운 방법은..
크롬을 열어 maps.google.com 이라고 쳐보세요.
조금 있으면 url이 이렇게 변합니다.
https://www.google.com/maps/@37.~~~,126.~~~,14z
마지막에 14z 라고 되어 있죠?
이게 zoom level이라고 합니다.
표준이라서 구글 맵에서도 지키는 거고요.
https://wiki.openstreetmap.org/wiki/Zoom_levels
14 줌 레벨은 한 픽셀당 3m 정도 됩니다.
핸드폰이 width가 1024라면, width가 3km 를 커버한다는 뜻이죠.
핸드폰의 width height가 어찌 되었던, 3km 직사각형을 하나의 블록으로 본다면,
특정 지역을 Tile로 정의할 수 있습니다.
Tile의 Coordinates를 계산해서 같은 Coordinates에 있으면 같은 블럭에 있다는 뜻이므로,
정수나 String 비교로 같은 위치인지 알 수 있습니다.
이 계산을 DB로 하지 말고, 앞서 이야기한대로 Firebase (전 안해봐서 추천은 안합니다)나
Redis 같은 메모리 DB를 사용하면 Key Value로 바로 매칭이 가능합니다.
길었지만, 코딩 들어가기전에 방향을 결정하시고 가면 되고,
각각이 기능들을 별도의 테스트 프로젝트 세가지를 다 구현해서 문제가 없으면
서비스 개발에 들어가는 것을 추천합니다.