Cloudflare Pages 시작하기 2편 - 도메인 설정

Cloudflare Pages 시작하기 2편 - 도메인 설정#

요약#

이 글의 핵심 3가지

  1. 커스텀 도메인 연결: example.com처럼 내 도메인을 Pages에 연결하고 자동 SSL 설정
  2. www 리다이렉트: www.example.comexample.com을 통일하는 방법
  3. 환경변수 관리: Production과 Preview 환경을 분리해서 안전하게 관리

읽는 시간: 25분 | 난이도: 중급

출처#

이 글은 Cloudflare 공식 문서를 바탕으로 작성했습니다.

커스텀 도메인이 필요한 이유#

1편에서 pages.dev 도메인으로 첫 배포를 완료했습니다.
https://my-site.pages.dev처럼 말입니다.
이것만으로도 충분히 사용할 수 있지만, 실제 서비스를 운영한다면 내 도메인이 필요합니다.

커스텀 도메인의 장점:

  • 전문적인 이미지
  • 브랜드 인지도 향상 (my-site.pages.dev → my-site.com)
  • 플랫폼 종속성 감소 (Cloudflare에서 다른 플랫폼으로 이전 시 URL 변경 최소화)
  • 이메일, 결제, 외부 서비스 연동에 유리

도메인 준비하기#

커스텀 도메인을 연결하기 전에 도메인이 필요합니다. 아직 없다면 여러 공급자 중 하나를 선택할 수 있습니다.

참고로 Moodturn, MoodturnPost는 Cloudflare Registrar를 사용하고 있습니다.
도메인을 구매했다면 이제 Cloudflare Pages에 연결할 차례예요.

Apex vs Subdomain 이해하기#

도메인을 연결하기 전에 Apex와 Subdomain의 차이를 알아야 합니다.

Apex 도메인#

example.com ← Apex (루트 도메인)

Apex는 도메인의 루트입니다. www가 없는 깔끔한 형태입니다.

장점:

  • URL이 짧고 기억하기 쉬움
  • 브랜드 정체성을 대표하는 주소로 사용하기 적합

단점:

  • 일반적인 DNS에서는 Apex에 CNAME 사용 불가
  • Cloudflare DNS 같은 Flattening 지원 환경이 필요할 수 있음

Subdomain#

www.example.com ← Subdomain (www)
blog.example.com ← Subdomain (blog)
api.example.com ← Subdomain (api)

Subdomain은 도메인 앞에 접두사가 붙은 형태입니다.

장점:

  • CNAME 레코드 사용 가능
  • 외부 DNS 환경에서도 설정이 단순함
  • 서비스별 분리에 유리 (blog, api 등)

단점:

  • URL이 길어짐
  • 쿠키, 인증, 분석 도구 설정이 분리될 수 있음 (서브도메인마다 설정해야 함)

실무에서는 보통 Apex를 메인 도메인으로 사용하고,
www는 Apex로 리다이렉트하는 방식을 많이 사용합니다.

커스텀 도메인 추가하기#

Cloudflare Pages Dashboard에서 설정#

  1. Build > Compute & AI > Workers & Pages > 커스텀도메인 적용할 프로젝트 선택
  2. Custom domains 탭 클릭
  3. Set up a custom domain 버튼 클릭

커스텀 도메인 설정 화면

도메인 입력#

도메인을 입력하는 화면이 나옵니다. 여기서 example.com처럼 Apex 도메인을 입력하세요.

domain:
example.com

Continue 클릭.

DNS 레코드 확인#

Cloudflare가 자동으로 DNS 설정을 제안합니다.

# Cloudflare가 제안하는 설정
Type: CNAME (Cloudflare DNS에서 Flattened)
Name: example.com (또는 @)
Target: your-project.pages.dev
Proxy status: Proxied

중요: Apex 도메인에서는 RFC상 CNAME을 사용할 수 없지만, Cloudflare DNS는 CNAME Flattening을 통해 Apex에서도 CNAME처럼 설정할 수 있도록 지원합니다.

커스텀 도메인 DNS 레코드 확인

DNS 설정 방법#

