앱 기획안 · 2026

우리어디

지도에서 지역을 고르면 검증된 코스를 랜덤으로 뽑아 경로까지 그려 주는 국내 여행 앱. 광고는 넣지 않는다.

1,476확정 코스
4,678지점
75권역
0런타임 API 호출
01 — 원칙

추천할 수 있는 곳 중에
인증된 곳을, 인증된 최단 루트로

애매한 결정이 나오면 여기로 돌아온다. 이 문장이 앱의 모든 규칙을 낳았다.

02 — 화면 흐름

훑기 · 비교 · 결정

레퍼런스로 본 지도형 앱들은 모두 이 세 단계를 거친다. 단계마다 하는 일이 다르므로 화면도 달라야 한다. 훑을 때 정보를 다 펴면 눈이 지치고, 결정할 때 정보가 없으면 못 고른다.

어디로 갈까
시도를 고르거나, 그냥 맡기거나
아무데나 골라줘
0지역 고르기 광역단체 경계만 굵게. 고른 시도만 남기고 권역이 펼쳐진다. 이 화면만 단순화한 도형을 쓴다.
여수 · 돌산
12개 코스
자차당일 #신나는필터 2
자세히 보기
#신나는 이동 14분
여수 해상케이블카 · 돌산공원
5곳 · 끼니 2 · ✓인증
#걷기좋은 이동 31분
돌산대교 · 오동도
4곳 · 끼니 2
1훑기 지도가 주인공. 카드를 좌우로 넘기면 지도가 따라 움직인다. 여기서는 고르지 않는다.
여수 · 당일치기
전체자차 뚜벅이↕ 추천순
#신나는 #연인이동 14분
여수 해상케이블카 · 돌산공원
돌산공원 → 정가네 갓 갈치조림 → 해상케이블카 → 돌산대교 → 구백식당
⇄ 바꿀 수 있는 곳 3
점심 · 정가네 갓 갈치조림
   또는 여수돌게장, 삼학집
#걷기좋은
돌산대교 · 오동도
2비교하기 카드를 크게 펴고 대체 가능한 보기를 나열한다. 고를지 정하는 순간에 “바꿀 수 있다”를 알려 줘야 고를 마음이 든다.
여수 해상케이블카 · 돌산공원
전남 여수 · 당일치기 · 자차
6시간 44분총 소요
6시간 30분머무는 시간
14분이동
① 오전
돌산공원
90분 · #나무멍
↓ 자차 약 2분
② 점심
정가네 갓 갈치조림
✓모범음식점 60분
⇄ 또는 2곳
3결정하기 지도에 경로를 그리고, 지점을 순서대로 좌우로 넘긴다. 카드↔마커가 서로를 따라간다.

지표 자리에는 시간을 넣는다 — 예산은 못 준다

부동산 앱이 그 자리에 가격을 쓰듯 우리는 시간을 쓴다. 메뉴 가격도 숙소 요금도 받아올 경로가 없어서 예산(가성비·럭셔리) 축은 폐기했다. 모르는 것을 그럴듯하게 적는 게 제일 나쁘다. 가격을 실제로 받게 되면 넣는다.

6시간 44분 ├ 머무는 시간 6시간 30분 지점마다 실제 체류시간 (손으로 매긴 528건에서 뽑았다) ├ 이동 시간 14분 구간마다 TMAP 실측 └ 끼니 2번 · 인증 ✓
03 — 가장 중요한 기능

나만의 루트

우리는 랜덤 추천만 한다. 그 다음은 사용자 것이다. 추천을 그대로 쓰는 사람보다 고쳐 쓰는 사람이 많을 것이고, 그게 정상이다.

여수 여행
총 6시간 44분 · 이동 14분
① 돌산공원90분
↓ 자차 약 2분
② 정가네 갓 갈치조림60분
↓ 자차 약 2분
③ 여수 해상케이블카120분
+ 지점 추가
순서를 바꾸면 12분 짧아져요
이 순서로괜찮아요
편집 끌어서 순서를 바꾸면 이동시간이 다시 계산된다. 우리 엔진은 제안만 한다 — 고치지 않는다.
지점 추가
근처에서 지도에서검색
돌산공원에서 이동 30분 안
돌산대교
#걷기좋은 · 60분
5분
향일암
#고즈넉한 · 90분
28분
구백식당 ✓백년가게
음식 · 60분
약 5분
지점 추가 — 근처에서 이게 우리가 잘하는 것이다. 이미 담은 지점에서 이동 30분 안의 관광지·인증 식당·숙소를 시간순으로.
다녀오셨나요?
여수 해상케이블카 · 돌산공원
★★★★☆ 4.2 리뷰 37
다녀왔어요
★★★★★ 김○○ · 2026.08.14
케이블카에서 돌산대교까지 걸어간 게 제일 좋았어요. 갈치조림은 웨이팅 30분.
★★★★☆ 이○○ · 2026.08.02
순서를 반대로 도는 게 나을 뻔했어요. 오후 햇빛 때문에.
리뷰 · 별점 코스에 대한 별점이 우리에게 가장 값지다 — “이 집이 좋았는가”는 네이버에도 있지만 “이 순서로 도는 게 좋았는가”는 아무도 갖고 있지 않다.

