-
Notifications
You must be signed in to change notification settings - Fork 0
Home

- 온보딩 화면으로 기능에 대한 설명을 제공합니다.
- 반려견 정보만 기입해 익명 로그인이 할 수 있습니다.
- 대면으로 5-10cm 정도 기기간 거리와 방향을 유지하면 서로의 반려견 프로필을 공유할 수 있습니다.
- 반려견 프로필을 공유 후 수락하면 메이트 관계가 형성됩니다.
- 메이트에게 산책 요청을 보낼 수 있습니다. 이때 지도에서 만날 장소를 선택하고 메세지와 함께 요청을 보냅니다.
- 산책 요청에 대해서 수락, 거절 응답을 보낼 수 있습니다. 산책 요청에는 1분 답변 제한시간이 있습니다. 제한시간이 지나면 자동으로 거절 처리됩니다.
- 산책 요청, 수락, 거절에 대한 알림을 받을 수 있습니다.
| 온보딩과 로그인 | 메이트 맺기 | 산책 요청 | 정보 수정 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
메이트 맺기 시점의 프로필드랍 동작

NameDrop 형태의 방식으로 기기간 특정 액션에 대한 반응으로 반려견 프로필 카드를 공유할 수 있는 서비스를 제공합니다. 사람이 대면으로 만나 서로의 반려견 프로필을 공유해야합니다.
따라서 특정 거리와 방향을 판단할 수 있는 NearbyInteraction과 피어 간 데이터 공유를 진행할 수 있는 MultipeerConnectivity 기술을 선택했습니다.
아래는 동작 방식에 대한 플로우입니다.
- 기기들은 각각 NISession과 MPCSession을 독립적으로 시작합니다.
- 각 기기들은 MPCSession을 통해 Advertising / Browsing 작업을 수행합니다.
- 기기가 발견된다면 Invite 하고 세션을 연결합니다.
- NISession은 시작되면 자동으로 기기마다 DiscoveryToken을 생성합니다.
- DiscoveryToken을 기기끼리 교환하기 위해서 MPCSession을 이용합니다.
- DiscoveryToken이 정상적으로 교환되면 NISession으로 연결되고 기기의 거리와 방향을 파악할 수 있습니다.
- 이후, 해당하는 거리와 방향에 있는 기기와 MPCSession을 통해 데이터(프로필 카드)를 교환하게 됩니다.
- 데이터 교환이 마치면 프로필 공유가 되었다는 데이터를 상대방에게 전달합니다.
- 상대방에게 데이터 공유가 되었다는 데이터를 받고 자신도 상대방의 프로필을 받았다면 NI, MPC Session 모두 종료됩니다.
SniffMEET은 서버 프로바이더로 Supabase를 선택했습니다.
-
익명 로그인 기능 사용
서버의 데이터베이스와 스토리지에 접근하려면 인증된 사용자이어야 합니다. 하지만 회원가입을 하지 않아도 우리 서비스를 사용할 수 있게 하기 위해 익명 로그인 기능을 도입했습니다.
사용자는 회원가입과 로그인을 하지 않아도 초기 정보 입력만 한다면 인증을 받을 수 있도록 구현하였습니다.
-
직접 HTTP REST API 통신으로 서버와 통신
저희 HGD 팀은 third-party 라이브러리를 사용하지 말자는 룰이 있었습니다. 따라서 Supabase SDK 또한 사용하지 않았으며 이에 직접 HTTP REST API로 서버와 통신합니다.
-
Supabase Network Layer SniffMEET의 Supabase와의 통신 레이어는 크게 AuthManager, DatabaseManager, StorageManager, SessionManager로 이루어집니다. 각 Manager들의 역할은 다음과 같습니다
-
AuthManager는 사용자의 인증을 담당합니다.
서버에 익명 사용자를 등록하고 세션을 받아오며, 앱이 다시 실행되었을 때 세션을 복원하고, 세션이 만료되었을 때 세션을 갱신하는 역할을 합니다.
-
DatabaseManager는 서버의 데이터베이스에 접근하는 역할을 담당합니다.
url, 헤더, 쿼리에 대한 정보를 받고 Supabase 서버와 통신하여 서버의 테이블에 삽입/갱신/요청 작업을 하게 됩니다.
-
StorageManager는 서버의 스토리지에 접근하여 비정형 데이터를 업로드/다운로드 하는 역할을 합니다.
마찬가지로 url, 헤더, 쿼리에 대한 정보를 통해 Supabase 서버와 통신하게 됩니다.
-
Supabase의 모든 통신 작업은 SessionManager가 관리하는 세션을 통해 이루어집니다.
SessionManager는 현재 세션의 만료 시간을 확인하고, 갱신이 필요하면 갱신을 요청하는 역할을 합니다.
-
-
Supabase 유저 인증 과정
Supabase의 유저 인증은 데이터 베이스의
anon-key와 유저의 JWT 토큰으로 이루어집니다.서버에서 세션을 받아와서 활용하는 방법은 유저 생성과 세션 갱신 두 가지가 있는데, 다음과 같은 로직으로 이루어 집니다.
| 익명 로그인 | 세션 갱신 |
|---|---|
![]() |
![]() |
-
유저 생성
공개 키인 anon-key를 이용하여 완전 새로운 유저에 대한 세션을 받아오는 작업을 합니다.
서버의 auth 테이블에 새로운 유저가 생성되게 되며, 응답으로 JWT, 리프레시 토큰, 유저 정보와 같이 세션을 구성하는 정보가 오게 됩니다. AuthManager는 이 정보를 이용하여 Session을 만들어 SessionManager에 전달합니다.
-
세션 갱신
Refresh Token을 이용하여 현재 유저의 세션을 갱신하는 작업을 하게 됩니다.
서버에 Refresh Token을 이용하여 요청을 하게 되면, 세션이 만료된 유저의 새로운 JWT, 리프레시 토큰, 유저 정보를 갱신받아 올 수 있으며, 익명 로그인과 마찬가지로 AuthManager가 이 정보를 이용하여 Session을 새로 만들어 SessionManager로 전달합니다.
| 산책 요청 화면 | 원하는 장소 선택 | 장소와 메세지 입력 후 산책 요청 |
|---|---|---|
![]() |
![]() |
![]() |
- 메이트 관계인 유저에게만 산책 요청을 보낼 수 있습니다.
- 산책 요청은 만날 장소를 선택하고 간단한 메세지와 함께 보낼 수 있습니다.
- 산책 장소를 선택하는 기능은 MapKit를 사용하였습니다. 사용자의 현재 위치 권한을 받고 우선적으로 사용자의 위치를 지도에 보이도록 구현하였습니다.
| 산책 응답 알림 | 산책 요청 응답 확인 | 수락 혹은 응답 | 제한 시간 초과시 자동 거절 처리 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- 상대방이 산책 요청을 보내면 응답할 수 있습니다.
- 산책 요청에 대한 위치도 확인할 수 있습니다.
- 응답에는 제한시간이 있어 산책 요청 보내는 시간부터 1분 안에 응답하지 않으면 자동 거절 처리됩니다.
- 제한시간은 1초 마다 감소시키기 위해
Just를 이용하여 즉시 첫 값을 발행 후, 1초 마다 publish하면 제한 시간이 초과된 경우에는 자동 거절 처리하도록 구현했습니다.
- 제한시간은 1초 마다 감소시키기 위해
알림 서버에 산책 요청을 post하면 아래와 같은 플로우로 메이트에게 알림을 전송합니다.
- receiver의 id 값을 통해 Supabase DB에서 device token을 검색합니다.
- device token을 찾은 경우 notification 테이블에 알림을 추가합니다.
- APNs에 알림을 보냅니다.
메이트가 1분 안에 산책 요청에 대한 응답을 하지 않은 경우 자동으로 서버에서 거절합니다.
- 산책 요청을 받으면 거절하는 Task를 1분 뒤 스케줄에 등록합니다.
- 1분 뒤, 거절 로직 실행 직전 walk_request 테이블을 조회해 요청의 상태가 pending인지 확인합니다.
- 요청의 상태가 pending인 경우 산책 요청 거절 로직을 수행합니다.
| 팀노션 | Wiki | 디자인 | 프로덕트 백로그 |
|---|
마지막 수정일 2024.12.06.
NI, MPC
리팩토링/리디자인
테스트
Supabase
- 배현진
- 윤지성
- 최진원
- 허혜민












