Skip to content
Jinwon Choi edited this page Mar 19, 2025 · 2 revisions

391451379-c64cdb32-ad35-405e-9776-3bc6be7fb300

현재 배포(1.7v) 기준 서비스

간략한 기능 설명📱

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

시연 영상 🎥

온보딩과 로그인 메이트 맺기 산책 요청 정보 수정
온보딩과로그인 프로필드랍 산책요청 정보수정

메이트 맺기 시점의 프로필드랍 동작

ProfileDrop

기술을 포함한 기능 설명💡

1️⃣ Profile Drop 기능

NameDrop 형태의 방식으로 기기간 특정 액션에 대한 반응으로 반려견 프로필 카드를 공유할 수 있는 서비스를 제공합니다. 사람이 대면으로 만나 서로의 반려견 프로필을 공유해야합니다.

따라서 특정 거리와 방향을 판단할 수 있는 NearbyInteraction과 피어 간 데이터 공유를 진행할 수 있는 MultipeerConnectivity 기술을 선택했습니다.

아래는 동작 방식에 대한 플로우입니다.

스크린샷 2024-11-07 오후 3 18 08
  • 기기들은 각각 NISession과 MPCSession을 독립적으로 시작합니다.
  • 각 기기들은 MPCSession을 통해 Advertising / Browsing 작업을 수행합니다.
  • 기기가 발견된다면 Invite 하고 세션을 연결합니다.
  • NISession은 시작되면 자동으로 기기마다 DiscoveryToken을 생성합니다.
  • DiscoveryToken을 기기끼리 교환하기 위해서 MPCSession을 이용합니다.
  • DiscoveryToken이 정상적으로 교환되면 NISession으로 연결되고 기기의 거리와 방향을 파악할 수 있습니다.
  • 이후, 해당하는 거리와 방향에 있는 기기와 MPCSession을 통해 데이터(프로필 카드)를 교환하게 됩니다.
  • 데이터 교환이 마치면 프로필 공유가 되었다는 데이터를 상대방에게 전달합니다.
  • 상대방에게 데이터 공유가 되었다는 데이터를 받고 자신도 상대방의 프로필을 받았다면 NI, MPC Session 모두 종료됩니다.

2️⃣ Supabase 서버 통신

SniffMEET은 서버 프로바이더로 Supabase를 선택했습니다.

  • 익명 로그인 기능 사용

    서버의 데이터베이스와 스토리지에 접근하려면 인증된 사용자이어야 합니다. 하지만 회원가입을 하지 않아도 우리 서비스를 사용할 수 있게 하기 위해 익명 로그인 기능을 도입했습니다.

    사용자는 회원가입과 로그인을 하지 않아도 초기 정보 입력만 한다면 인증을 받을 수 있도록 구현하였습니다.

  • 직접 HTTP REST API 통신으로 서버와 통신

    저희 HGD 팀은 third-party 라이브러리를 사용하지 말자는 룰이 있었습니다. 따라서 Supabase SDK 또한 사용하지 않았으며 이에 직접 HTTP REST API로 서버와 통신합니다.

스크린샷 2024-11-07 오후 3 18 08
  • Supabase Network Layer SniffMEET의 Supabase와의 통신 레이어는 크게 AuthManager, DatabaseManager, StorageManager, SessionManager로 이루어집니다. 각 Manager들의 역할은 다음과 같습니다

    1. AuthManager는 사용자의 인증을 담당합니다.

      서버에 익명 사용자를 등록하고 세션을 받아오며, 앱이 다시 실행되었을 때 세션을 복원하고, 세션이 만료되었을 때 세션을 갱신하는 역할을 합니다.

    2. DatabaseManager는 서버의 데이터베이스에 접근하는 역할을 담당합니다.

      url, 헤더, 쿼리에 대한 정보를 받고 Supabase 서버와 통신하여 서버의 테이블에 삽입/갱신/요청 작업을 하게 됩니다.

    3. StorageManager는 서버의 스토리지에 접근하여 비정형 데이터를 업로드/다운로드 하는 역할을 합니다.

      마찬가지로 url, 헤더, 쿼리에 대한 정보를 통해 Supabase 서버와 통신하게 됩니다.

    4. Supabase의 모든 통신 작업은 SessionManager가 관리하는 세션을 통해 이루어집니다.

      SessionManager는 현재 세션의 만료 시간을 확인하고, 갱신이 필요하면 갱신을 요청하는 역할을 합니다.

  • Supabase 유저 인증 과정

    Supabase의 유저 인증은 데이터 베이스의 anon-key와 유저의 JWT 토큰으로 이루어집니다.

    서버에서 세션을 받아와서 활용하는 방법은 유저 생성과 세션 갱신 두 가지가 있는데, 다음과 같은 로직으로 이루어 집니다.