우리 엔진을 사용자에게 빌려준다

코스를 만들 때 쓰는 규칙을 제안 형태로 내놓는다. 고치지는 않는다. 경고가 아니라 알림이다 — 무엇이 좋은 여행인지는 사용자가 정한다.

순서 최적화 "순서를 바꾸면 12분 짧아져요" 끼니 자리 "점심과 저녁 사이에 들를 곳이 없어요" 같은 테마 "해수욕장이 연달아 있어요" 이동 60분 "③에서 ④까지 1시간 20분이에요. 하루가 빠듯해요" 숙박 자리 "숙소가 마지막 지점에서 22km 떨어져 있어요"
04 — 커뮤니티

인기 있는 루트를 추천으로 올린다
— 인기만으로는 안 올린다

사용자가 짠 루트를 올리고, 다른 사람이 담아 쓰고, 다녀와서 별점을 남긴다. 그중 좋은 것은 우리 추천 코스로 승격시킨다. 다만 인기 하나로 올리면 우리 원칙이 무너진다 — 사용자 루트는 인증 음식점도, 60분 규칙도, 실측 경로도 지키지 않는다.

우리가 코스를 걸러 낸 그 검증기를 그대로 통과해야 한다

실제로 재봤다. 사람이 아무렇게나 이어붙인 루트 300개를 우리 검증기에 넣으면 6%만 통과한다.

미검증음식 254/300 ← 자기 가게를 넣은 홍보 루트가 여기서 걸린다 식당멀음 108 대표없음 87 같은테마연속 35 배필요 12 통과 19/300 (6%)

승격 조건 — 셋을 다 넘어야

인기
담아간 사람 30명 · 리뷰 5개 · 별점 4.0 이상
품질
인증 음식점 · 60분 · 테마 연속 · 대표 관광지 · 배 안 타기
실측
구간을 전부 TMAP 으로 재고 나서

떨어져도 사라지지 않는다

사용자 루트로 계속 남는다. 인기가 있다는 건 그 자체로 값진 정보다. 다만 ✓ 검증됨 딱지를 못 붙일 뿐이다.

떨어진 이유는 작성자에게 알려 준다 — “점심 식당이 인증된 곳이 아니에요”. 고쳐서 다시 올릴 수 있다.

서버는 최소한만 한다 — 무료 범위 안에서

광고가 없으니 수익도 없다. 서버가 무료 티어를 넘으면 그때부터 손해다. 그래서 코스 추천·경로·지점은 전부 앱 안에서 처리하고, 서버는 루트 공유·리뷰·신고만 받는다.

Workers 10만 요청/일 · CPU 10ms D1 DB 500MB · 총 5GB 루트 하나 약 2KB → 500MB 면 25만 개가 들어간다. 용량은 문제가 아니다.

미리 적어 두는 것들

05 — 근거

코스는 이미 만들어져 있다

앱을 만들기 전에 데이터를 먼저 완성했다. 코스·순서·이동시간이 전부 검증을 통과한 것만 들어 있고, 앱은 그것을 읽어 보여주기만 한다.

무엇이 들어 있나

자차
1,067 코스 · 75권역
지하철
337 코스 · 22권역
버스 후보
72 코스 · 확인 대기
관광지
1,282곳
인증 음식점
2,413곳
숙소
983곳

코스마다 통과한 규칙

이동
60분 이상 구간 없음
음식
모범음식점·백년가게만
끼니
연달아 오지 않음
테마
해수욕장 두 번 금지
대표
유명한 곳이 하나는 있음
숙박
그날 마지막 지점 10km 안
배 타는 곳 제외

스토어에서는 껍데기만, 자료는 첫 실행 때

