콘텐츠로 이동

인프라 셋업 — 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.sitewww.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 추가 필요

Phase 1(랜딩 페이지 + Waitlist)의 주요 배포 URL이 winemine.vercel.app이었다. 광고를 집행하면서 두 가지 문제가 생겼다.

  1. 브랜드 신뢰도: Meta 광고를 보고 클릭했을 때 주소창에 .vercel.app이 뜨면 “이게 정식 서비스야?” 의심을 유발.
  2. 뉴스레터 인프라 부재: waitlist에 이메일로 가입한 사람들에게 출시 알림·소식을 보낼 수단이 없었음. 전용 발신 도메인이 없으면 Resend 연동 자체가 불가.

winemine.site 도메인을 가비아에서 구매하고 Vercel + Resend 양쪽에 연결하기로 결정.


사용자 브라우저
|
| winemine.site 입력
v
가비아 DNS (A 레코드: @ → 216.198.79.1)
|
v
Vercel Edge Network (실제 서버)
| Host 헤더로 프로젝트 식별
v
winemine LP (Next.js App Router)
|
| waitlist 가입 시
v
Supabase (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 주소는 병렬로 살아있지만 사용자에게 노출되지 않는다.


  1. vercel.com → 프로젝트 → Settings → Domains
  2. winemine.site 입력 → Add
    • “Redirect winemine.site to www.winemine.site” 체크 (Vercel 권장)
    • Environment: Production
    • Save
  3. Vercel이 두 도메인에 대한 DNS 레코드를 표시함

결과:

  • 실제 사이트: www.winemine.site (Production)
  • winemine.sitewww.winemine.site (301 리디렉션)

[My가비아 → 도메인 → DNS 관리]

타입호스트값/위치TTL
A@216.198.79.1600
CNAMEwww74db997d4e96ed49.vercel-dns-017.com.600

주의: Vercel이 표시하는 정확한 CNAME 값을 복붙할 것. 위 값은 이 세션 기준이며, 다른 프로젝트/계정에서는 달라진다. CNAME 끝의 .(trailing dot)은 가비아가 자동 추가하거나 직접 입력해야 할 수 있음.

가비아 저장 → Vercel Domains 페이지에서 RefreshInvalid ConfigurationValid Configuration 변경. DNS 전파 시간: 보통 5~30분.


뉴스레터 발송 서비스. winemine.site 도메인으로 메일을 발송하려면 도메인 인증(DKIM·SPF·DMARC)이 필요하다.

  1. resend.com 가입 (GitHub 계정 권장)
  2. 왼쪽 메뉴 DomainsAdd Domain
  3. Domain: winemine.site
  4. Region: Tokyo (ap-northeast-1) — 타겟 사용자가 한국이므로 가장 가까운 리전 선택

왜 도쿄인가: 이 Region은 Resend API 요청을 처리하는 서버 위치를 결정한다. 실제 메일 전송(SMTP)은 AWS 글로벌 인프라를 타므로 도착 속도 차이는 없지만, Server Action → Resend API 레이턴시 + 데이터 위치 기준으로 한국 사용자에게 도쿄가 적합.

  1. Advanced Options (기본값 그대로):

    • Custom Return-Path: sendsend.winemine.site (바운스 처리)
    • Tracking Subdomain: linkslinks.winemine.site (클릭 추적)
    • Enable click tracking: ✅
    • Enable open tracking: ❌ (Apple Mail Privacy Protection 때문에 부정확)
    • Enable Receiving: ❌ OFF — Webhook으로 수신 처리하는 기능, 이 용도에 불필요
  2. Add domain 클릭 → DNS Records 화면 표시

Resend가 표시하는 정확한 값을 복붙할 것 (아래는 구조 예시).

타입호스트TTL우선순위
TXTresend._domainkeyp=MIGfMA0G... (DKIM 공개키)600
MXsendfeedback-smtp.ap-northeast-1.amazonses.com.60010
TXTsendv=spf1 include:amazonses.com ~all600
TXT_dmarcv=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) 표준 표기이므로 완전히 정상.

레코드 추가 후 Resend → Domains → “I’ve added the records” → 자동 검증. Domain verified: Your domain is ready to send emails. 메시지 + Verified 상태 확인. 소요 시간: 이번 세션에서는 약 8분.

Resend → API KeysCreate 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 없이 진행
Terminal window
npm install resend
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
}
}

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를 깨지 않아야 함

로컬 .env.local:

RESEND_API_KEY=re_xxxxxxxxxx

Vercel 환경변수: 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 email
FROM waitlist
WHERE contact_type = 'email'
ORDER BY created_at;

결과 오른쪽 위 Download CSV 클릭.

Resend → AudienceAdd contactsImport CSV → 다운로드한 파일 업로드.


코드 작업 없이 Resend 대시보드에서 진행.

  1. resend.com 로그인
  2. BroadcastsCreate Broadcast
  3. 발신자: winemine <hello@winemine.site> (또는 noreply@winemine.site)
  4. 제목 + 본문 작성 (HTML 에디터 또는 React Email 템플릿)
  5. 수신자: All contacts (또는 특정 Segment)
  6. 미리보기 → 발송

뉴스레터 수신자가 답장하면 현재 어디에도 도달하지 않는다. 포워딩 설정 필요.

방법: ImprovMX (무료)

  1. improvmx.com 가입
  2. winemine.site 추가
  3. helloqja086351@gmail.com 포워딩 설정
  4. 가비아에 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 +1
5. referral_count >= 1 → 자동으로 추가 쿠폰 이메일 발송
6. Phase 2 앱에서 쿠폰코드로 6개월 무료 적용

랜딩페이지 변경: 코드 입력 폼 불필요, URL 파라미터 자동 처리 + 성공 화면에 “추천링크 복사” 버튼 추가.


9. 최종 DNS 레코드 전체 목록 (가비아 기준)

섹션 제목: “9. 최종 DNS 레코드 전체 목록 (가비아 기준)”
타입호스트값/위치용도
A@216.198.79.1Vercel (winemine.site → 서버)
CNAMEwww74db997d4e96ed49.vercel-dns-017.com.Vercel (www 서브도메인)
TXTresend._domainkeyp=MIGfMA0G... (DKIM 키)Resend 도메인 인증
MXsendfeedback-smtp.ap-northeast-1.amazonses.com.Resend 바운스 처리
TXTsendv=spf1 include:amazonses.com ~allResend SPF
TXT_dmarcv=DMARC1; p=none;Resend DMARC
(예정) MX@ImprovMX 값이메일 수신 포워딩
(예정) TXT@Meta 도메인 인증 값Meta Pixel allow list