[1부] 대마도 하나비 민숙 구축기: 시작과 뼈대
[1부] 대마도 하나비 민숙 구축기: 시작과 뼈대
🏕️ [1부] 대마도 하나비 민숙 구축기: 거창한 기획서 대신 바이브 코딩으로 뼈대 잡기 “대마도에서 민숙하는데 홈페이지 하나 만들자. 도메인은 로 정했어.” 일본 대마도에서 '하나비' 민숙을 운영하시는 친한 형님의 연락 한 통이 모든 것의 시작이었습니다. 요구사항은...
🏕️ [1부] 대마도 하나비 민숙 구축기: 거창한 기획서 대신 바이브 코딩으로 뼈대 잡기
"대마도에서 민숙하는데 홈페이지 하나 만들자. 도메인은 hanabi.camp로 정했어."
일본 대마도에서 '하나비' 민숙을 운영하시는 친한 형님의 연락 한 통이 모든 것의 시작이었습니다. 요구사항은 명확했습니다. 단순한 숙소 소개를 넘어, 배편 티켓팅과 숙박 예약을 한 번에 처리하고, 밴드나 카카오톡으로 바로 문의를 넘기며, 서브 도메인(shop.hanabi.camp)에서는 자체 제작한 굿즈까지 판매할 수 있는 종합 플랫폼이 필요했습니다.
과거 같았으면 화면 설계서(스토리보드)를 그리고, DB ERD를 그리고, API 명세서를 쓰느라 며칠을 보냈을 겁니다. 하지만 이번엔 다릅니다. 기획서는 머릿속에만 담아두고, 곧바로 제미나이(Gemini)와 커서(Cursor)를 켜서 **'바이브 코딩(Vibe Coding)'**에 돌입했습니다.
🛠️ 아키텍처 구상: 제미나이와의 티키타카
본격적인 코드를 짜기 전, 제미나이와 대화를 나누며 개발 방향과 인프라 아키텍처를 확정했습니다.
- 기술 스택: 프론트와 백엔드를 한 번에 처리할 수 있는 Next.js (App Router). 데이터베이스는 트랜잭션 관리가 확실한 MariaDB와 Prisma ORM 조합.
- 인프라 환경: 현재 연구실에서 빵빵하게 돌아가고 있는 제 Dell PowerEdge T550 서버. 이곳에 Nginx 리버스 프록시를 물려 본 사이트와 굿즈 샵을 분기하기로 했습니다.
특히 여러 사이트를 한 서버에서 돌려야 하니, Node.js 프로세스 관리자인 PM2를 적극 활용하기로 했습니다. 제미나이가 제안해 준 ecosystem.config.js를 통해 메인 사이트(3000 포트)와 샵(3001 포트)을 우아하게 분리하고, 무중단 배포(Zero-downtime) 환경을 세팅할 수 있었습니다.
💻 코딩: 커서를 움직이는 마스터 프롬프트
뼈대를 세우기 위해 가장 중요한 것은 AI 에디터인 커서에게 정확한 맥락과 지시사항을 주는 것입니다. 저는 제미나이와 논의한 비즈니스 로직을 바탕으로 커서에게 던질 '마스터 프롬프트'를 작성했습니다.
커서(Cursor) 프롬프트 엿보기
"프레임워크는 Next.js, 스타일링은 Tailwind CSS를 써.
데이터베이스는 MariaDB이고 `.env` 파일에
`DATABASE_URL="mysql://user:asdf1234@127.0.0.1:3306/domain_folder"` 로 설정해 둬.
대마도 '하나비' 민숙의 랜딩 페이지인데, 메인에는 시원한 바다 이미지와 예약 위젯이 들어가야 해.
Prisma 스키마는 User(소셜 로그인), Booking(숙박 예약), Ticket(티켓팅), Product(굿즈) 모델을 포함하고 관계를 맺어줘.
디자인은 모바일 퍼스트로 깔끔한 화이트/블루 톤으로 해."
이렇게 데이터베이스 연결 정보까지 정확히 찔러주니, 커서가 빈 프로젝트 폴더에 schema.prisma부터 메인 랜딩 페이지 UI 뼈대까지 순식간에 코드를 쏟아냈습니다. 단순한 텍스트 묘사가 실제 동작하는 코드로 번역되는 쾌감, 이게 바로 바이브 코딩의 묘미입니다.
📝 바이브 코딩 팁 (Tip)
- 초기 SNS 연동은 가볍게 (하이브리드 전략): 처음부터 유튜브나 인스타그램의 공식 비즈니스 API를 붙이려면 권한 심사 등 개발 외적인 시간 낭비가 큽니다. 제미나이의 조언대로 초기에는 RSS 피드나 무료 임베드 툴을 활용해 홈페이지에 SNS 영상을 끌어와 '살아있는 느낌'만 주고, 추후 굿즈 판매가 본격화될 때 정식 사업자 API를 연동하는 하이브리드 전략이 1인 개발 속도를 높이는 핵심입니다.
- DB 스키마는 한 번에 설계하라: AI에게 코드를 짜달라고 할 때 가장 빈번하게 꼬이는 부분이 DB 연동입니다. 처음 마스터 프롬프트를 작성할 때 예약, 유저, 상품 등의 주요 테이블 간의 '관계(Relation)'를 명확히 지시해야 이후 기능 확장이 편해집니다.
이렇게 서버 세팅부터 Next.js 프로젝트 생성, 프롬프트를 통한 UI 뼈대 구성까지 하루 만에 마무리되었습니다.
다음 2부에서는 이 뼈대 위에 생명을 불어넣는 작업, 즉 Toss Payments 연동과 복잡한 '실시간 예약 캘린더'를 어떻게 AI의 도움으로 풀어나갔는지 다루겠습니다. 아래 구축이미지와 구축시 제미나이와의 대화 내용입니다.