고용량 게임이 하는 방식이다. 스토어 용량 제한을 피하려는 게 아니라 앱 업데이트 없이 코스를 갱신할 수 있다는 게 더 크다 — 지금 실측이 27%인데 채워질 때마다 이동시간이 정확해진다. 스토어 심사 없이 내보낼 수 있고, 커뮤니티 승격 루트도 같은 길로 들어온다.

스토어 앱 ~15MB 코드만 첫 실행 1단계 data.zip 5MB 코스·지점·권역 → 이것만 받으면 앱이 완전히 돈다 첫 실행 2단계 img-<시도>.zip 사진. 백그라운드로, 고른 지역부터 갱신 manifest.json 을 보고 바뀐 묶음만

Cloudflare R2 — 비용 0 (실측)

저장 10GB 무료 우리 187MB 전송 무료 일반 CDN 은 전송료가 비싸다. 광고가 없으니 이게 결정적이다 요청 Class B 1,000만/월 묶는 방식이 갈림길이다 개별 파일로 주면 사용자당 2,408요청 → 월 4,152명까지 시도별로 묶으면 사용자당 20요청 → 월 500,000명까지

사진 2,404개를 낱개로 주면 요청 수에서 막힌다. 시도별 16묶음으로 준다 — 경기 29.4MB · 서울 27.8 · 전남광주 16.4 · 강원 14.9 …

사진은 우리가 갖는다

TourAPI 주소를 그대로 쓰면 앱이 켜질 때마다 남의 서버를 부른다. 느리고, 주소가 바뀌면 사진이 통째로 사라지고, 오프라인에서 안 뜬다. 받아서 줄여 앱에 넣는다 — 런타임 호출 0 이라는 원칙과 같다.

원본 평균 273KB 전체 320MB 카드용 480px 평균 32KB 전체 38MB 상세용 960px 평균 107KB 전체 125MB 받을 때 http 를 https 로 바꾼다 — TourAPI 는 같은 사진을 둘 다로 주는데 http 로 두면 앱에서 mixed content 로 차단돼 사진이 안 뜬다(551장이 그랬다)

음식·숙박 사진은 갖지 않는다. 저작권이 확실히 걸리고, 사용자도 우리 사진보다 실제 리뷰 사진을 본다. 네이버 플레이스로 넘긴다.

대표성은 조회수와 실제 동선으로 매겼다

처음엔 ‘위키 문서가 있는가’로 매겼다. 있기만 하면 되니까 아무도 안 가는 곳이 코스에 들어왔다. 그래서 실제 관심도를 쟀다.

경복궁 조회 18,370회 동선 30 대천해수욕장 조회 728회 동선 183 남포읍성 조회 3회 동선 0 ← 코스에서 뺐다 송지호해수욕장 조회 0회 동선 121 ← 위키가 없을 뿐 실제로 많이 간다 남산케이블카 조회 4회 동선 57 인천국제공항 조회 12,175회 동선 0 ← 문서만 유명하고 관광지가 아니다

둘 중 하나만 좋아도 인정한다. 조회수 하나로 잘랐으면 송지호해수욕장을 버리고 인천공항을 넣을 뻔했다.

06 — 필터

기본값이 있고, 안 건드려도 코스가 나온다

자차뚜벅이
당일치기1박2일2박3일
연인친구가족
#고즈넉한#탁트인#나무멍#바다멍 #걷기좋은#배우는#신나는

동행은 코스를 나누는 축이 아니라 거르는 태그다. 동행마다 따로 만들어 봤더니 거의 같은 코스가 세 벌 나왔다. 코스는 한 번만 만들고, 누구에게 맞는지만 표시한다.

07 — 만드는 순서

서버 없이 되는 데까지 먼저

  1. 데이터를 앱에 넣고 필터로 뽑기 — 완료. 검증 11개 통과
  2. ③ 코스 상세 — 지도 + 순서대로 넘기는 카드 이게 되면 앱의 값어치가 선다
  3. ⓪ 지역 고르기 · ① 훑기 · ② 비교하기
  4. 나만의 루트 — 담기 · 드래그 · 교체 · 추가 여기까지가 서버 없이 되는 전부
  5. ④ 지점 상세 · TMAP · 네이버 링크
  6. 리뷰 · 별점 서버가 필요하다
  7. 커뮤니티 — 루트 공개 · 지점 등록 · 승격 승격 판정은 우리가 이미 쓰는 검증기를 그대로 돌린다

4번이 5·6번보다 앞인 이유: 지점 상세나 리뷰가 없어도 루트를 짤 수 있지만, 그 반대는 아니다.

아직 답을 못 낸 것