마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안녕하세요 지도 관련 질문있습니다.

0 추천
안녕하세요 초보 개발자입니다.

이번에 gps관련해서 공부중인데, 원하는 기능 구현방법을 잘 모르겠어서 질문드립니다.

일단 구현하려는 기능은 map에서 특정 좌표 기준으로 일정 범위 내에

같은 app을 사용하고 있는 사람들에게 메세지를 보내는 기능인데요.

제가 db나 서버에 관해서도 완전히 초보라서 잘 모르겠는데, 생각한 방법을 적어보겠습니다.

1. 메세지를 작성해서 서버에 요청을 한다.

2. 서버에서 App사용자들에게 데이터?요청?을 보낸다.(좌표, 범위)

3. 수신받은 App에서 현재 자신이 있는 좌표가 서버에서 받은 범위 내에 있으면 응답한다.

   좌표내에 없으면 아무것도 하지않는다.

4. 서버에서 응답을 받으면 그 사람들에게 메세지를 전송한다.

이렇게 생각하고 있는데 이 방법으로 구현이 가능할까요?

안된다면 어떠한 방법을 써야할지 혹시 도움주시면 감사할 것 같습니다.
bonon (620 포인트) 님이 2021년 1월 1일 질문

2개의 답변

0 추천
 
채택된 답변
짊문내용이 학교 과제물처럼 보이네요.

먼저, 요구사항이 "특정 좌표 기준으로 일정 범위 내에 같은 앱을 사용하고 있는 사람들에게 메세지를 보내는 기능" 이므로,
서버에서는 각 사용자들의 위치를 알 수 있어야 하겠죠. 이렇게 하려면 서버에서 각 사용자의 좌표를 알아야 합니다. 따라서 앱은 가본적으로 두가지 기능을 수행해야 합니다.
1. 서버로 자신의 좌표를 보낸다.
2. 서버에서 메세지를 받으면, 자신의 범위와 일치하는지 체크한 다음 일치하면 필요한 처리를 한다.

1번의 요구사항을 위해서는, 앱은 시작할 때 위치정보를 보내고, GPS를 모니터링하다가 위치가 바뀌었다면, 이걸 서버에 보내야 합니다. 물론 달리거나, 차량으로 이동할 경우는 위치변경이 너무 빈번히 일어나기 때문에 일정한 시간 간격으로 처리해야 겠죠. 이 정보는 서버에서 DB 같은 곳에 저장하면 되겠죠? 안드로이드에 GPS를 모니터링할 수 있는 클래스들이 제공됩니다.

2번의 경우는 푸쉬메세지를 사용하면 될 것 같습니다. 파이어베이스에 Push Notification을 사용할 수 있습니다. 서버에서 1번을 통해 보관된 데이터를 쿼리를 통해 일정 범위 내에 있는 사용자를 검색하여, Push Notification을 통해 메세지를 보내면 될 것 같습니다. Push Notification은 이미 너무 많은 튜토리얼들이 인터넷에서 검색이 가능합니다.

사실, 서버 개발을 별도로 하실 수 없다면, 1번도 파이어베이스의 파이어스토어나 리얼타임 데이터베이스를 이용하실 수 있습니다. 님의 경우는 이게 더 적합하겠네요. 앱들을 파이어베이스에 로그인하게 하고, 현재 로그인이 되어 있는 사용자이면 메세지를 보내시면 될 듯 합니다. 파이어베이스에 샘플앱도 있고 안드로이드용 라이브러리도 제공합니다. GitHub 에서 찾아보시면 샘플 프로젝트들도 아주 많이 있습니다.
spark (226,380 포인트) 님이 2021년 1월 1일 답변
bonon님이 2021년 1월 1일 채택됨
감사합니다. 댓글을 깜빡해서 늦게달았네요.
참고하겠습니다!
0 추천
위에 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로 바로 매칭이 가능합니다.

길었지만, 코딩 들어가기전에 방향을 결정하시고 가면 되고,
각각이 기능들을 별도의 테스트 프로젝트 세가지를 다 구현해서 문제가 없으면
서비스 개발에 들어가는 것을 추천합니다.
Will Kim (43,170 포인트) 님이 2021년 1월 1일 답변
자세히 설명해주셔서 감사합니다.
참고하겠습니다!
...