두 가지 방법이 있습니다:

방법 1: Cloudflare DNS 사용 (권장)#

도메인이 이미 Cloudflare에 등록되어 있거나, Cloudflare DNS를 사용 중이라면 자동으로 설정됩니다.

Activate domain 버튼을 클릭하면 DNS 레코드가 자동으로 추가됩니다.

Terminal window
DNS record added
SSL certificate requested
Custom domain active
Your site is now available at:
https://example.com

SSL 인증서는 보통 5분 이내에 발급됩니다.

방법 2: 외부 DNS 사용#

외부 DNS 프로바이더를 사용한다면 수동으로 레코드를 추가해야 합니다.

Namecheap 예시:

  1. Namecheap Dashboard → Domain List
  2. 도메인 선택 → Manage
  3. Advanced DNS 탭
# Subdomain (www)
Type: CNAME Record
Host: www
Value: your-project.pages.dev
TTL: Automatic
# Apex는 외부 DNS에서 제한적
# Cloudflare DNS 사용을 권장

외부 DNS의 한계:

  • 외부 DNS 대부분은 Apex CNAME을 직접 지원하지 않으며, ALIAS/ANAME이 없는 경우 Apex 연결이 힘들어집니다
  • Cloudflare Pages는 고정 IP를 제공하지 않아 A 레코드로의 직접 연결이 공식적으로 지원되지 않습니다

결론: Apex 도메인을 사용하려면 Cloudflare DNS 사용을 권장합니다

SSL 인증서 발급#

DNS 설정이 완료되면 Cloudflare가 자동으로 SSL 인증서를 발급합니다.

Provisioning SSL certificate...
⏳ Validating domain ownership
⏳ Requesting Let's Encrypt certificate
✓ SSL certificate issued
Your site is now accessible via HTTPS

보통 1-5분 이내에 완료되지만, DNS 전파 시간에 따라 최대 24시간까지 걸릴 수 있습니다.

www ↔ Apex 리다이렉트 설정#

커스텀 도메인을 추가했으면 이제 www를 처리해야 합니다.
중복 URL을 방지하고 검색 엔진과 사용자에게 명확한 기준을 제공하기 위해 한 가지 도메인으로 통일하는 것이 좋습니다.

선택지#

두 가지 방식 중 하나를 선택하면 됩니다:

옵션 A: www → Apex
www.example.com → example.com
옵션 B: Apex → www
example.com → www.example.com

옵션 A (Apex를 메인으로)는 URL이 짧고 깔끔해서 신규 서비스에서 자주 선택되는 방식입니다.

Redirect Rules로 리다이렉트 설정#

Cloudflare의 Rules 엔진에서 Redirect 타입 규칙을 사용해서 www ↔ Apex 리다이렉트를 설정합니다.

설정 순서:

  1. Cloudflare Dashboard → Websites 선택
  2. 도메인 선택 (example.com)
  3. 왼쪽 메뉴에서 RulesOverview 이동
  4. Create rule 클릭 후, Rule type에서 Redirect Rules 선택
  5. Redirect from WWW to root에서 Preview template 클릭

Redirect Rules 설정 화면
Redirect Rules 템플릿 설정 화면

www → Apex 리다이렉트 규칙#

Rule name: Redirect from WWW to root (your-site)
If incoming requests match:
Type: Wildcard pattern
Request URL: https://www.your-site.com/*
Then:
Redirect to:
Target URL: https://your-site.com/${1}
Status code: 301
Preserve query string:
Place at:
Order: Last

설명:

  • https://www.your-site.com/*
    • www.your-site.com으로 들어오는 모든 요청을 매칭합니다.
  • ${1}
    • / 이후의 경로 전체를 그대로 캡처합니다.
  • 결과 예시:
    • https://www.example.com/blog/post
    • https://example.com/blog/post
  • 301 (Permanent Redirect)
    • 검색 엔진에 영구적인 주소 변경임을 명확히 알립니다.
  • Preserve query string
    • 쿼리 파라미터를 유지합니다.
    • 예:
      • https://www.example.com/search?q=test
      • https://example.com/search?q=test

