차곡 BE 기획안 v1.0

작성: 백엔드 · 대상: 프론트엔드, 프로덕트 디자인, (일부 항목 외부 법무)

원문 「차곡 MVP」·「기능 명세」를 백엔드 관점에서 답한 문서입니다.

결정 장부 보기 → 마일스톤 보기 →

0. 이 문서 읽는 법


1. 모든 기능에 적용되는 확정 사항

특정 기능 하나가 아니라 14개 기능 전부에 걸리는 전제입니다. 여기부터 읽어야 2장이 이해됩니다.

1.1 데이터 원칙 결정

서버에 저장하는 것과 저장하지 않는 것입니다.

데이터서버 저장형태
방문 기록 (지역 / 지하철역 / 음식점)저장함내부 식별자 + 날짜
GPS 좌표, 이동 경로, 머무는 중간 위치저장 안 함처리하는 순간에만 존재
걸음 · 거리 · 고도저장함하루 단위 합계값
하늘 사진 원본저장 안 함추출한 색만 저장
음식 사진 원본저장 안 함사진이 붙어 있다는 표시만 저장, 서버에 저장하지 않아도 앱에서 사진을 띄울 수 있다고 하던데.?
하늘 색저장함날짜 + 색
집 · 직장 위치저장 안 함기기 안에서만 걸러냄

1.2 아키텍처 골격 결정

1.3 용어


2. 기능별 상세 (원문 §1~§14)

§1 적립

A. 이렇게 동작합니다 결정

방문·걸음·하늘 색이 트랙별로 쌓이고, 무엇이든 바뀌면 뒤에서 도는 처리기가 그 여파를 결산·수집 현황·배지에 반영합니다. 방문은 "어떤 종류(지역/역/음식점)의 무엇을 언제" 형태로 저장합니다. 같은 날 같은 지역을 여러 번 지나가도, 데이터베이스가 같은 날 같은 지역은 한 건만 남기도록 막아주어 자연스럽게 하루 1회로 정리됩니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다

§2 온보딩 / 과거 데이터 가져오기

A. 이렇게 동작합니다 결정

설치 직후 사진첩을 훑어, 각 사진에 담긴 (촬영 좌표, 촬영 시각)만 500~1,000장씩 나눠 서버로 보냅니다(여러 묶음을 동시에 보낼 수 있습니다). 서버는 좌표를 행정구역으로 바꿔 "누가 어느 지역에 어느 날" 형태로만 저장하고 좌표는 버립니다. 같은 날 같은 지역은 한 건만 남으므로, 다시 가져오거나 같은 묶음을 중복해 보내도 기록이 어긋나지 않습니다. 그래서 응답을 못 받은 묶음은 그냥 다시 보내면 됩니다. 모든 묶음이 끝나면 그 기간의 과거 결산을 만들어 줍니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다

§3 지역 도장깨기 (발 디딘 지역을 자동으로 채워가는 기능)

A. 이렇게 동작합니다 결정

좌표를 행정구역으로 바꾸는 일은 서버가 합니다. 전국 행정구역 경계는 공공데이터포털의 통계청 자료(무료이며 상업적 이용이 허용됨)를 쓰고, 행정안전부 코드를 표준으로 삼으며, 반기마다 갱신하되 기준 날짜를 판본으로 붙입니다. 저장은 가장 작은 단위인 행정동으로 하며, 시·군·구는 여기서 자동으로 얻어집니다(행정동을 알면 상위 구는 알 수 있지만, 반대로는 알 수 없기 때문입니다). 행정구역이 개편되면 "옛 지역이 어느 새 지역으로 이어지는지" 적은 대응표를 두고, 과거 기록은 그대로 보존한 채 화면에 보여줄 때 최신 지역으로 바꿔 셉니다. 지하철역 정보는 국가철도공단 표준 자료를 단일 출처로 씁니다.

B. 확인이 필요한 부분입니다

§4 활동 적립 (걸음 · 거리 · 고도)

A. 이렇게 동작합니다 결정

건강 데이터는 하루 단위 합계값만 받습니다. 받을 때 "없으면 새로 넣고 있으면 덮어쓰는" 방식이라, 처음 보내든 나중에 워치 동기화로 값이 바뀌어 다시 보내든 같은 통로로 처리됩니다. 실제로 값이 달라진 날짜만 다시 계산합니다. 뒤늦은 보정은 7일까지만 받아주며, 이미 확정된 순위는 그 시점의 값을 따로 저장해 두었기 때문에 나중 보정으로 뒤집히지 않습니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다

§5 미식 도감 / 확인 카드

A. 이렇게 동작합니다 결정

음식점에 머문 것을 감지하는 일은 기기가 합니다. 머무름이 끝나는 즉시 서버가 근처 음식점 후보 n개를 붙인 확인 카드를 만들어 두므로, 외부 장소 검색 호출이 식사 시간대에 자연스럽게 나뉘고, 밤에 사용자가 카드를 열면 기다림 없이 후보가 떠 있습니다. 사용자가 답하지 않은 카드는 7일간 두었다가 지웁니다. 확인받지 않은 방문을 임의로 맞다고 처리하지는 않습니다. 사진은 사용자가 사진첩에서 골라 붙이며, 파일은 기기에만 두고 서버에는 "사진이 붙어 있다"는 표시만 둡니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다

§6 하늘 아카이브

A. 이렇게 동작합니다 결정

사진첩에서 고르는 것이 아니라 앱 안의 카메라로만 찍습니다(그날 실제로 찍은 하늘임을 보장하기 위해서입니다). 찍은 사진에서 대표 색을 뽑아 서버에는 그 색만 보냅니다. 사진 원본은 물론 축소본도 서버에 두지 않습니다. 며칠 연속 찍었는지와 보호 아이템 처리는 하루가 끝나는 시각 기준을 따릅니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다

