

두나 (DoNa)DoNa
FEATURED · LIVE데이트 코스 추천 서비스Date-course recommendation service
1인 개발 · Web / iOS / Android 정식 출시Solo build · Live on Web / iOS / Android
장소를 찾는 것에서 끝나지 않고, 데이트 장소의 순서와 동선까지 결정할 수 있도록 만든 서비스Goes beyond finding places — decides the order and route between date spots too
httpOnly Cookie 인증 전환 · N+1 쿼리 개선 · Redis Rate Limiting · 모바일 빌드 이슈 해결httpOnly cookie auth · N+1 query fix · Redis rate limiting · mobile build fix
Problem
기존 지도·장소 검색 서비스는 장소를 보여주지만, 데이트 장소를 어떤 순서로 이동해야 하는지까지 결정해주지는 않았습니다.Existing map and place-search services show you places, but don't decide the order you should move through them for a date.
내 역할My Role
기획 · 프론트엔드 · 백엔드 · DB 설계 · 결제 연동 · 모바일 앱 · 배포 · 운영까지 1인으로 진행했습니다.Solo — product planning, frontend, backend, database design, payment integration, the mobile app, deployment and ongoing operations.
아키텍처Architecture
기술적 문제 해결Technical Challenges
두나를 개발하며 실제로 부딪힌 기술적 문제 중 2가지입니다.Two of the real technical problems I ran into while building DoNa.
Case 01 · 안드로이드 빌드 의존성 충돌Case 01 · Android build dependency conflict
- 문제Problem
- Android 빌드에서 React 19와 react-naver-maps 간 peer dependency 충돌, AGP/Gradle 버전 문제 발생Android build failed from a React 19 / react-naver-maps peer-dependency conflict plus an AGP/Gradle version mismatch
- AI 활용AI use
- 에러 로그를 기반으로 원인 후보와 버전 충돌 가능성을 빠르게 정리Used AI to quickly triage likely causes and version-conflict candidates from the error log
- 직접 검증Verified myself
- 패키지 의존성과 라이브러리 호환성을 직접 확인하고 버전을 조정한 뒤 재빌드해 해결Checked package dependencies and library compatibility myself, adjusted versions, and rebuilt
- 결과Result
- Android 빌드 정상화 및 배포 진행Android build fixed and shipped
Case 02 · 인증 구조 개선 (JWT → httpOnly Cookie)Case 02 · Auth hardening (JWT → httpOnly cookie)
- 문제Problem
- 인증 구조에서 JWT를 localStorage에 저장해 사용 중이었음Auth was storing the JWT in localStorage
- AI 활용AI use
- XSS, httpOnly Cookie, SameSite, CSRF 관련 위험과 대안을 정리Used AI to lay out the XSS/httpOnly-cookie/SameSite/CSRF risks and alternatives
- 직접 검증Verified myself
- 기존 인증 흐름을 분석하고 httpOnly 쿠키 방식으로 직접 전환, SameSite 설정과 요청 흐름을 검증Analyzed the existing auth flow, switched it to httpOnly cookies myself, and verified SameSite settings and the request flow
- 결과Result
- 클라이언트에서 토큰에 직접 접근하는 경로를 제거하고 인증 구조 개선Removed direct client-side access to the token and hardened the auth structure
그 외 구현Also shipped
- 인증 구조 개선: JWT를 localStorage 대신 httpOnly 쿠키로 전환해 클라이언트의 토큰 직접 접근을 제거Auth hardening: moved the JWT out of localStorage into an httpOnly cookie, removing direct client access to the token
- N+1 개선: 각 항목마다 관계 데이터를 반복 조회하던 구조를 relation include 기반으로 재구성해 per-item 반복 조회를 제거N+1 fix: restructured a per-item relation lookup into a single relation-include query, removing the per-item repeated queries
- Redis Rate Limiting: Upstash Redis 기반으로 요청 속도 제한 적용Rate limiting: applied request rate limiting on Upstash Redis
- 빌드 의존성 문제: React 19·react-naver-maps peer dependency 및 AGP/Gradle 버전 충돌 해결Build dependencies: resolved React 19 / react-naver-maps peer-dependency and AGP/Gradle version conflicts
- 결제 연동: TossPayments·RevenueCat 구독 결제 직접 연동Payments: integrated TossPayments and RevenueCat subscription billing myself
- 배포 및 모니터링: Vercel 배포, CloudFront CDN, Sentry 에러 모니터링 연결Deploy & monitoring: shipped on Vercel, fronted with CloudFront CDN, wired up Sentry error monitoring
검증Validation
- 관찰: "코스를 늘리면 구매도 늘 것"이라 보고 35개까지 만들었지만 구매 전환은 0건. 릴스는 조회수가 나와도 시청자가 앱 존재 자체를 모른다는 것도 확인Observed: assumed more courses → more purchases, built up to 35 courses, got zero purchases; also found Reel viewers often don't know the app exists at all
- 판단: "많이 만들면 팔린다"는 가설을 접고, 만들기 전에 수요부터 검증하는 방식으로 전환Decided: dropped the "build more, it'll sell" assumption and switched to validating demand before building
- 실행/검증: 주렁주렁 영등포 빙고 이벤트로 첫 구조적 검증 실험: 카카오톡 채널 설문(66명, 응답률 15%)·당근마켓 투표(118명 중 응답 5명, 60% 긍정)로 약~중간 신호 확인 후 릴스 행동 데이터로 다음 검증 진행 중Validated: ran a bingo-event experiment as the first structured test: a KakaoTalk-channel survey (66 members, ~15% response) and a Daangn poll (118 views, 5 responses, 60% positive) showed a weak-to-moderate signal; now validating further via Reels behavior data
Result
코스 44개 제작, 앱스토어·구글플레이 정식 출시.44 courses built, live on the App Store and Google Play.
콘텐츠 도달 (제품 성과와 별개): Content reach (separate from product performance): 인스타 팔로워 138명('26.08), 협찬 릴스 1건 조회 40만+ — 앱 전환은 별도로 측정하지 않았습니다.138 Instagram followers (Aug '26), one sponsored reel past 400K views — app conversion from this was not tracked separately.
Links