인프라 셋업 — winemine.site 도메인 + Vercel 연결 + Resend 이메일 시스템 구축
작성일: 2026-05-21 작성자: wine-research 세션 (Founder가 직접 UI 조작, Claude Code가 가이드·코드 작성) 작업 대상: winemine LP 레포 (
/Users/yejinkim/dev/winemine) · 가비아 DNS · Vercel · Resend 선행 문서:_workspace/65_meta_ads_setup_playbook.md— Meta 픽셀·광고 도메인을winemine.site로 교체해야 한다는 후속 과제가 여기서 파생됨 소요 시간: DNS 작업 30분 + 코드 작업 15분 + 전파 대기 10분 = 총 약 1시간
0. TL;DR — 이 문서에서 완성된 것
섹션 제목: “0. TL;DR — 이 문서에서 완성된 것”| 항목 | 상태 | 비고 |
|---|---|---|
winemine.site 도메인 구매 | ✅ 완료 | 가비아에서 구매 |
| Vercel에 커스텀 도메인 연결 | ✅ 완료 | winemine.site → www.winemine.site 리디렉션 포함 |
| Resend 도메인 인증 (DKIM·SPF·DMARC) | ✅ 완료 | 도쿄 리전 선택 |
| Resend 연락처 API 코드 통합 | ✅ 완료 | waitlist 가입 시 자동 Resend 연락처 추가 |
| 기존 waitlist → Resend 마이그레이션 방법 | ✅ 정의 | Supabase SQL → CSV → Resend Import |
| 이메일 수신 (hello@ → Gmail 포워딩) | 🔜 다음 단계 | ImprovMX 사용 예정 |
| Meta 픽셀 도메인 winemine.site로 교체 | ⚠️ 미완 | Ads Manager allow list에 winemine.site 추가 필요 |
1. 배경 — 왜 이걸 했나
섹션 제목: “1. 배경 — 왜 이걸 했나”Phase 1(랜딩 페이지 + Waitlist)의 주요 배포 URL이 winemine.vercel.app이었다. 광고를 집행하면서 두 가지 문제가 생겼다.
- 브랜드 신뢰도: Meta 광고를 보고 클릭했을 때 주소창에
.vercel.app이 뜨면 “이게 정식 서비스야?” 의심을 유발. - 뉴스레터 인프라 부재: waitlist에 이메일로 가입한 사람들에게 출시 알림·소식을 보낼 수단이 없었음. 전용 발신 도메인이 없으면 Resend 연동 자체가 불가.
winemine.site 도메인을 가비아에서 구매하고 Vercel + Resend 양쪽에 연결하기로 결정.
2. 아키텍처 개요
섹션 제목: “2. 아키텍처 개요”사용자 브라우저 | | winemine.site 입력 v가비아 DNS (A 레코드: @ → 216.198.79.1) | vVercel Edge Network (실제 서버) | Host 헤더로 프로젝트 식별 vwinemine LP (Next.js App Router) | | waitlist 가입 시 vSupabase (DB 저장) → Slack 알림 → Resend (연락처 추가)
뉴스레터 발송 시Resend 대시보드 → Broadcasts → 전체 연락처에 일괄 발송발신 주소: hello@winemine.site (또는 noreply@winemine.site)핵심 개념 — 리디렉션이 아님:
winemine.site를 Vercel에 연결한다는 건 URL 리디렉션이 아니다. DNS A 레코드가 Vercel 서버 IP를 가리키고, HTTP 요청이 도달하면 Vercel이 Host: winemine.site 헤더로 어느 프로젝트를 서빙할지 판단한다. 실제 서버는 Vercel 것이고, 도메인(간판)만 winemine 것이다. vercel.app 주소는 병렬로 살아있지만 사용자에게 노출되지 않는다.
3. Vercel 커스텀 도메인 연결
섹션 제목: “3. Vercel 커스텀 도메인 연결”3.1 Vercel 설정
섹션 제목: “3.1 Vercel 설정”- vercel.com → 프로젝트 → Settings → Domains
winemine.site입력 → Add- “Redirect winemine.site to www.winemine.site” 체크 (Vercel 권장)
- Environment: Production
- Save
- Vercel이 두 도메인에 대한 DNS 레코드를 표시함
결과:
- 실제 사이트:
www.winemine.site(Production) winemine.site→www.winemine.site(301 리디렉션)
3.2 가비아 DNS 레코드 추가
섹션 제목: “3.2 가비아 DNS 레코드 추가”[My가비아 → 도메인 → DNS 관리]
| 타입 | 호스트 | 값/위치 | TTL |
|---|---|---|---|
| A | @ | 216.198.79.1 | 600 |
| CNAME | www | 74db997d4e96ed49.vercel-dns-017.com. | 600 |
주의: Vercel이 표시하는 정확한 CNAME 값을 복붙할 것. 위 값은 이 세션 기준이며, 다른 프로젝트/계정에서는 달라진다. CNAME 끝의
.(trailing dot)은 가비아가 자동 추가하거나 직접 입력해야 할 수 있음.
3.3 인증 확인
섹션 제목: “3.3 인증 확인”가비아 저장 → Vercel Domains 페이지에서 Refresh → Invalid Configuration → Valid Configuration 변경.
DNS 전파 시간: 보통 5~30분.
4. Resend 이메일 인프라 구축
섹션 제목: “4. Resend 이메일 인프라 구축”뉴스레터 발송 서비스. winemine.site 도메인으로 메일을 발송하려면 도메인 인증(DKIM·SPF·DMARC)이 필요하다.
4.1 Resend 가입 + 도메인 추가
섹션 제목: “4.1 Resend 가입 + 도메인 추가”- resend.com 가입 (GitHub 계정 권장)
- 왼쪽 메뉴 Domains → Add Domain
- Domain:
winemine.site - Region: Tokyo (ap-northeast-1) — 타겟 사용자가 한국이므로 가장 가까운 리전 선택
왜 도쿄인가: 이 Region은 Resend API 요청을 처리하는 서버 위치를 결정한다. 실제 메일 전송(SMTP)은 AWS 글로벌 인프라를 타므로 도착 속도 차이는 없지만, Server Action → Resend API 레이턴시 + 데이터 위치 기준으로 한국 사용자에게 도쿄가 적합.
-
Advanced Options (기본값 그대로):
- Custom Return-Path:
send→send.winemine.site(바운스 처리) - Tracking Subdomain:
links→links.winemine.site(클릭 추적) - Enable click tracking: ✅
- Enable open tracking: ❌ (Apple Mail Privacy Protection 때문에 부정확)
- Enable Receiving: ❌ OFF — Webhook으로 수신 처리하는 기능, 이 용도에 불필요
- Custom Return-Path:
-
Add domain 클릭 → DNS Records 화면 표시
4.2 가비아 DNS 레코드 추가
섹션 제목: “4.2 가비아 DNS 레코드 추가”Resend가 표시하는 정확한 값을 복붙할 것 (아래는 구조 예시).
| 타입 | 호스트 | 값 | TTL | 우선순위 |
|---|---|---|---|---|
| TXT | resend._domainkey | p=MIGfMA0G... (DKIM 공개키) | 600 | — |
| MX | send | feedback-smtp.ap-northeast-1.amazonses.com. | 600 | 10 |
| TXT | send | v=spf1 include:amazonses.com ~all | 600 | — |
| TXT | _dmarc | v=DMARC1; p=none; | 600 | — |
함정 — MX 레코드 trailing dot:
가비아는 MX 타입 값이 .으로 끝나야 한다는 유효성 검사를 한다. Resend가 제공하는 값(feedback-smtp.ap-northeast-1.amazonses.com)은 dot 없이 끝난다. 직접 마지막에 .을 추가해서 입력해야 한다(feedback-smtp.ap-northeast-1.amazonses.com.). 이는 완전 정규화 도메인(FQDN) 표준 표기이므로 완전히 정상.
4.3 인증 확인
섹션 제목: “4.3 인증 확인”레코드 추가 후 Resend → Domains → “I’ve added the records” → 자동 검증.
Domain verified: Your domain is ready to send emails. 메시지 + Verified 상태 확인. 소요 시간: 이번 세션에서는 약 8분.
4.4 API Key 발급
섹션 제목: “4.4 API Key 발급”Resend → API Keys → Create API Key
- Name:
winemine-production - Permission: Full Access
주의: 발급 화면에서 딱 한 번만 보여준다. 즉시 복사.
5. 코드 통합 — waitlist 가입 시 Resend 자동 연락처 추가
섹션 제목: “5. 코드 통합 — waitlist 가입 시 Resend 자동 연락처 추가”5.1 Resend 연락처 구조 변경 사항 (2026-05 기준)
섹션 제목: “5.1 Resend 연락처 구조 변경 사항 (2026-05 기준)”Resend가 Audiences(복수) 개념을 deprecated하고 단일 계정 연락처 목록 + Segments 구조로 변경됨.
- 기존: Audience ID 별도 필요
- 현재:
POST /contacts하나로 계정 연락처에 바로 추가 - Segments로 그룹화 가능 (선택)
- winemine은 연락처 종류가 waitlist 하나뿐이므로 Segments 없이 진행
5.2 설치
섹션 제목: “5.2 설치”npm install resend5.3 src/lib/resend.ts 신규 생성
섹션 제목: “5.3 src/lib/resend.ts 신규 생성”import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);
export async function addContact(email: string): Promise<void> { try { await resend.contacts.create({ email }); } catch { // Resend 실패가 waitlist 가입 흐름을 막지 않도록 silent fail }}5.4 src/app/actions.ts 수정
섹션 제목: “5.4 src/app/actions.ts 수정”submitWaitlist() Server Action 안, Slack 알림 발송 후:
// 신규 이메일 가입자만 Resend 연락처에 추가 (중복·전화번호 제외)if (!error && parsed.data.contactType === 'email') { await addContact(parsed.data.contact.trim());}조건 설계 이유:
!error: Supabase insert 성공한 신규 가입자만 (중복23505에러 제외)contactType === 'email': 전화번호는 Resend 연락처 의미 없음silent fail: Resend 장애가 waitlist 가입 UX를 깨지 않아야 함
5.5 환경변수
섹션 제목: “5.5 환경변수”로컬 .env.local:
RESEND_API_KEY=re_xxxxxxxxxxVercel 환경변수:
Vercel → 프로젝트 → Settings → Environment Variables → RESEND_API_KEY 추가
Production · Preview · Development 모두 체크
6. 기존 waitlist 데이터 Resend 마이그레이션
섹션 제목: “6. 기존 waitlist 데이터 Resend 마이그레이션”코드 통합 이전에 가입한 사람들은 Resend에 없다. 일괄 마이그레이션 방법:
6.1 Supabase에서 이메일 목록 추출
섹션 제목: “6.1 Supabase에서 이메일 목록 추출”Supabase → SQL Editor:
SELECT contact AS emailFROM waitlistWHERE contact_type = 'email'ORDER BY created_at;결과 오른쪽 위 Download CSV 클릭.
6.2 Resend에 임포트
섹션 제목: “6.2 Resend에 임포트”Resend → Audience → Add contacts → Import CSV → 다운로드한 파일 업로드.
7. 뉴스레터 발송 방법 (운영)
섹션 제목: “7. 뉴스레터 발송 방법 (운영)”코드 작업 없이 Resend 대시보드에서 진행.
- resend.com 로그인
- Broadcasts → Create Broadcast
- 발신자:
winemine <hello@winemine.site>(또는noreply@winemine.site) - 제목 + 본문 작성 (HTML 에디터 또는 React Email 템플릿)
- 수신자: All contacts (또는 특정 Segment)
- 미리보기 → 발송
8. 미완료 + 후속 과제
섹션 제목: “8. 미완료 + 후속 과제”8.1 이메일 수신 (hello@winemine.site → Gmail 포워딩)
섹션 제목: “8.1 이메일 수신 (hello@winemine.site → Gmail 포워딩)”뉴스레터 수신자가 답장하면 현재 어디에도 도달하지 않는다. 포워딩 설정 필요.
방법: ImprovMX (무료)
- improvmx.com 가입
winemine.site추가hello→qja086351@gmail.com포워딩 설정- 가비아에 ImprovMX MX 레코드 추가
주의: ImprovMX MX 레코드와 Resend MX 레코드(
send.winemine.site)는 서브도메인이 다르므로 충돌하지 않는다. Resend는send서브도메인, ImprovMX는@(루트) 레코드.
8.2 Meta 픽셀 도메인 업데이트 (중요)
섹션 제목: “8.2 Meta 픽셀 도메인 업데이트 (중요)”현재 Meta 픽셀 allow list에 winemine.vercel.app만 등록돼 있다. 광고 링크를 winemine.site로 변경했으므로 픽셀 도메인도 업데이트해야 한다.
경로: Meta Business Manager → Events Manager → winemine 픽셀 → Settings → Traffic Permissions → winemine.site 추가
미완료 시: winemine.site에서 발화된 Lead 이벤트가 Meta 광고 최적화에 반영되지 않는다.
8.3 추천인 시스템 + 쿠폰 (기획 중)
섹션 제목: “8.3 추천인 시스템 + 쿠폰 (기획 중)”논의된 구조:
1. Supabase waitlist에 referral_code, referred_by, referral_count 컬럼 추가2. 기존 가입자 전원에게 고유 코드(예: WM-A3K9) 생성3. 쿠폰 + 추천링크(winemine.site?ref=WM-A3K9) 이메일 발송 (Resend Broadcasts)4. 신규 가입 시 ?ref= 파라미터 감지 → referred_by 저장, referral_count +15. referral_count >= 1 → 자동으로 추가 쿠폰 이메일 발송6. Phase 2 앱에서 쿠폰코드로 6개월 무료 적용랜딩페이지 변경: 코드 입력 폼 불필요, URL 파라미터 자동 처리 + 성공 화면에 “추천링크 복사” 버튼 추가.
9. 최종 DNS 레코드 전체 목록 (가비아 기준)
섹션 제목: “9. 최종 DNS 레코드 전체 목록 (가비아 기준)”| 타입 | 호스트 | 값/위치 | 용도 |
|---|---|---|---|
| A | @ | 216.198.79.1 | Vercel (winemine.site → 서버) |
| CNAME | www | 74db997d4e96ed49.vercel-dns-017.com. | Vercel (www 서브도메인) |
| TXT | resend._domainkey | p=MIGfMA0G... (DKIM 키) | Resend 도메인 인증 |
| MX | send | feedback-smtp.ap-northeast-1.amazonses.com. | Resend 바운스 처리 |
| TXT | send | v=spf1 include:amazonses.com ~all | Resend SPF |
| TXT | _dmarc | v=DMARC1; p=none; | Resend DMARC |
| (예정) MX | @ | ImprovMX 값 | 이메일 수신 포워딩 |
| (예정) TXT | @ | Meta 도메인 인증 값 | Meta Pixel allow list |