사례

펜션/게스트하우스 소개 + 예약 문의

결과물 새 탭 ↗
프로젝트 시작7월 31일 오후 06:47바로 개발 시작
개발 내용
펜션/게스트하우스의 소개 + 예약 문의 웹서비스를 만들어줘. - 감성 사진 + 객실별 빈방 달력 + 예약 문의가 있는 지역 숙박 사이트야 (확정은 전화/입금). - 방문자: 메인(대표 비주얼·소개·위치/주변), 객실 목록/상세(사진 갤러리·기준/최대 인원·편의시설·주중/주말/성수기 요금), 예약 가능 달력(객실별·예약된 날짜 표시), 예약 문의 폼(객실·체크인/아웃·인원·연락처·요청) → 접수 + 계좌 안내, 이용 안내/FAQ. - 관리자(/admin, 로그인): 예약 문의 접수함(확정/취소), 예약된 날짜 막기(객실별 달력), 객실/요금/갤러리 관리. - 데이터: rooms(name, images[], base_capacity, max_capacity, amenities[], price_weekday, price_weekend), blocked_dates(room_id, date), inquiries(room_id, checkin, checkout, headcount, phone, memo, status). - 온라인 결제/실시간 확정·OTA 연동·리뷰·다국어는 제외. - 관리자 데모 계정(예: admin / demo1234)을 시드하고, 로그인 화면에 데모 계정 안내를 표시해. - 더미 사진은 picsum.photos 같은 무료 플레이스홀더 이미지 URL로 채워. - 객실 2~3개·갤러리 사진·일부 예약된 날짜·문의 예시를 더미로 채워 달력이 바로 시연되게. - 여백 있고 감성적인 스테이 톤(큰 풍경 사진·세리프 포인트), 모바일 우선.
실행과정79개 작업
파일 읽기
파일 읽기
파일 읽기
파일 목록
파일 읽기
파일 읽기
파일 읽기
파일 읽기
파일 읽기
파일 읽기
파일 목록
작업이 크므로 계획을 세우고 단계별로 진행하겠습니다.
계획
## ① 데이터 구조 문서화 먼저 기획 문서와 개발 계획서를 작성합니다.
파일 생성
파일 생성
계획
## ② 프론트엔드 환경 세팅
명령 실행
이제 디렉토리 구조와 목업 데이터를 만듭니다.
명령 실행
파일 생성
## ③ 공통 컴포넌트
파일 생성
파일 생성
파일 생성
이제 각 페이지를 만듭니다. 먼저 메인 페이지와 객실 페이지부터 진행합니다.
계획
## ④ 메인 페이지
파일 생성
## ⑤ 객실 목록 & 상세 페이지
파일 생성
파일 생성
## ⑥ 예약 가능 달력 페이지
파일 생성
파일 생성
## ⑦ 이용안내/FAQ & ⑨ 관리자 페이지
파일 생성
파일 생성
파일 생성
파일 생성
파일 생성
파일 생성
파일 생성
이제 App.jsx를 라우터로 연결하고, Header의 반응형 처리를 개선합니다.
파일 읽기
파일 생성
이제 App.jsx를 라우터 구조로 변경합니다.
파일 생성
HTML 타이틀도 변경합니다.
파일 수정
로그 확인
명령 실행
로그 확인
명령 실행
로그 확인
명령 실행
로그 확인
Header에서 `matchMedia` 리스너가 문제를 일으킬 수 있어 더 간단한 방식으로 수정합니다.
파일 수정
로그 확인
로그 확인
로그 확인
Home.jsx의 matchMedia 패턴도 수정합니다.
파일 읽기
파일 수정
파일 수정
로그 확인
계획
## ⑩ 백엔드 DB 스키마 & API 구현
파일 읽기
백엔드 API 전체를 구현합니다.
파일 생성
이제 Go 의존성을 설치합니다.
명령 실행
명령 실행
명령 실행
앱 재시작
로그 확인
API가 정상 작동하는지 확인합니다.
명령 실행
## ⑪ 프론트엔드-백엔드 연동
계획
API 클라이언트 모듈과 각 페이지를 연동합니다.
파일 생성
방문자 페이지들을 API 연동으로 업데이트합니다.
파일 읽기
파일 수정
파일 수정
파일 수정
파일 수정
파일 수정
파일 수정
파일 수정
파일 읽기
파일 수정
파일 읽기
파일 읽기
파일 읽기
파일 수정
파일 수정
⏸ 설정한 실행 예산(10,000원)에 도달해 중단했습니다.
10,108.6원 사용
직전 작업이 실행 상한으로 중단되었습니다. 하던 작업을 이어서 계속 진행해 주세요.
7월 31일 오후 07:00
실행과정54개 작업
현재 상태를 파악하기 위해 수정된 파일들과 남은 작업을 확인하겠습니다.
파일 읽기
파일 읽기
파일 읽기
파일 읽기
파일 읽기
파일 읽기
파일 읽기
파일 읽기
이제 관리자 페이지들과 백엔드 API를 확인하겠습니다.
파일 읽기
파일 읽기
파일 읽기
파일 읽기
관리자 레이아웃도 확인합니다.
코드 검색
파일 읽기
파일 읽기
이제 전체 파악이 끝났습니다. 관리자 페이지들을 API에 연동하는 작업을 계획합니다.
계획
**① AdminLogin.jsx** — `adminLogin` API로 대체합니다.
파일 수정
파일 수정
**② AdminLayout.jsx** — 로그아웃에 `adminLogout`을 사용하고 인증 체크도 토큰 기반으로 업데이트합니다.
파일 수정
**③ AdminDashboard.jsx** — API로 문의와 막힌 날짜 데이터를 가져옵니다.
파일 수정
**④ AdminInquiries.jsx** — API로 문의 목록 조회 및 상태 변경.
파일 수정
**⑤ AdminCalendar.jsx** — API로 객실 목록, 막힌 날짜 CRUD.
파일 수정
**⑥ AdminRooms.jsx** — API로 객실 조회 및 수정.
파일 수정
저장 버튼에 로딩 표시도 추가합니다.
파일 수정
이제 API 경로 문제도 점검합니다. 백엔드의 `handleAdminRoomUpdate`가 `/api/admin/rooms/:id` 경로를 제대로 처리하지 못하고 있습니다. 수정하겠습니다.
파일 수정
같은 문제가 blocked-dates 관리자 라우트에도 있습니다. `/api/admin/blocked-dates/:id` DELETE 경로를 처리하도록 수정합니다.
파일 수정
이제 라우트도 새 핸들러를 가리키도록 수정합니다.
파일 수정
코드 검색
파일 읽기
파일 읽기
파일 읽기
라우트 등록이 누락되었습니다. `handleAdminBlockedDates` 함수 앞에 라우트를 추가합니다.
파일 수정
이제 API 서버를 재시작하고 오류를 확인합니다.
앱 재시작
파일 읽기
파일 읽기
`handleAdminBlockedDates` 함수가 `main()` 안에 들어가 있습니다. 구조를 바로잡겠습니다.
파일 수정
파일 읽기
함수 뒤에 남은 중복 코드를 정리합니다.
파일 수정
이제 재시작합니다.
앱 재시작
컴파일 성공! 로그를 확인하고 API를 테스트합니다.
로그 확인
API가 정상 작동하는지 엔드포인트를 테스트합니다.
명령 실행
명령 실행
명령 실행
명령 실행
명령 실행
명령 실행
명령 실행
날짜 형식이 ISO 8601("2026-08-06T00:00:00Z")로 반환되어 UI에 그대로 표시됩니다. 백엔드에서 `YYYY-MM-DD` 형식으로 반환하도록 수정합니다.
파일 수정
blocked-dates도 동일하게 수정합니다.
파일 수정
앱 재시작
날짜 포맷이 수정되었는지 확인합니다.
명령 실행
명령 실행
날짜 포맷이 모두 `YYYY-MM-DD`로 정상 반환됩니다. 이제 브라우저 오류를 확인합니다.
로그 확인
로그에 오류가 없습니다. 계획을 최종 갱신합니다.
계획
실행결과 · 4분 21초 소요
모든 작업이 완료되었습니다. 요약하면: --- ### 완료된 작업 (⑪ 프론트엔드-백엔드 연동 마무리) **관리자 페이지 6곳을 API에 연동:** | 페이지 | 변경 내용 | |---|---| | **AdminLogin** | `adminLogin()` API 호출 → 토큰 발급, 오류 시 서버 메시지 표시 | | **AdminLayout** | 로그아웃 시 `adminLogout()` 호출로 세션 정리 | | **AdminDashboard** | `fetchAdminInquiries()` + `fetchBlockedDates()` 로 카운트·최근 문의 표시 | | **AdminInquiries** | `fetchAdminInquiries()` 목록, `updateInquiryStatus()`로 확정/취소 (낙관적 업데이트) | | **AdminCalendar** | `fetchRooms()` + `fetchBlockedDates()` 현황, `addBlockedDate()`/`removeBlockedDate()` 토글 | | **AdminRooms** | `fetchRooms()` 목록, `updateRoom()` 저장 | **백엔드 수정:** - `handleAdminBlockedDates` — `/api/admin/blocked-dates` 전용 핸들러 추가 (POST/DELETE) - `handleAdminRoomUpdate` — `/api/admin/rooms/:id` PUT 요청을 올바르게 처리하도록 수정 - 날짜 필드를 `YYYY-MM-DD` 문자열로 반환하도록 `DATE_FORMAT` 사용 모든 페이지가 API-first로 동작하며, API 실패 시 mockData로 폴백합니다.
✅ 파일 15개 수정 · 명령 8개 실행 · 앱 재시작
7,088.3원 사용
객실 상세 페이지 접속하면 오류나는데 수정해줘 화면 표시 중 오류가 발생했습니다 TypeError: Cannot read properties of undefined (reading '0') at RoomDetail (https://44-cb0514-dev.glidev.ai/src/pages/RoomDetail.jsx:65:27) at renderWithHooks (https://44-cb0514-dev.glidev.ai/node_modules/.vite/deps/chunk-QXLG2TGQ.js?v=7dafe83b:11594:26) at updateFunctionComponent (https://44-cb0514-dev.glidev.ai/node_modules/.vite/deps/chunk-QXLG2TGQ.js?v=7dafe83b:14628:28) at beginWork (https://44-cb0514-dev.glidev.ai/node_modules/.vite/deps/chunk-QXLG2TGQ.js?v=7dafe83b:15970:22) at beginWork$1 (https://44-cb0514-dev.glidev.ai/node_modules/.vite/deps/chunk-QXLG2TGQ.js?v=7dafe83b:19804:22) at performUnitOfWork (https://44-cb0514-dev.glidev.ai/node_modules/.vite/deps/chunk-QXLG2TGQ.js?v=7dafe83b:19249:20) at workLoopSync (https://44-cb0514-dev.glidev.ai/node_modules/.vite/deps/chunk-QXLG2TGQ.js?v=7dafe83b:19188:13) at renderRootSync (https://44-cb0514-dev.glidev.ai/node_modules/.vite/deps/chunk-QXLG2TGQ.js?v=7dafe83b:19167:15) at recoverFromConcurrentError (https://44-cb0514-dev.glidev.ai/node_modules/.vite/deps/chunk-QXLG2TGQ.js?v=7dafe83b:18784:28) at performConcurrentWorkOnRoot (https://44-cb0514-dev.glidev.ai/node_modules/.vite/deps/chunk-QXLG2TGQ.js?v=7dafe83b:18732:30)
7월 31일 오후 07:14
실행과정37개 작업
파일 읽기
명령 실행
파일 읽기
API `/api/rooms/1`이 `{"id": 1}`만 반환하고 있습니다. 백엔드의 `handleRoomByID` 함수를 확인합니다.
코드 검색
코드 검색
파일 읽기
명령 실행
코드 검색
코드 검색
파일 읽기
코드 검색
파일 읽기
코드 검색
파일 읽기
명령 실행
명령 실행
명령 실행
명령 실행
파일 읽기
문제를 찾았습니다. API `/api/rooms/1`이 `{"id":1}`만 반환하는 원인은 `handleRooms` 함수 내 개별 room 조회 구조체의 JSON 태그에 있습니다. Go에서 `Name, Description string \`json:"name,description"\``라고 선언하면 두 필드 모두 `json:"name,description"` 태그를 공유하게 되어, `encoding/json`이 필드들을 제대로 직렬화하지 못합니다. 반면 목록 조회는 `map[string]any`를 사용해서 정상 동작하는 것입니다. 프론트엔드 오류 `Cannot read properties of undefined (reading '0')`는 `room.images`가 undefined이기 때문에 발생합니다. 백엔드 구조체 태그와 프론트엔드 방어 코드 둘 다 수정하겠습니다.
계획
파일 수정
이제 `handleRooms`의 PUT 핸들러에도 동일한 태그 문제가 있는지 확인합니다.
파일 읽기
PUT 핸들러의 body 구조체도 동일한 태그 문제가 있습니다. 함께 수정합니다.
파일 수정
다른 핸들러에도 동일한 태그 패턴이 있는지 확인합니다.
코드 검색
`handleAdminRoomUpdate`에도 동일한 태그 문제가 있습니다. 수정합니다.
파일 읽기
파일 수정
백엔드 수정이 완료되었습니다. 재시작하고 API를 확인합니다.
앱 재시작
명령 실행
API가 전체 데이터를 제대로 반환합니다. 이제 프론트엔드에 방어 코드를 추가하겠습니다.
계획
파일 수정
이제 JSX에서 `room.images` → `images`, `room.amenities` → `amenities`로 변경합니다.
파일 수정
파일 수정
파일 수정
이미지 배열이 비어 있을 때 갤러리 대신 안내 메시지를 표시하도록 추가합니다.
파일 읽기
계획
로그 확인
HMR 업데이트가 정상 적용되었고, 브라우저 오류가 더 이상 발생하지 않습니다.
계획
실행결과 · 5분 33초 소요
--- ### 완료: 객실 상세 페이지 오류 수정 **원인:** Go 구조체 태그 문법 오류로 `/api/rooms/:id`가 `{"id":1}`만 반환하여 `room.images`가 undefined. Go에서 `Name, Description string \`json:"name,description"\`` 와 같이 여러 필드를 한 줄에 선언하면 **두 필드가 같은 태그를 공유**합니다. `encoding/json`이 이를 제대로 처리하지 못해 모든 이미지/편의시설/가격 필드가 직렬화에서 누락되었습니다. **수정 사항:** | 파일 | 변경 | |---|---| | `` | 3곳의 구조체(`handleRooms` GET, `handleRooms` PUT, `handleAdminRoomUpdate`)에서 필드를 개별 줄로 분리하고 각각 올바른 json 태그 지정 | | `` | `room.images`/`room.amenities` 대신 `images`/`amenities` 변수로 추출하고 `?? []` 기본값 적용 (방어 코드) |
✅ 파일 7개 수정 · 명령 7개 실행 · 앱 재시작
2,511.8원 사용
이 프로젝트는 AI 에이전트와의 대화만으로 만들어졌습니다
44-cb0514.glidev.ai
↗
파일
왼쪽에서 파일을 선택하세요