Apex → www 리다이렉트 규칙 (대안)#

만약 www를 메인으로 사용하고 싶다면:

Rule name: Redirect from root to WWW (your-site)
If incoming requests match:
Type: Wildcard pattern
Request URL: https://your-site.com/*
Then:
Redirect to:
Target URL: https://www.your-site.com/${1}
Status code: 301
Preserve query string:
Place at:
Order: Last

리다이렉트 테스트#

설정이 완료되면 반드시 테스트해야 합니다:

Terminal window
# curl로 리다이렉트 확인
curl -I https://www.example.com
# 응답 예시
HTTP/2 301
location: https://example.com/

브라우저에서도 확인해보세요:

  1. www.example.com 접속
  2. 주소창이 example.com으로 변경되는지 확인
  3. /blog 같은 하위 경로도 테스트

Google Search Console에 등록#

리다이렉트를 설정했으면 Google Search Console에도 반영해야 합니다.

  1. Google Search Console 접속
  2. 속성 추가
  3. Domain Property로 등록하면 apex와 www를 함께 관리할 수 있습니다.

이렇게 하면 검색 엔진이 단일 기준 도메인을 명확히 인식할 수 있습니다.

환경변수 관리#

환경변수는 API 키, DB 연결 정보 같은 민감한 정보를 안전하게 관리하는 방법입니다.

Production vs Preview 환경 분리#

Cloudflare Pages는 Production과 Preview 환경을 분리해서 관리할 수 있습니다.

Production 환경:
- main 브랜치 배포
- 실제 사용자가 접속
- 프로덕션 API 서버 사용
- 실제 결제 시스템 연동
Preview 환경:
- PR 배포
- 테스트 용도
- 스테이징 API 서버 사용
- 테스트 결제 시스템 연동

환경변수 추가하기#

  1. Cloudflare Pages 프로젝트 → Settings
  2. Variables and Secrets 섹션
  3. +Add 클릭
  4. Type, Variable name, Value 입력 후, Save 클릭
  5. 변경 사항은 다음 배포부터 적용됩니다

환경변수 설정 화면

Production 환경변수 설정#

Production과 Preview는 각각 별도의 Variables and Secrets를 가질 수 있습니다.
먼저 상단의 환경 선택에서 Production 또는 Preview를 선택한 뒤, 같은 방식으로 변수를 각각 추가합니다.
이렇게 하면 Production과 Preview가 각각 다른 API 서버를 사용합니다.

Production vs Preview 환경변수

프레임워크별 환경변수 사용법#

Vite (React, Vue, Svelte):

// vite.config.js - 설정 불필요, 자동으로 주입됨
// 코드에서 사용
const apiUrl = import.meta.env.VITE_API_URL;
console.log(apiUrl);
// Production: https://api.example.com
// Preview: https://staging-api.example.com

Next.js:

Next.js에서는 `NEXT_PUBLIC_` 접두사가 붙은 환경변수는
별도 설정 없이 자동으로 주입됩니다.

Astro:

// astro.config.mjs - 설정 불필요
// 코드에서 사용
const apiUrl = import.meta.env.PUBLIC_API_URL;

SvelteKit:

// 코드에서 사용
import { PUBLIC_API_URL } from "$env/static/public";
const apiUrl = PUBLIC_API_URL;

환경변수 명명 규칙#

프레임워크마다 환경변수 접두사가 다릅니다:

Vite: VITE_
Next.js: NEXT_PUBLIC_
Astro: PUBLIC_
SvelteKit: PUBLIC_
Nuxt: NUXT_PUBLIC_

접두사가 없는 환경변수는 클라이언트 코드에서는 접근할 수 없으며, Pages Functions 또는 서버 측 코드에서만 사용해야 합니다.
보안상 민감한 정보(서버 전용 API 키 등)는 클라이언트로 노출되지 않도록 접두사 없이 설정하고, 반드시 Pages Functions에서만 사용해야 합니다.

환경변수 적용 확인#

환경변수를 추가한 후에는 반드시 재배포가 필요합니다.

