Story Road
방문한 지역의 콘텐츠를 열고 스탬프·음성·사진·글로 추억을 모으는 iOS 여행 다이어리 프로토타입

- 맡은 일
- 서비스 기획 · Swift iOS 개발
- 참여 방식
- 팀 프로젝트
- 기간
- 2026.06.12 — 2026.06.13
방문한 곳에서 열리는 여행 기록
2026년 6월 경북 청소년 창업 해커톤에서 만든 iOS 프로토타입입니다. 여행지에 도착하면 지역의 이야기와 여행자 기록을 볼 수 있고, 방문 스탬프와 자신의 추억을 남길 수 있도록 기획했습니다.
앱 화면
iOS 시뮬레이터에서 확인한 지도 화면입니다. 지역 경계와 방문 전 잠금 상태를 볼 수 있습니다.
주요 기능
- CoreLocation으로 현재 위치와 지역 반경을 비교해 콘텐츠 잠금 해제
- MapKit·GeoJSON으로 경북 22개 시·군과 대구를 포함한 23개 지역 경계 표시
- 방문 스탬프 수집과 진행률 확인
- 여행자의 오디오 스토리를 듣고 AVFoundation으로 음성 녹음
- 방문한 지역 주민의 동네 정보와 이야기 확인
- 사진·글·음성·좋아요·댓글이 있는 지역별 피드
- 지역별 비공개 다이어리에 사진·글·음성 메모 저장
맡은 역할
서비스 기획과 기능 구성에 참여했습니다. 위치 확인부터 잠금 해제, 이야기 감상, 스탬프 수집, 추억 기록으로 이어지는 흐름을 정리하고 Swift·SwiftUI로 iOS 시연용 프로토타입을 개발하는 데 참여했습니다.
트러블슈팅
- 01
심사장에서 실제 여행지 방문을 보여 줄 수 없었습니다.
기존 조건현장 밖에서는 지역 콘텐츠가 잠김
시연 대응데모 모드에서 심사장 시연 가능
해결 과정과 코드 보기
원인
이야기와 스탬프는 실제 지역 반경에 들어가야 열리므로, 심사장에서 여러 여행지를 방문하는 시연이 불가능했습니다.
해결 방법
잠금 조건에
store.demoMode || locationManager.isInside(region)을 적용했습니다. Xcode의 Custom Location으로 위치를 재현하고 데모 모드에서 콘텐츠를 확인했습니다.결과
심사장에서도 지역 콘텐츠를 시연할 수 있습니다. 데모 모드를 끄면 실제 위치 조건으로 돌아갑니다.
실제 코드와 출처
데모 모드나 실제 위치 중 하나가 조건을 만족하면 잠금을 해제할 수 있습니다.
private var canUnlockHere: Bool { store.demoMode || locationManager.isInside(region) } - 02
서버 없이 기록을 저장해야 했습니다.
필요했던 동작서버 없이 기록을 재실행 후에도 유지
현재 구현JSON 기록 + 사진·녹음 파일을 로컬에서 복원
해결 과정과 코드 보기
원인
로그인 서버나 클라우드 없이도 앱을 다시 열 때 스탬프와 추억을 불러와야 했습니다.
해결 방법
스탬프·추억 기록은
SavedState로 묶어 로컬 JSON에 저장했습니다. 사진과 녹음은 별도 폴더에 두고 파일 이름으로 연결했습니다.결과
기기에 저장된 기록을 앱 재실행 후 복원합니다. 기기 간 동기화는 제공하지 않습니다.
실제 코드와 출처
상태를 JSON으로 바꿔 파일에 기록하는 실제 코드입니다.
if let data = try? JSONEncoder().encode(state) { try? data.write(to: Self.stateURL, options: .atomic) }
기술 구성
| 영역 | 기술 | 용도 |
|---|---|---|
| 화면 | Swift · SwiftUI | iOS 17 이상 화면과 상태 처리 |
| 지도·위치 | MapKit · GeoJSON · CoreLocation | 지역 경계, 방문 판정, 잠금 해제 |
| 오디오 | AVFoundation | 녹음·재생, 데모용 음성 합성 |
| 저장 | 로컬 JSON · 파일 저장소 | 스탬프, 추억, 사진, 녹음 |
대회 결과
경북 청소년 창업 해커톤에서 창의상을 수상했습니다.
프로젝트 기술 구성
- SwiftUI
- MapKit
- CoreLocation
- AVFoundation
- Swift