익명 로그인 세션 갱신
  1. 유저 생성

    공개 키인 anon-key를 이용하여 완전 새로운 유저에 대한 세션을 받아오는 작업을 합니다.

    서버의 auth 테이블에 새로운 유저가 생성되게 되며, 응답으로 JWT, 리프레시 토큰, 유저 정보와 같이 세션을 구성하는 정보가 오게 됩니다. AuthManager는 이 정보를 이용하여 Session을 만들어 SessionManager에 전달합니다.

  2. 세션 갱신

    Refresh Token을 이용하여 현재 유저의 세션을 갱신하는 작업을 하게 됩니다.

    서버에 Refresh Token을 이용하여 요청을 하게 되면, 세션이 만료된 유저의 새로운 JWT, 리프레시 토큰, 유저 정보를 갱신받아 올 수 있으며, 익명 로그인과 마찬가지로 AuthManager가 이 정보를 이용하여 Session을 새로 만들어 SessionManager로 전달합니다.


3️⃣ 산책 요청/수락 기능

산책 요청 화면 원하는 장소 선택 장소와 메세지 입력 후 산책 요청
스크린샷 2024-11-07 오후 3 18 08 스크린샷 2024-11-07 오후 3 18 08 스크린샷 2024-11-07 오후 3 18 08
  • 메이트 관계인 유저에게만 산책 요청을 보낼 수 있습니다.
  • 산책 요청은 만날 장소를 선택하고 간단한 메세지와 함께 보낼 수 있습니다.
  • 산책 장소를 선택하는 기능은 MapKit를 사용하였습니다. 사용자의 현재 위치 권한을 받고 우선적으로 사용자의 위치를 지도에 보이도록 구현하였습니다.
산책 응답 알림 산책 요청 응답 확인 수락 혹은 응답 제한 시간 초과시 자동 거절 처리
스크린샷 2024-11-07 오후 3 18 08 스크린샷 2024-11-07 오후 3 18 08 스크린샷 2024-11-07 오후 3 18 08 스크린샷 2024-11-07 오후 3 18 08
  • 상대방이 산책 요청을 보내면 응답할 수 있습니다.
  • 산책 요청에 대한 위치도 확인할 수 있습니다.
  • 응답에는 제한시간이 있어 산책 요청 보내는 시간부터 1분 안에 응답하지 않으면 자동 거절 처리됩니다.
    • 제한시간은 1초 마다 감소시키기 위해 Just를 이용하여 즉시 첫 값을 발행 후, 1초 마다 publish하면 제한 시간이 초과된 경우에는 자동 거절 처리하도록 구현했습니다.

4️⃣ 알림 기능

알림 서버에 산책 요청을 post하면 아래와 같은 플로우로 메이트에게 알림을 전송합니다.

스크린샷 2024-11-07 오후 3 18 08
  1. receiver의 id 값을 통해 Supabase DB에서 device token을 검색합니다.
  2. device token을 찾은 경우 notification 테이블에 알림을 추가합니다.
  3. APNs에 알림을 보냅니다.

메이트가 1분 안에 산책 요청에 대한 응답을 하지 않은 경우 자동으로 서버에서 거절합니다.

  1. 산책 요청을 받으면 거절하는 Task를 1분 뒤 스케줄에 등록합니다.
  2. 1분 뒤, 거절 로직 실행 직전 walk_request 테이블을 조회해 요청의 상태가 pending인지 확인합니다.
  3. 요청의 상태가 pending인 경우 산책 요청 거절 로직을 수행합니다.

🌈 📁 문서

팀노션 Wiki 디자인 프로덕트 백로그

마지막 수정일 2024.12.06.

Welcome to SniffMEET Wiki!

💬 허거덩 팀 규칙

개발 일지

구조
NI, MPC
프로파일링
리팩토링/리디자인
테스트
Supabase

기술 공유

회의록

회의록

트러블 슈팅

발표

💬 허거덩 팀 규칙

Clone this wiki locally