어디에 저장되나
시작 방식에 따라 저장 위치가 다릅니다. 어느 쪽이든 앱 제공자 서버에는 저장되지 않습니다.
| 시작 방식 | 저장 위치 |
|---|---|
| 둘러보기 | 저장하지 않음 (예시 데이터) |
| 앱에 직접 입력 | 기기 내부 저장소 |
| Google Sheets 연동 | 사용자 본인의 스프레드시트 |
앱에 직접 입력한 데이터
계좌·보유 종목·현금·목표 비중이 기기 내부에 JSON으로 저장됩니다. 파일에는 iOS 파일 보호 속성이 적용되어, 기기가 잠긴 상태에서는 읽을 수 없습니다.
이 데이터는 어떤 서버로도 전송되지 않습니다. 설정에서 삭제할 수 있고, 앱을 삭제하면 함께 사라집니다.
Google Sheets 연동
앱은 사용자의 스프레드시트에서 정규화된 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 — 읽기 전용. 쓰기 권한을 요청하지 않음 |
| Keychain | 증권사 자격증명은 생체인증 보호로 기기에만 저장. 잔고 조회에만 사용 |
| 앱 잠금 | 기기 소유자 인증으로 잠금 해제, 백그라운드 복귀 시 재잠금 |
| 로컬 캐시 보호 | 스냅샷 캐시에 파일 보호 속성 적용, 설정에서 삭제 가능 |
| 외부 전송 최소화 | 뉴스·시세·재무제표·배당 조회는 종목 식별자만 전송(보유 수량·금액·계좌 미전송). AI 점검만 예외 — 켠 경우에 한해 금액이 포함된 자산 요약을 AI 제공처로 전송(기본 꺼짐, 개인정보처리방침 참조) |
| 로그 마스킹 | 토큰·계좌번호는 로그와 화면에 노출하지 않음 |
장애 대응
- 시트·뉴스·시장지표 로드가 실패하면 마지막 정상 캐시로 폴백합니다.
- 시장지표는 일부 지표만 실패해도 성공한 지표는 갱신하고 실패분은 이전 값을 유지합니다.