Terminal window
# 코드 변경 없이 재배포 트리거
git commit --allow-empty -m "Trigger rebuild for env vars"
git push origin main

빌드 로그에서 환경변수가 주입되는지 확인할 수 있습니다:

Terminal window
[Build] Environment variables:
VITE_API_URL=https://api.example.com (masked)
NODE_VERSION=18

민감한 값은 마스킹되어 표시됩니다.

프레임워크별 빌드 최적화#

각 프레임워크마다 빌드를 최적화하는 방법이 있습니다. 빌드 시간을 줄이고 배포 속도를 높일 수 있습니다.

의존성 캐싱#

Cloudflare Pages는 의존성 설치 결과를 캐싱하며, lock 파일이 변경되지 않으면 설치 단계를 건너뜁니다.

Terminal window
# 첫 번째 빌드
[Build] Installing dependencies...
npm install (34.2초)
# 두 번째 빌드 (package.json 변경 없음)
[Build] Using cached node_modules
Skipped npm install (0.5초)

최적화 팁:

  • Lock 파일을 커밋하세요 (package-lock.json, pnpm-lock.yaml, yarn.lock)
  • 불필요한 devDependencies 제거
  • 정확한 버전 명시 (^1.0.0 대신 1.0.0)

Vite 빌드 최적화#

vite.config.js
export default {
build: {
// 청크 크기 경고 임계값 조정
chunkSizeWarningLimit: 1000,
// 롤업 옵션
rollupOptions: {
output: {
// 청크 분할 최적화
manualChunks: {
vendor: ["react", "react-dom"],
ui: ["@mui/material"],
},
},
},
// 소스맵 비활성화 (프로덕션)
sourcemap: false,
},
};

Next.js 빌드 최적화#

next.config.js
module.exports = {
// Static Export 설정
output: "export",
// 이미지 최적화 비활성화 (Static Export 필수)
images: {
unoptimized: true,
},
// 불필요한 파일 제외
pageExtensions: ["tsx", "ts"],
// 기본값 (명시적 설정)
swcMinify: true,
};

Astro 빌드 최적화#

astro.config.mjs
export default defineConfig({
// 빌드 최적화
build: {
inlineStylesheets: "auto",
},
// Vite 설정
vite: {
build: {
cssCodeSplit: true,
},
},
});

빌드 캐시 초기화#

가끔 빌드 캐시 때문에 문제가 생길 수 있습니다. 이럴 때는 캐시를 초기화하면 됩니다.

방법 1: Dashboard에서 초기화#

  1. Deployments 탭
  2. 최근 배포 선택
  3. Retry deploymentClear cache and retry

방법 2: 강제 재빌드#

이 방법은 의존성 설치 단계를 다시 실행하게 만들어 대부분의 캐시 문제를 해결할 수 있지만,
모든 캐시를 완전히 초기화하는 공식 방법은 아닙니다.

Terminal window
# package.json에 더미 필드 추가
{
"cache-buster": "v2" # 값을 변경해서 재빌드 트리거
}
git add package.json
git commit -m "Clear build cache"
git push origin main

다음 단계#

2편에서는 커스텀 도메인, 리다이렉트, 환경변수, 빌드 최적화를 다뤘습니다.

현재 상태:

  • 내 도메인으로 접속 가능 (example.com)
  • www 리다이렉트 설정 완료
  • Production/Preview 환경 분리
  • 빌드 최적화 적용

다음 편 예고:

Cloudflare Pages 시작하기 3편 - 운영과 최적화에서 다룰 내용:

  • 빌드 실패 디버깅 (의존성, 환경변수, 타임아웃)
  • 롤백하는 방법
  • 성능 최적화 (이미지, 번들 크기)
  • 보안 헤더 설정 (_headers 파일)
  • 모니터링 및 알림 설정

참고 자료#

공식 문서#

프레임워크별 가이드#

공유

이 글이 도움이 되었다면 다른 사람과 공유해주세요!

Cloudflare Pages 시작하기 2편 - 도메인 설정
https://moodturnpost.net/posts/cloudflare/cloudflare-starter-2/
작성자
Moodturn
게시일
2025-12-31
Moodturn

목차