지원 방식: 전체
어디에 저장되나
시작 방식에 따라 저장 위치가 다릅니다. 어느 쪽이든 앱 제공자 서버에는 저장되지 않습니다.
| 시작 방식 | 저장 위치 | 지원 기기 |
|---|---|---|
| 둘러보기 | 저장하지 않음 (예시 데이터) | 전체 |
| 앱에 직접 입력 | 기기 내부 저장소 (Apple 기기는 본인 iCloud에도 동기화, Android는 기기 간 공유를 켠 경우 본인 Google 드라이브) | 전체 |
| Google Sheets 연동 (1.0까지) | 사용자 본인의 스프레드시트 | iPhone · iPad · Mac |
| 짜보기 구성안 (1.3.0부터) | 기기 내부 저장소 (Apple 기기는 본인 iCloud에도 미러링) | 전체 |
앱에 직접 입력한 데이터
계좌·보유 종목·현금·목표 비중이 기기 내부에 JSON으로 저장됩니다. 저장 위치는 다른 앱이 읽을 수 없는 앱 전용 영역입니다.
Apple 기기에서는 아이폰·아이패드·맥이 같은 원장을 보도록 사용자 본인의 iCloud에도 동기화됩니다. 이 영역은 사용자의 Apple 계정에 속하고 앱 제공자는 접근할 수 없습니다. iCloud에 로그인하지 않은 기기에서는 동기화가 일어나지 않습니다.
Android에서는 기기 간 공유를 켠 경우에만 같은 일이 일어납니다 — 원장과 진행 중인 리밸런싱이 사용자 본인의 Google 드라이브에 파일 두 개로 저장됩니다. 기본은 꺼져 있고, 앱이 요청하는 권한은 drive.file 하나라 앱이 만든 그 파일 밖은 보지 못합니다.
두 기기에서 동시에 고쳐도 한쪽이 사라지지 않습니다. 서로 다른 계좌·종목을 고쳤으면 양쪽 편집을 모두 반영하고, 같은 종목을 다르게 고친 경우에만 어느 쪽을 남길지 묻습니다.
| 기기 | 보호 방식 |
|---|---|
| iPhone · iPad · Mac | 앱 샌드박스 + 파일 보호 속성 — 기기가 잠긴 상태에서는 읽을 수 없습니다 |
| Android | 앱 전용 저장소 — 다른 앱이 접근할 수 없고, 기기 백업에도 포함되지 않습니다. 기기 간 공유를 켜면 본인 Google 드라이브에도 |
이 데이터는 앱 제공자의 서버로는 전송되지 않습니다. 위 동기화를 켜면 사용자 본인의 iCloud·Google 드라이브로만 갑니다. 설정에서 삭제할 수 있고, 앱을 삭제하면 함께 사라집니다.
짜보기로 만든 구성안 (1.3.0부터)
아직 사지 않은 구성이라 원장과 섞이지 않고 따로 저장됩니다. 원장과 같은 앱 전용 영역에 파일로 두고 같은 파일 보호 속성을 붙입니다.
- Apple 기기 — 아이폰 · 아이패드 · 맥이 같은 목록을 보도록 본인 iCloud에 미러링합니다.
- Android — 기기 안에만 있습니다.
- 남에게 보낸 공유 링크의 구성은 주소의
#뒤에 실립니다. URL 조각은 서버로 전송되지 않아 저장되지도, 접속 기록에 남지도 않습니다. - 받은 코드는 저장을 눌러야 목록에 들어가고, 값의 범위를 앱이 다시 검사합니다.
Google Sheets 연동 (iPhone · iPad · Mac)
Android 앱에는 시트 연동이 없습니다 — 둘러보기와 앱에 직접 입력 두 가지로 씁니다. Android에서 Google 로그인이 뜨는 자리는 기기 간 공유를 켤 때 한 번뿐이고, 그때의 권한은 drive.file 하나입니다(위 참조).
앱은 사용자의 스프레드시트에서 정규화된 App_Data_* 탭만 읽습니다.
기존 원본 시트 (가계부·포트폴리오 등)
→ Google Sheets 수식 / IMPORTRANGE
→ App_Data_Assets · App_Data_Allocation · App_Data_Watchlist · App_Data_Events
→ 앱이 읽고 기기 안에서 계산
App_Data_*탭은 제공되는 템플릿 사본으로 한 번에 만듭니다.- 요청 권한은
spreadsheets.readonly하나입니다 — 앱이 시트를 고치거나 지우지 않습니다. - Google Drive 파일 목록은 조회하지 않습니다. 사용자가 스프레드시트 주소를 직접 넣습니다.
보안 장치
| 장치 | 내용 |
|---|---|
| Google 로그인 | spreadsheets.readonly — 읽기 전용. 쓰기 권한을 요청하지 않음. 1.2.0부터 공개 앱에서 제거 |
| 자격증명 보관 | 2.0에서 증권사 연결을 뺐습니다 — 받는 API 키가 없습니다. 보유 종목은 직접 입력하거나 증권사 화면 캡처로 채웁니다(글자 인식은 기기 안에서만) |
| 앱 잠금 | 생체인증(지문·얼굴)으로 잠금 해제하고, 없으면 기기 잠금(PIN·패턴·비밀번호)으로 대신합니다. 백그라운드에 다녀오면 다시 잠깁니다 |
| 로컬 캐시 보호 | 스냅샷 캐시도 앱 전용 영역에 저장, 설정에서 삭제 가능 |
| 외부 전송 최소화 | 뉴스·시세·재무제표·배당 조회는 종목 식별자만 전송 — 보유 수량·금액·계좌는 보내지 않습니다. 짜보기의 ETF 찾기·비교도 검색어와 종목 심볼만 나가고 투자금·비중은 보내지 않습니다 |
| 외부 AI에 자산 정보 미전송 | 자산 진단·목표 제안·리밸런싱 계산은 전부 앱 안의 규칙 기반 로직입니다. 공개 앱은 AI를 전혀 쓰지 않습니다 |
| 로그 마스킹 | 토큰·계좌번호는 로그와 화면에 노출하지 않음 |
장애 대응
- 시트·뉴스·시장지표 로드가 실패하면 마지막 정상 캐시로 폴백합니다.
- 시장지표는 일부 지표만 실패해도 성공한 지표는 갱신하고 실패분은 이전 값을 유지합니다.