§7 하루 마감 / 결산 확인

A. 이렇게 동작합니다 결정

임시 결산이 미리 만들어져 있으므로 진입하면 곧바로 보이고, 음식점 확인 카드를 처리하면 그 내용이 반영되어 확정됩니다. 확인을 건너뛰어도 임시 결산은 그대로 열립니다. 처리하지 않은 확인은 7일에 닫힙니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다

§8 결산

A. 이렇게 동작합니다 결정

미리 계산해 저장해 둡니다. 확정된 과거 결산은 바뀌지 않습니다(사용자가 직접 삭제를 요청한 경우만 예외입니다). 다시 계산해야 할 일이 생기면 앞서 말한 하나의 신호로 일원화해 처리합니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다

§9 도감 (수집 현황)

A. 이렇게 동작합니다 결정

누적 개수는 기록이 하나 늘 때마다 조금씩 더해 두는 방식으로 셉니다(화면에 들어올 때마다 전체를 다시 세지 않습니다). 세는 기준은 우리 내부 식별자입니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다

§10 배지

A. 이렇게 동작합니다 결정

단골·첫 등록 같은 배지 판정은 우리 내부 식별자를 기준으로 합니다. 배지를 언제 주고 언제 회수할지는 "기록을 며칠까지 고칠 수 있는가"에 달려 있습니다. 사용자가 위치 기록을 전부 삭제하면 위치로 얻은 배지도 함께 회수합니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다

§11 공유 카드

A. 이렇게 동작합니다 결정

밖으로 공유되는 이미지에는 모아서 요약한 값만 담고, 언제 어디에 갔다는 낱낱의 방문 기록이나 걸음 수 원본은 담지 않습니다. 하늘 색 모자이크나 환산 문구는 위치가 드러나지 않아 안전하고, 개별 가게 이름·다녀온 동네 목록·순위는 사는 곳이 드러날 수 있어 주의가 필요합니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다

§12 친구 / 겹치는 장소 / 순위

A. 이렇게 동작합니다 결정

친구와 내가 같이 가본 장소가 얼마나 겹치는지를 보여주는 지표는, 서로를 친구로 등록한 사이일 때만 계산하고, 결과에 좌표는 담지 않으며, 우리 내부 식별자를 기준으로 셉니다. "동네" 순위에서 사용자가 어느 지역에 속하는지는 주로 머무는 지역(사는 동네에 해당)을 행정동 단위로 판정해 정합니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다

이 기능은 백엔드 작업량이 v1에서 가장 크며, 미팅과 무관하게 이어서 결정합니다.

§13 알림

A. 이렇게 동작합니다 결정

보내는 시점은 원문에서 확정된 것을 유지합니다(하늘 촬영·하루 마감·다시 알림·밀린 확인·결산 생성). 사용자마다 다른 시간대에 맞춰 보냅니다. 알림 문구를 서버에서 관리하는 방식과 세부 예약 방식은 아직 정하지 않았습니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다

§14 프라이버시 / 데이터 통제

A. 이렇게 동작합니다 결정

좌표는 어떤 서버 기록에도 남기지 않습니다. 계정 삭제는 실제로 지우는 것입니다(다만 이미 확정된 남들의 순위가 소급해 바뀌지 않도록, 지난 순위표에 남은 내 자리는 "탈퇴한 사용자"로만 바꿉니다). 위치 기록 전체 삭제가 무엇을 지우는지도 정해 두었고, 데이터 내보내기는 남이 얽히지 않은 본인 데이터만 대상으로 합니다.

B. 확인이 필요한 부분입니다

C. 아직 정하지 않은 부분입니다


3. 이번 미팅에서 결정해야 할 것

우선순위 순입니다. 각 항목은 "질문 → 백엔드 제안 → 정해지면 풀리는 것" 순으로 정리했습니다.

  1. 지도 방식 — 실제 지도를 v1에서 완전히 빼고 점·칸 방식으로 갈까요? 백엔드 제안은 "그렇게 하자"입니다(시안 기준). 정해지면 경계 데이터를 앱에 넣는 문제와 지도 사용료 논의가 사라집니다.
  2. 하루가 끝나는 시각 — 자정으로 통일할까요? 백엔드 제안은 "그렇게 하자"입니다. 걸음 수 같은 건강 데이터가 자정 기준으로만 들어와서, 다른 기준을 쓰면 트랙마다 하루가 어긋나기 때문입니다. 기기의 하루 구분도 자정으로 맞출 수 있는지 확인이 필요합니다. 정해지면 결산·순위 기간 계산이 한꺼번에 확정됩니다.
  3. 지역을 보여주는 단위 — 수집 현황·동네 순위·배지를 어느 단위로 보여줄까요? 백엔드 제안은 "서울 36%"처럼 큰 지역 안 진행률을 함께 보여주는 계층형이고, 동네는 행정동 기준입니다. 저장은 이미 행정동이라 어떻게 정해도 데이터는 지원됩니다.
  4. (통보) 밀린 확인 일괄 처리 — 사용자가 안 본 방문을 한꺼번에 "맞다"로 처리하는 기능은 없앴고 "모두 넘기기"만 남겼습니다. 안 본 방문을 맞다고 처리하면 수집 현황·배지·친구와 겹치는 장소 집계가 오염되기 때문입니다. 이견이 있으면 다시 논의합니다.
  5. (시간이 되면) 발 디딤과 통과를 나누는 기준 / 공유 이미지에 담아도 되는 범위 / 지난 기록을 며칠까지 고칠 수 있게 할지입니다.

4. 외부의 확정을 기다리는 항목