대마도에서 민숙하는 형님이 있는데 홈페이지 하나 만들려고 지금 도메인은 `hanabi.camp`로 구매하려고 해.
대마도에서 민숙하는 형님이 있는데 홈페이지 하나 만들려고 지금 도메인은 hanabi.camp로 구매하려고 해.
하고 싶은 건 티켓팅과 숙박 예약을 홈페이지에서 가능하게 하고, 일정을 통보할 수 있게 할 거야. 구글이나 네이버, 카카오로 회원가입 가능하게 하고 밴드나 톡방에 바로 문의할 수 있게 하고. 유튜브나 쇼츠 sns도 끌어서 가져오게 할 거야.
굿즈도 만들어 뒀는데 shop.hanabi.camp로 만들어서 판매하게 할 거야. 어때?
🤖 Gemini
대마도에서 '하나비' 민숙을 운영하시는 형님을 위해 아주 멋진 프로젝트를 구상하셨네요! hanabi.camp라는 도메인도 캠핑과 민숙의 느낌을 동시에 주면서 기억하기 쉬워 아주 탁월한 선택이라고 생각합니다.
제안하신 구성은 단순한 홍보 사이트를 넘어 운영 효율성을 극대화한 실무형 플랫폼입니다. 개발자님의 "바이브 코딩" 스타일을 접목해 빠르게 구축할 수 있도록 핵심 포인트를 정리해 드릴게요.
1. 기술 스택 제안 (Vibe Coding 맞춤형) 이미 Next.js, Prisma, MariaDB, Docker 환경에 익숙하시니, 이 스택을 그대로 활용하는 것이 가장 빠르고 확장성이 좋습니다.
- Auth: NextAuth.js를 사용하면 구글, 네이버, 카카오 로그인을 아주 쉽게 통합할 수 있습니다.
- Database: 숙박 예약과 티켓팅은 '재고(방/좌석) 관리'가 핵심이므로, 트랜잭션 처리가 확실한 Prisma + MariaDB 조합이 딱입니다.
- Infrastructure: 현재 운영 중인 Dell T550 서버나 HP Z640에 Docker 컨테이너로 올리고 Nginx로 리버스 프록시 설정(
hanabi.camp,shop.hanabi.camp)을 잡으시면 되겠네요.
2. 주요 기능 구현 전략 ① 티켓팅 & 숙박 예약 시스템 대마도 특성상 배편 시간과 숙박 예약이 연동되는 것이 중요합니다.
- 일정 통보: 예약 완료 시 알림톡(카카오 비즈톡)이나 이메일로 일정표를 자동 발송하는 로직을 추가하세요. (익숙하신 C# .NET으로 백엔드 로직을 짜거나 Next.js API Route 활용)
② SNS 연동 (Social Wall) 유튜브 쇼츠나 인스타그램 게시물을 메인에 띄우면 사이트가 훨씬 생동감 있어 보입니다.
- 직접 API를 연동하기 번거롭다면, RSS 피드를 긁어오거나 SNS 위젯 서비스를 임베드하는 방식으로 '바이브' 있게 처리할 수 있습니다.
③ 문의 채널 통합 플로팅 버튼(Floating Button)을 하단에 배치해 네이버 밴드, 카카오톡 오픈채팅, 전화하기를 한곳에 모아주세요. 일본 현지 운영 중이라도 즉각적인 소통이 가능해 신뢰도가 올라갑니다.
④ 커머스 (shop.hanabi.camp)
- 직접 개발: Prisma로 간단한 상품 테이블을 만들고 결제 API(PortOne 등)를 붙여서 구축.
- 솔루션 활용: 관리가 귀찮다면 Shopify나 국내 솔루션을 서브도메인에 연결하는 것도 방법이지만, 직접 만드시는 게 커스터마이징(민숙 예약 시 굿즈 할인 등) 면에서 유리할 겁니다.
3. 추가 고려사항 (대마도 특수성)
- 다국어 지원: 당장은 한국인 대상이겠지만, 추후 일본어 페이지를 고려해
next-i18next같은 라이브러리를 미리 세팅해두면 좋습니다. - 현지 인터넷 상황: 대마도 민숙 현장에서 예약 확인을 수시로 해야 하므로, 모바일 웹 최적화(PWA)가 필수적입니다.
한 줄 평 "도메인 이름부터 기능 구성까지 완벽합니다. 특히 '티켓팅+숙박+굿즈'가 결합된 형태라 단순 민숙을 넘어 하나의 대마도 여행 브랜드로 성장할 가능성이 커 보입니다!"
PM2로 사이트 관리 중이야
PM2로 사이트 관리 중이야
🤖 Gemini
PM2를 이미 활용 중이시라면 서버 운영의 안정성과 자동화 측면에서 아주 훌륭한 선택을 하신 겁니다! 특히 hanabi.camp와 shop.hanabi.camp처럼 여러 서비스를 하나의 서버(T550 등)에서 돌릴 때 PM2는 필수적이죠.
현재 구상 중인 프로젝트에 PM2를 더 스마트하게 활용할 수 있는 몇 가지 팁을 드릴게요.
1. Ecosystem 파일로 통합 관리 (ecosystem.config.js)
각 서비스를 개별적으로 실행하기보다 설정 파일을 만들어 관리하면, 서버 재부팅 시에도 명령어 한 줄(pm2 resurrect)로 모든 환경을 복구할 수 있습니다.
module.exports = {
apps: [
{
name: "hanabi-main",
script: "npm",
args: "start",
cwd: "/home/user/hanabi.camp", // 메인 사이트 경로
env: {
NODE_ENV: "production",
PORT: 3000
}
},
{
name: "hanabi-shop",
script: "npm",
args: "start",
cwd: "/home/user/shop.hanabi.camp", // 굿즈 샵 경로
env: {
NODE_ENV: "production",
PORT: 3001
}
}
]
};
2. Nginx와 PM2의 조합 (Reverse Proxy)
도메인이 hanabi.camp와 shop.hanabi.camp로 나뉘어 있으니, Nginx에서 들어오는 요청을 PM2가 잡고 있는 각각의 포트(예: 3000, 3001)로 연결해 주시면 됩니다.
hanabi.camp→localhost:3000shop.hanabi.camp→localhost:3001
3. 실시간 모니터링 및 로그 관리 대마도 현지에 계신 형님이 사이트 접속이 안 된다고 연락 올 때를 대비해 아래 기능을 활용해 보세요.
pm2 monit: 서버 내 CPU/메모리 점유율을 실시간 대시보드로 확인 가능합니다.pm2 logs --lines 100: 최근 로그를 확인해 예약 결제나 티켓팅 과정에서 발생한 에러를 빠르게 디버깅할 수 있습니다.pm2-logrotate: 로그 파일이 커져서 디스크 용량을 잡아먹는 것을 방지하기 위해 설치를 추천합니다. (pm2 install pm2-logrotate)
4. Vibe Coding 팁: 자동 배포 연동
코드 수정을 자주 하신다면, --watch 옵션을 켜두거나 GitHub Actions와 연동해 코드가 Push 될 때 PM2가 자동으로 reload 하게 설정하면 개발 효율이 비약적으로 상승합니다. restart 대신 reload를 쓰면 서비스 중단 없이(Zero-downtime) 업데이트가 가능합니다.
한 가지 궁금한 점: 지금 운영 중인 Dell T550 서버의 우분투 환경에서 Docker 컨테이너 내부의 앱을 PM2로 관리하시나요, 아니면 호스트 OS에서 직접 실행 중이신가요? 상황에 따라 로그 연동이나 포트 포워딩 설정이 조금 달라질 수 있습니다!
Rss를 가져오는게 좋을까 사업자로 가입해서 광고하는게 좋을까?
Rss를 가져오는게 좋을까 사업자로 가입해서 광고하는게 좋을까?
🤖 Gemini
유튜브나 SNS 콘텐츠를 홈페이지에 노출하는 방식을 고민 중이시군요! 결론부터 말씀드리면, 형님의 운영 성향과 '바이브 코딩'의 효율성을 고려했을 때 저는 두 방식을 혼합하거나, 우선 RSS(또는 API)로 시작하는 것을 추천드립니다.
각 방식의 장단점을 정리해 드릴 테니 형님과 상의해 보세요.
1. RSS / API 연동 방식 (추천: 시작 단계) 콘텐츠를 '보여주는 것'이 목적이라면 이 방식이 훨씬 가볍고 빠릅니다.
- 장점: * 비용 제로: 별도의 광고비나 대행 수수료가 들지 않습니다.
- 자동화: 형님이 유튜브 쇼츠를 올리면 내 홈페이지에도 자동으로 뜹니다.
- 자유로운 디자인: Next.js에서 데이터를 받아와서 홈페이지 디자인에 딱 맞게 커스텀 UI를 만들 수 있습니다. (예: 메인 화면에 '대마도 현지 실시간 영상' 섹션)
- 단점: * 유튜브 API의 경우 쿼터(할당량) 제한이 있지만, 민숙 홈페이지 규모에서는 충분히 무료 범위 내에서 가능합니다.
- Vibe Coding 팁:
rss-parser라이브러리를 쓰거나, 유튜브 채널 ID만 있으면 JSON으로 피드를 가져오는 무료 서비스를 활용해 빠르게 붙일 수 있습니다.
2. 사업자 광고/공식 파트너 방식 (추천: 확장 단계) 이는 구글/메타 비즈니스 계정을 만들고 API를 공식적으로 연동하거나 광고를 집행하는 방식입니다.
- 장점:
- 정교한 데이터: 누가 클릭했는지, 어떤 영상이 예약으로 이어졌는지 추적이 가능합니다.
- 쇼핑 연동: 인스타그램 샵 기능을
shop.hanabi.camp와 연동해 인스타 사진에서 바로 구매 페이지로 넘어가게 할 수 있습니다.
- 단점:
- 복잡한 심사: 네이버/카카오/메타의 비즈니스 인증 과정이 번거롭고 시간이 걸립니다.
- 관리 리소스: 단순 노출이 아니라 마케팅 관리가 필요하므로 형님이 직접 하기엔 공부할 게 많아집니다.
💡 저의 전략적 제안: "하이브리드 방식"
- 초기 단계 (RSS/공식 위젯): 일단 유튜브 쇼츠와 인스타그램 피드를 RSS나 무료 임베드 툴로 긁어와서 홈페이지에 '살아있는 느낌'을 먼저 줍니다. 개발자님이 Next.js로 뚝딱 만드시기 가장 편한 방법입니다.
- 굿즈 판매 단계 (사업자 연동):
shop.hanabi.camp를 운영하려면 어차피 PG사 결제 연동을 위해 사업자 등록번호가 필요합니다. 이때 사업자용 SNS 계정을 정식으로 만들어 쇼핑 태그 정도만 연동해 주세요. - 문의 채널: 문의는 사업자 계정보다는 지금 구상하신 대로 카카오톡 오픈채팅방이나 네이버 밴드 링크를 직접 거는 게 훨씬 직관적이고 형님이 관리하시기 편할 겁니다. (일본 현지에서도 밴드가 소통하기엔 참 좋죠.)
🛠️ 개발자님을 위한 구현 포인트 지금 PM2로 관리 중이시니, SNS 데이터를 1시간마다 한 번씩 fetch 해서 DB(MariaDB)에 캐싱해두는 간단한 크론(Cron) 작업을 하나 돌리시면 API 호출 제한도 피하고 사이트 속도도 엄청나게 빨라질 거예요.
혹시 유튜브 API 키 발급이나 Next.js에서 RSS 피드 파싱하는 예제 코드가 필요하신가요? 필요하시면 바로 짜드릴 수 있습니다!
자 지금 커서에게 랜딩페이지 구성을 위한 명령지시서 알려줘.
자 지금 커서에게 랜딩페이지 구성을 위한 명령지시서 알려줘.
🤖 Gemini
**Cursor(Claude 3.5 Sonnet 또는 GPT-4o)**가 '하나비 민숙'의 비즈니스 맥락을 완벽히 이해하고, 개발자님의 기존 스택(Next.js, Prisma, Tailwind, PM2)에 맞춰 코드를 짤 수 있도록 프롬프트 명령 지시서를 작성해 드립니다.
이 내용을 그대로 복사해서 Cursor 채팅창에 붙여넣으세요.
📋 프로젝트: 대마도 '하나비(Hanabi)' 민숙&캠핑 랜딩페이지 구축 지시서
1. 비즈니스 컨텍스트
- 서비스명: 하나비 (Hanabi) / 도메인: hanabi.camp
- 위치: 일본 대마도 (미쓰시마마치)
- 주요 서비스: 민숙(숙박), 낚시 티켓팅, 굿즈 판매(shop.hanabi.camp)
- 타겟: 대마도 낚시 여행객 및 캠핑족 (한국인 대상)
2. 기술 스택 및 환경
- Framework: Next.js (App Router)
- Styling: Tailwind CSS
- Database: MariaDB (Prisma ORM)
- Auth: NextAuth.js (Google, Naver, Kakao integration)
- Deployment: PM2 관리형 리눅스 서버
3. 페이지 구성 및 요청 사항
[메인 랜딩 페이지 필수 섹션]
- Hero Section: 대마도 바다와 하나비 민숙의 감성을 담은 대형 이미지/영상 배경 + "대마도 낚시와 캠핑의 시작" 카피.
- Reservation Tool: 실시간 숙박 및 티켓팅 예약 위젯 (체크인/아웃, 인원 선택).
- Social Wall (SNS): 유튜브 쇼츠 및 인스타그램 피드를 RSS/API로 가져와서 Grid 레이아웃으로 출력.
- Quick Connect: 네이버 밴드, 카카오톡 오픈채팅방 바로가기 플로팅 버튼.
- Shop Link: shop.hanabi.camp로 연결되는 굿즈 홍보 배너.
[기능적 상세 요구사항]
- Prisma Schema 설계: User, Booking (숙박), Ticket (배편/낚시), Product (굿즈) 모델을 포함한 스키마 초안 작성.
- NextAuth 설정: 구글, 네이버, 카카오 소셜 로그인을 위한 [...nextauth].ts 구성 예시 생성.
- SNS Fetching: 유튜브 채널 ID를 통해 최신 영상을 가져와서 캐싱하는 Server Action 로직 작성.
- Responsive Design: 모바일 사용자가 90% 이상이므로 모바일 최적화에 집중.
4. Cursor를 위한 Action Prompt
"위 명세에 따라 Next.js App Router 기반의 랜딩 페이지 메인 화면(page.tsx)과 핵심 컴포넌트들을 생성해줘. 특히 Tailwind CSS를 사용해 현대적이고 깔끔한 UI로 만들어주고, Prisma 스키마는 숙박 예약과 티켓팅이 연동될 수 있도록 관계를 설정해줘. 로그인은 NextAuth를 사용할 거니 라이브러리 구조에 맞게 코드를 짜줘."
💡 추가 팁 (Vibe Coding 가이드)
- UI 레퍼런스: Cursor에게 "야놀자나 에어비앤비 같은 깔끔한 예약 UI 톤앤매너를 유지해줘"라고 덧붙이면 결과물이 더 세련되게 나옵니다.
- 로그인 연동: 네이버/카카오 로그인은 next-auth 공식 문서 외에 한국 개발자들이 만든 설정값이 필요할 수 있으니, "Naver, Kakao Custom Provider 설정을 포함해줘"라고 하시면 더 정확합니다.
토큰도 많으시겠다, 코드 생성 후에 "이 페이지에 어울리는 애니메이션 효과를 Framer Motion으로 추가해줘" 같은 지시도 추가해서 아주 쫀득한 사이트를 만들어보세요! 대마도 형님이 깜짝 놀라실 겁니다.
엔브 파일에서 db만 알려주면 되겠지?
엔브 파일에서 db만 알려주면 되겠지?
DATABASE_URL="mysql://user:asdf1234@127.0.0.1:3306/domain_folder"
이것까지 추가해줘
🤖 Gemini
네, 맞습니다. DB 연결 정보를 제공하면 Cursor가 schema.prisma 파일을 생성할 때 데이터베이스 엔진 설정과 필드 타입을 환경에 맞춰 완벽하게 작성해 줍니다.
이미 vibe_order나 hanabi_minsuk 같은 데이터베이스를 사용하고 계시니, 이 정보를 포함해 Cursor가 한 번에 랜딩 페이지의 백엔드 구조까지 짤 수 있도록 정리한 최종 지시서입니다.
이 내용을 Cursor 채팅창에 그대로 복사해서 입력하세요.
📋 프로젝트: '하나비(Hanabi) 민숙' 랜딩 페이지 및 통합 관리 시스템 구축
1. 기술 스택 및 DB 설정
- Framework: Next.js (App Router)
- Styling: Tailwind CSS
- Database: MariaDB (MySQL Compatible)
- ORM: Prisma
- DB Connection: .env 파일에 `DATABASE_URL="mysql://user:asdf1234@127.0.0.1:3306/domain_folder"` 설정 적용
- Management: PM2
2. 주요 비즈니스 로직
- 대상: 대마도 '하나비' 민숙 (민숙 숙박 + 낚시/캠핑 티켓팅)
- 도메인 구조:
* hanabi.camp: 메인 홍보, 예약, SNS 피드 노출
* shop.hanabi.camp: 굿즈 판매 스토어
- 회원가입: NextAuth를 이용한 구글, 네이버, 카카오 소셜 로그인 연동
3. Cursor 지시 사항 (Action Items)
1) Prisma 스키마 설계:
- 제공된 DATABASE_URL을 바탕으로 schema.prisma를 작성해줘.
- User (소셜 로그인 정보), Booking (숙박 예약 - 체크인/아웃), Ticket (티켓팅 - 배편/일정), Product (굿즈 정보) 모델을 포함하고 서로 관계(Relationship)를 설정해줘.
2) 메인 랜딩 페이지 (/):
- Hero Section: "대마도의 밤과 바다, 하나비 민숙" 카피와 함께 시원한 레이아웃 구성.
- Booking Widget: 숙박과 티켓팅 날짜를 선택할 수 있는 직관적인 UI 컴포넌트 생성.
- SNS Wall: 유튜브 쇼츠와 SNS 피드를 가져오는 섹션을 디자인(Grid)해줘. (데이터는 Mock 데이터로 시작하되 fetch 로직 구조 포함)
- Floating Action Button: 카카오톡 오픈채팅과 네이버 밴드로 바로 연결되는 버튼 추가.
3) API 및 인증:
- next-auth를 사용해 한국 소셜 로그인(Naver, Kakao) 설정을 포함한 route.ts 구조를 잡아줘.
- 예약 정보를 DB에 저장하는 Server Action 로직을 작성해줘.
4. 디자인 가이드
- 낚시와 캠핑의 역동성과 민숙의 편안함이 공존하는 현대적이고 깔끔한 화이트/블루 톤으로 구성해줘.
- 모바일 예약 사용자가 많으므로 모바일 퍼스트(Mobile-First) 디자인을 적용해줘.
Cursor에게 위 내용을 던진 후, 코드가 나오면 **"이제 이 구성에 맞춰서 shop.hanabi.camp 서브도메인용 페이지도 간단하게 만들어줘"**라고 이어서 지시하시면 토큰을 알차게 활용하실 수 있습니다! 멋진 사이트 만드시길 응원합니다.