미데이
헤어·네일 같은 뷰티샵을 찾아 예약보증금을 걸고 예약하는 플랫폼입니다. 회원용 모바일 앱과 입점사·관리자가 쓰는 어드민 웹을 혼자 만들었습니다.
- 참여 기간
- 2026.07 – 2026.09
- 소속
- 한다글다글
- 담당
- 회원 앱 · 입점사/관리자 어드민
- 스택
- FlutterTypeScriptNext.jsReactTailwind CSS
어떤 서비스인가
샵과 시술, 담당 직원과 시간대를 고르면 예약보증금을 결제하고 자리를 잡습니다. 노쇼가 잦은 업종이라 보증금이 서비스의 중심에 있습니다.
취소·노쇼 여부에 따라 보증금이 회원에게 돌아가거나 업체 정산으로 넘어갑니다. 한국어·영어·중국어를 지원합니다.
주요 기능
- 예약 — 디자이너·시간대 가용성 확인, 임시 점유 후 보증금 결제로 확정
- 변경·취소 — 정책에 따른 환급 판정, 노쇼는 업체 정산으로
- 빈자리 대기 — 마감된 시간대에 신청해두면 자리가 나면 알림
- 탐색 — 지역 피드, 랭킹, 오늘 예약 가능, 지도, 통합 검색
- 문의 채팅과 리뷰 — 방문 완료 건만 작성, 업체 신고와 관리자 승인
- 다국어 — 화면 문구는 물론 샵 소개·리뷰 같은 사용자 글까지 번역
- 입점사 어드민 — 예약·상품·직원·고객·보증금·콘텐츠 운영
맡은 범위
- 회원 앱 전체 — 탐색·예약·결제·리뷰·문의·대기, 스토어 배포까지
- 어드민 웹 전체 — 입점사 화면과 플랫폼 관리자 화면 모두
- 두 계정 체계의 로그인·세션 분리
- 다국어(한국어·영어·중국어) 적용
정책이 네 번 바뀐 취소·환급
언제까지 취소하면 얼마를 돌려주는지가 두 달 사이 네 번 바뀌었습니다. 시각 기준이 날짜 기준으로, 다시 결제일 기준으로 옮겨 갔고 변경 횟수 제한까지 붙었습니다.
돈이 오가는 규칙이라 화면 문구만 고쳐서 끝나지 않고 예약 흐름 전체를 매번 다시 맞춰야 했습니다. 정책 문서를 단일 기준으로 두고 바뀐 부분만 따라가는 방식으로 정리했습니다.
토큰 갱신 — 한 번도 동작한 적 없던 재시도
만료된 토큰을 새로 받아오는 경로가 실제로는 한 번도 작동하지 않았고, 재시도에 들어간 요청들이 조용히 멈춰 있었습니다. 갱신 요청 자체가 인증을 통과하지 못했고, 재시도가 다시 같은 처리로 들어가며 서로를 기다리는 상태였습니다.
갱신 요청은 인증 처리를 건너뛰도록 하고 대기열이 풀리는 순서를 바로잡았습니다.
한 웹에 들어온 두 종류의 계정
입점사와 플랫폼 관리자가 같은 어드민 웹을 쓰는데, 통과 검사가 둘 중 아무 쿠키나 있으면 열어주고 있었습니다. 관리자로 입점사 화면에 들어가면 페이지는 뜨는데 데이터 요청만 전부 막히는 상태가 됐습니다.
경로별로 어느 쪽 계정을 봐야 하는지 갈라, 권한이 없으면 자기 화면으로 돌려보내도록 했습니다.
언어를 바꾸면 로그인이 풀리는 문제
앱 언어를 바꾸면 로그인이 함께 풀렸습니다. 로그인 상태를 들고 있는 쪽이 언어 설정에 딸린 다른 객체를 바라보고 있어서, 언어가 바뀌면 그 객체와 함께 세션까지 새로 만들어졌기 때문이었습니다.
둘의 의존 관계를 끊어 언어와 세션이 서로 영향을 주지 않게 했습니다.
배포본에서만 모든 통신이 실패한 이유
개발 중에는 멀쩡한데 스토어에 올릴 빌드에서는 iOS·안드로이드 모두 서버 통신이 전부 실패했습니다. 빌드할 때 넘긴 환경 설정이 무시되고 앱이 개발용 주소를 그대로 보고 있었습니다.
운영 빌드일 때 운영용 설정을 읽도록 고쳤습니다. 로컬에서는 드러나지 않고 배포해야만 보이는 종류의 문제였습니다.