프론트엔드 배포 오류 해결 허브: Vercel, Netlify, Firebase 체크리스트

··설명 약 13분·작성: 해비·블로그 소개

Vercel·Netlify·Firebase 배포 오류가 어느 단계에서 발생했는지 어떻게 좁히나요?

배포 오류는 설치·빌드·실행·라우팅·DNS·캐시 중 실패한 단계를 먼저 찾으면 해결 지점이 좁아집니다. URL, 시각, 배포 환경, 커밋과 최초 오류를 기록하세요.

적용 조건·범위: 하지만 API가 500을 반환한 뒤 CORS 헤더가 없어서 브라우저에서 CORS처럼 보이는 경우도 있을 수 있습니다.

본문 근거: vercel.com/docs/deployments · vercel.com/docs/logs · firebase.google.com/docs/hosting

가장 먼저 기록할 정보

장애가 발생하면 새 deployment를 만들거나 설정을 바꾸기 전에 현재 상태를 기록합니다.

발생 URL
발생 시각
환경: Preview / Production
deployment
commit SHA
HTTP status
브라우저 console
Network 요청
build log
runtime log
DNS 결과
response headers

모든 문제에 모든 정보가 필요한 것은 아닙니다.

하지만 현재 deployment와 commit, 실제 URL, status는 대부분의 배포 장애에서 중요한 시작점이 됩니다.

Install 오류

대표 증상은 다음과 같습니다.

npm ci 실패
lockfile error
dependency resolution error
package manager command not found

첫 확인 지점:

package.json
package-lock.json
Node/npm 버전
package manager
.npmrc
CI install command

진단 순서:

npm ci 로컬 재현
↓
package.json / lockfile diff
↓
Node 버전 비교
↓
package manager 혼용 확인
↓
CI 재실행

install 오류가 해결되기 전에는 route나 DNS를 볼 필요가 없습니다.

Build 오류

대표 증상:

TypeScript error
Next.js build failed
Missing environment variable
page generation error

첫 확인 지점:

build log의 최초 오류
npm run build 로컬 재현
Production env
Node runtime
Root Directory
build command

“Build failed with exit code 1”만 보는 것이 아니라 그 앞의 실제 오류를 찾습니다.

Runtime 오류

deployment는 Ready인데 기능이 실패합니다.

페이지 일부 500
Route Handler 실패
DB/API 연결 실패
로그인 요청 실패

첫 확인 지점:

runtime log
Network status
server env
외부 API/DB 응답
인증/권한

build가 성공했다는 사실은 runtime 정상까지 보장하지 않습니다.

404와 routing

다음 순서로 구분합니다.

1. Production 기본 URL에서도 같은가
2. route 파일이 실제로 존재하는가
3. rewrite/redirect 목적지가 존재하는가
4. 정적 asset만 실패하는가
5. custom domain에서만 실패하는가

예를 들어 다음이면 DNS보다 route를 먼저 봅니다.

/
→ 200

/tasks
→ 404

반대로 Vercel 기본 URL은 정상인데 custom domain 전체가 다른 프로젝트의 404를 반환한다면 domain 연결을 확인합니다.

DNS와 HTTPS

대표 증상:

도메인이 열리지 않음
DNS_PROBE 오류
인증서 대기
HTTPS 경고
www와 apex 결과가 다름

확인 순서:

DNS record
↓
공개 DNS 조회
↓
플랫폼 domain 상태
↓
TLS certificate
↓
HTTP response

DNS 변경 직후에는 cache와 TTL 때문에 resolver마다 다른 결과가 보일 수 있습니다.

CORS와 proxy

브라우저 console에 CORS 관련 메시지가 보이면 실제 요청 URL과 응답 헤더를 함께 확인합니다.

Origin
Access-Control-Allow-Origin
Request URL
Status Code
Redirect

하지만 API가 500을 반환한 뒤 CORS 헤더가 없어서 브라우저에서 CORS처럼 보이는 경우도 있을 수 있습니다.

따라서 Network와 서버 로그를 함께 봅니다.

브라우저 메시지
+
실제 HTTP 응답
+
서버 로그

캐시된 구버전

대표 증상:

새 코드가 배포됐는데 화면은 이전 상태
특정 사용자만 오래된 화면
asset이 이전 hash를 요청

확인 순서:

현재 Production deployment
↓
commit SHA
↓
원본 deployment URL
↓
custom domain
↓
response headers
↓
browser/CDN cache

원인을 확인하기 전에 모든 캐시를 지우면 문제를 재현할 증거를 잃을 수 있습니다.

500과 서버 오류

500은 서버에서 요청 처리 중 오류가 발생했다는 신호입니다.

확인 항목:

runtime log
환경변수
DB/API 연결
server-only code
request input
authentication
external dependency

Production Secret을 console에 출력해서 확인하지 않습니다.

존재 여부나 어떤 단계에서 실패했는지만 안전하게 로그로 남깁니다.

증상별 빠른 표

증상 첫 확인
npm ci 실패 package.json / lockfile
build 실패 최초 build error
Preview만 실패 Preview env
Production만 실패 Production env / deployment
특정 route 404 route / rewrite
custom domain 전체 실패 DNS / domain
API 500 runtime log
CORS request/response headers
이전 화면 deployment / cache
배포 직후 전체 장애 이전 정상 deployment / rollback

이 표는 원인을 확정하는 표가 아니라 첫 조사 위치를 정하는 표입니다.

수정 후 검증

문제 원인을 수정한 뒤에는 단순히 deployment가 Ready인지 확인하고 끝내지 않습니다.

1. 새 deployment 확인
2. 해당 commit 확인
3. 문제가 발생한 URL 재검증
4. 핵심 route smoke test
5. 핵심 API 확인
6. console/runtime log 확인
7. 다른 주요 기능 회귀 확인

rollback 판단

다음 조건에서는 수정 완료를 기다리는 것보다 이전 정상 deployment로 복구하는 방안을 검토할 수 있습니다.

Production 전체 사용자 영향
핵심 기능 사용 불가
원인 분석에 시간이 필요
이전 deployment가 정상임을 알고 있음
rollback이 데이터 정합성을 깨뜨리지 않음

DB schema나 데이터 구조가 새 버전에서 변경되었다면 프론트엔드 deployment만 되돌려도 안전한지 별도 확인해야 합니다.

최종 배포 체크리스트

배포 전

npm ci
npm run build
CI 확인
환경변수 확인
Secret commit 여부 확인

배포 직후

Production deployment
commit SHA
homepage
핵심 route
핵심 API
auth
browser console
runtime log

도메인

DNS
HTTPS
canonical domain
redirect
auth callback / allowed origin

운영

현재 deployment 확인 가능
build/runtime log 확인 가능
rollback runbook 존재
incident template 존재
핵심 smoke test 정의

이 주제만 따로 연습하기

이전 회차 문서 없이 다음 네 관찰을 분류하고 첫 확인 증거를 적습니다.

가상 관찰 우선 조사
npm ci 실패, build 미시작 manifest·lockfile·Node/npm·install 로그
기본 URL 홈 200, /tasks 404 라우트·rewrite와 응답 종류
기본 URL 정상, custom DNS 조회 실패 DNS·플랫폼 도메인 연결
Ready 배포에서 저장 API 500 동일 deployment의 runtime 로그·서버 변수/외부 연결

자가 확인: 이 표는 원인 확정표일까요? 첫 조사 위치를 정하는 표입니다. 각 행에 같은 배포 commit과 실제 요청 URL을 붙여야 다음 사람이 재현할 수 있습니다. 아직 모은 로그가 없다면 해결로 표시하지 않고 필요한 증거를 남깁니다.

학습 완료 체크리스트

  • 배포 장애를 계층별로 분류할 수 있습니다.
  • 증상별 첫 확인 위치를 정할 수 있습니다.
  • 수정 전 deployment와 commit을 기록할 수 있습니다.
  • build와 runtime 오류를 구분할 수 있습니다.
  • DNS와 route 404를 구분할 수 있습니다.
  • cache 문제를 증거 기반으로 확인할 수 있습니다.
  • 필요할 때 rollback을 검토할 수 있습니다.

선택 실습: 할 일 앱에 적용하기

TaskFlow는 작업을 관리하는 예제 앱입니다. 이 선택 실습에서는 앱을 배포하고 서버·설정·운영 결과를 확인합니다.

이번 주제: 프론트엔드 배포 오류 해결 허브: Vercel, Netlify, Firebase 체크리스트.

선택: 연재 프로젝트와 전체 자료

연재 프로젝트를 이어 만드는 분을 위한 자료입니다. 이 글의 개념과 예제만 찾으셨다면 필요한 파일과 실행 방법만 펼쳐보세요.

TaskFlow 프로젝트 최종 적용

이 글부터 시작하는 전체 프로젝트

시작 ZIP — deploy-step-10-observability-rollback-full-20260928을 새 폴더에 풀고, 이번 단계 완료 ZIP은 다른 폴더에 풀어 비교합니다. ZIP 안 프로젝트 폴더의 package.json 위치가 실행 루트입니다.

출발점은 Next.js 누적 TaskFlow와 같은 38단계 소스입니다. 프로젝트에는 홈·로그인·개인 작업 화면, 작업 추가·완료·삭제, Route Handler와 캐시 예제가 들어 있습니다. 설치 버전을 고정한 package-lock.json도 포함합니다.

이번 변경 이유: 누적 문서와 실제 결과를 마지막 점검표로 대조합니다.

  • docs/deployment-checklist.md
  1. 시작 ZIP을 풀고 npm ci로 의존성을 설치합니다. Node.js 24와 npm을 사용합니다.
  2. 위 변경 파일을 아래 전체 내용 또는 완료 ZIP의 같은 경로와 대조해 적용합니다. 다른 앱 파일은 유지합니다.
  3. npm run typecheck, npm run build를 실행합니다. 오류가 있으면 첫 오류의 파일·명령을 기록하고 해결한 뒤 진행합니다.
  4. npm run setup-auth로 일회용 로컬 학습 계정을 설정한 후 npm run dev를 실행합니다. 생성된 .env.local과 입력 값은 공유하지 않습니다.

예상 결과: 홈과 로그인 화면은 공개됩니다. 로그인 전 /tasks는 로그인 화면으로 이동하고 /api/tasks는 401을 반환합니다. 로그인 후 작업 목록에서 추가·완료·삭제를 확인합니다. /cache-lab의 별도 캐시 실습은 npm run cache-api가 필요합니다.

/legacy/tasks도 기존 인증을 유지합니다. 로그인하지 않은 상태의 로그인 이동은 404 오류가 아닙니다. next.config.ts의 rewrite와 proxy.ts의 보호 경로를 함께 확인하고, 로그인 후 두 주소에서 작업 화면을 대조합니다.

src/lib/env.ts와 src/lib/api.ts(9단계부터)는 환경 차이를 관찰하는 별도 진단 예제입니다. 기본 TaskFlow는 같은 origin의 인증된 /api/tasks를 사용하므로 이 예제로 기존 데이터 조회나 인증을 교체하지 않습니다. 공개 API origin 변수도 해당 진단 예제를 직접 사용할 때만 설정합니다.

저장·운영 범위: 작업은 단일 Node 프로세스 메모리에 저장되고 인증은 학습용 계정 예제입니다. 서버 재시작·서버리스 인스턴스 사이의 데이터 유지는 보장하지 않습니다. 로컬 실행 확인과 실제 운영 서비스 구축은 구분하며, 원격 배포·DNS·SSH·CI·롤백 결과는 직접 실행한 항목만 문서에 기록합니다.

전체 파일·코드 보기

이번 단계의 변경 파일 전체

docs/deployment-checklist.md

# TaskFlow 최종 배포 점검표

이 문서는 점검 절차입니다. 실제 Production 배포 완료나 정상 동작을 증명하는 기록이 아닙니다.

## 배포 전
- [ ] npm ci 통과
- [ ] npm run build 통과
- [ ] CI 실행 결과 확인
- [ ] 환경 변수 scope 확인
- [ ] 비밀값 commit 여부 점검

## 배포 직후
- [ ] Production deployment와 commit SHA 확인
- [ ] 홈페이지와 핵심 route 응답 확인
- [ ] 핵심 API와 인증 흐름 확인
- [ ] 브라우저 console 및 runtime log 확인

## 도메인
- [ ] DNS와 HTTPS 확인
- [ ] canonical domain과 redirect 확인
- [ ] auth callback 및 allowed origin 확인

## 운영
- [ ] deployment와 로그 확인 경로 문서화
- [ ] rollback runbook 검토
- [ ] incident template 준비
- [ ] 핵심 smoke test 정의

나머지 앱 소스와 잠금 파일은 전체 완료 ZIP에 있습니다. 기존 코드 조각은 설명용이며 위 전체 변경 파일과 ZIP이 이 누적 실습의 기준입니다. 다음 글에는 이번 완료 ZIP을 시작본으로 가져갑니다.

이 회차는 아래 전체 TaskFlow 시작 ZIP을 기준으로 진행합니다. 이전 글의 코드를 모으지 않아도 되며, 완료 ZIP에는 이번 변경과 기존 앱 기능이 함께 들어 있습니다.

.env.example

# 7편 NEXT_PUBLIC_API_URL을 이 회차부터 NEXT_PUBLIC_API_BASE_URL로 통일합니다.
# 끝에 /가 없는 API origin을 설정하세요. 공개 API 주소만 넣고 secret은 넣지 마세요.
NEXT_PUBLIC_API_BASE_URL=
API_SECRET=

.github/workflows/ci.yml

name: CI


on:
  push:
    branches:
      - main
  pull_request:


jobs:
  build:
    runs-on: ubuntu-latest


    steps:
      - name: Checkout
        uses: actions/checkout@v7


      - name: Setup Node.js
        uses: actions/setup-node@v7
        with:
          node-version: "24.x"
          cache: "npm"


      - name: Install dependencies
        run: npm ci


      - name: Build
        run: npm run build

.gitignore

node_modules/
.next/
.env.local
*.tsbuildinfo

.nvmrc

24

app/layout.tsx

import type { ReactNode } from "react";
export default function RootLayout({ children }: { children: ReactNode }) {
  return <html lang="ko"><body>{children}</body></html>;
}

app/page.tsx

import Link from "next/link";
export default function Home() {
  return <main><h1>TaskFlow 배포 진단 실습</h1><Link href="/tasks">작업 목록</Link></main>;
}

app/tasks/page.tsx

export default function TasksPage() {
  return (
    <main>
      <h1>Tasks</h1>
      <p>TaskFlow 작업 목록입니다.</p>
    </main>
  );
}

docs/deployment-checklist.md

# TaskFlow 최종 배포 점검표

이 문서는 점검 절차입니다. 실제 Production 배포 완료나 정상 동작을 증명하는 기록이 아닙니다.

## 배포 전
- [ ] npm ci 통과
- [ ] npm run build 통과
- [ ] CI 실행 결과 확인
- [ ] 환경 변수 scope 확인
- [ ] 비밀값 commit 여부 점검

## 배포 직후
- [ ] Production deployment와 commit SHA 확인
- [ ] 홈페이지와 핵심 route 응답 확인
- [ ] 핵심 API와 인증 흐름 확인
- [ ] 브라우저 console 및 runtime log 확인

## 도메인
- [ ] DNS와 HTTPS 확인
- [ ] canonical domain과 redirect 확인
- [ ] auth callback 및 allowed origin 확인

## 운영
- [ ] deployment와 로그 확인 경로 문서화
- [ ] rollback runbook 검토
- [ ] incident template 준비
- [ ] 핵심 smoke test 정의

docs/deployment-plan.md

# TaskFlow Deployment Plan


## Build
- package manager: npm
- install: npm ci
- build: npm run build


## Primary deployment
- platform: Vercel
- environment: Production


## Alternative deployment
- Firebase Hosting: static output일 때 검토
- Firebase App Hosting: server runtime이 필요할 때 검토


## Verification
- Production URL 응답
- 주요 화면 확인
- 환경변수 확인
- 주요 route 확인
- 현재 commit 확인
- rollback 가능 여부 확인

## Runtime decision


- static-only: no
- server runtime required: yes
- reasons:
  - Route Handler
  - server-side environment variables


## Primary
Vercel Production


## Firebase alternative
App Hosting 우선 검토


## Static variant
정적 결과물로 분리할 경우 Firebase Hosting 검토

## Production deployment


- deployment URL: 운영 문서에서 관리
- commit SHA: 배포마다 기록
- deployment status: 확인
- build log: 확인
- smoke test: 확인

## Domain


- canonical domain: 운영 문서에서 관리
- www policy: canonical로 redirect
- HTTPS: 확인
- DNS status: 확인
- auth callback / allowed origin: 확인

## Runtime difference checklist


1. Production deployment와 commit 확인
2. 환경변수 이름·scope 확인
3. Request URL과 status 확인
4. Response headers 확인
5. origin / proxy 경로 확인
6. cache 여부 확인
7. 수정 후 새 deployment에서 재검증

docs/incident-template.md

# Incident


## Summary


## Started


## Impact


## Evidence


## Root cause


## Recovery


## Verification


## Prevention

docs/rollback-runbook.md

# TaskFlow Rollback Runbook


## Before rollback
1. 현재 deployment 기록
2. 현재 commit 기록
3. 사용자 영향 확인
4. 로그와 status 확보


## Rollback
- 이전 정상 deployment를 선택
- 운영 트래픽을 정상 버전으로 전환


## After rollback
1. 홈페이지 확인
2. 핵심 route 확인
3. 주요 API 확인
4. 인증 흐름 확인
5. 환경변수·외부 서비스 영향 확인

6. Vercel Instant Rollback 후 Production 도메인 자동 할당 상태를 확인한다. 정상 deployment를 승격하거나 Undo Rollback으로 자동 배포를 재개한다.

docs/server-access-runbook.md

# Server Access Runbook


## Connection
- host: 저장하지 않음
- user: 환경별 문서에서 별도 관리
- authentication: SSH key 우선
- private key: 저장소에 포함 금지


## Before upload
1. 대상 서버 확인
2. 현재 경로 확인
3. 배포 대상 경로 확인
4. 기존 파일 상태 확인


## After upload
1. 파일 존재 확인
2. owner / permission 확인
3. 서비스가 실제 경로를 읽는지 확인
4. HTTP 결과 확인


## Never commit
- private key
- password
- access token
- production secret

next-env.d.ts

/// <reference types="next" />
/// <reference types="next/image-types/global" />
import "./.next/types/routes.d.ts";
import "./.next/types/root-params.d.ts";

// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.

next.config.ts

import type { NextConfig } from "next";


const nextConfig: NextConfig = {
  async rewrites() {
    return [
      {
        source: "/legacy/tasks",
        destination: "/tasks",
      },
    ];
  },
};


export default nextConfig;

package.json

{
  "name": "taskflow-deployment-lab",
  "private": true,
  "engines": {
    "node": "24.x"
  },
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "typecheck": "tsc --noEmit"
  },
  "dependencies": {
    "next": "16.3.5",
    "react": "19.3.0",
    "react-dom": "19.3.0"
  },
  "devDependencies": {
    "typescript": "5.9.3",
    "@types/node": "24.10.1",
    "@types/react": "19.2.7",
    "@types/react-dom": "19.2.3"
  }
}

README.md

# 배포·서버 11 — deploy-step-11-production-final

이 ZIP은 8편의 /legacy/tasks → /tasks rewrite를 재현하는 최소 Next.js 앱과 이전 회차 운영 문서를 포함합니다. 기존 TaskFlow 전체 기능, 로그인, 실제 API 서버나 Production 배포 상태를 제공하지 않습니다.

Node.js 24.x, npm을 사용합니다. `npm ci` → `npm run typecheck` → `npm run build`로 확인하고 `npm run dev` 후 `/tasks`, `/legacy/tasks`를 비교합니다. 전체 의존성 잠금 파일은 package-lock.json에 있습니다.

.env.example은 값이 빈 설정 안내입니다. 독자의 앱에서 사용하는 변수만 .env.local 또는 플랫폼의 해당 환경에 설정하세요. URL·계정·비밀키를 ZIP에 넣지 않습니다.

CI workflow는 이미 package.json/package-lock.json과 build 스크립트가 있는 기존 npm 프로젝트 루트에 적용합니다. actions/checkout@v7, actions/setup-node@v7, Node 24.x를 사용합니다. GitHub 원격 실행은 검증하지 않았습니다.

src/lib/env.ts는 해당 모듈을 import할 때 환경 변수를 검사합니다. 파일을 추가하기만 해서는 사용하지 않는 앱 전체의 환경 설정이 자동 검증되지 않습니다.

9편부터 변수명을 NEXT_PUBLIC_API_BASE_URL로 통일합니다. 7편 NEXT_PUBLIC_API_URL 값의 이름을 바꾸고 Preview/Production scope에도 반영한 뒤 다시 build해야 합니다. 끝에 /가 없는 API origin을 입력하세요. src/lib/api.ts의 getTasks는 독자의 실제 /api/tasks API를 호출하는 함수이며 이 최소 앱에는 API 서버와 호출 UI를 추가하지 않았습니다.

이 자료에는 실제 배포·DNS 변경·SSH 접속·메일/알림·롤백 결과가 없습니다. 운영 작업은 독자가 본인 환경과 권한을 확인한 후 수행해야 합니다. 문서의 확인 항목은 수행할 체크리스트이며 이미 통과했다는 기록이 아닙니다.

src/lib/api.ts

import { env } from "./env";


export async function getTasks() {
  const response = await fetch(`${env.apiBaseUrl}/api/tasks`);


  if (!response.ok) {
    throw new Error(`Failed to fetch tasks: ${response.status}`);
  }


  return response.json();
}

src/lib/env.ts

function required(name: string, value: string | undefined) {
  if (!value) {
    throw new Error(`Missing environment variable: ${name}`);
  }


  return value;
}


export const env = {
  apiBaseUrl: required(
    "NEXT_PUBLIC_API_BASE_URL",
    process.env.NEXT_PUBLIC_API_BASE_URL,
  ),
};

tsconfig.json

{
  "compilerOptions": {
    "target": "ES2017",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "bundler",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "react-jsx",
    "incremental": true,
    "plugins": [
      {
        "name": "next"
      }
    ],
    "paths": {
      "@/*": [
        "./*"
      ]
    }
  },
  "include": [
    "next-env.d.ts",
    "**/*.ts",
    "**/*.tsx",
    ".next/types/**/*.ts",
    ".next/dev/types/**/*.ts"
  ],
  "exclude": [
    "node_modules"
  ]
}

이전 체크포인트

deploy-step-10-observability-rollback

최종 운영 문서

docs/
├─ deployment-plan.md
├─ server-access-runbook.md
├─ rollback-runbook.md
└─ incident-template.md

TaskFlow Production 최종 상태

GitHub 저장소
↓
CI clean install / build
↓
Production deployment
↓
custom domain / HTTPS
↓
route / env / runtime 검증
↓
logs / smoke test
↓
rollback / incident response

참고용 문서·최소 예제 코드

아래는 라우팅 문제를 따로 재현하기 위한 기존 최소 예제입니다. 누적 TaskFlow에는 이 파일들로 앱 전체를 덮어쓰지 않습니다. 위 전체 완료 ZIP은 기존 로그인·작업 목록·API를 보존하고 변경한 설정만 합쳤습니다.

최종 체크포인트

deploy-step-11-production-final

이 체크포인트는 “오류가 절대 없는 서비스”를 의미하지 않습니다.

오류가 발생했을 때 현재 버전과 환경을 식별하고, 증거를 모으고, 실패 계층을 좁히고, 수정 또는 rollback 후 다시 검증할 수 있는 운영 기준이 준비되었다는 의미입니다.

과정 정리

배포·서버 과정에서 가장 중요한 습관은 다음 한 줄로 정리할 수 있습니다.

증상 → 계층 분류 → 증거 수집 → 최소 수정 → 재배포/rollback → 회귀 확인

이 흐름을 유지하면 플랫폼이 Vercel, Firebase, Netlify 또는 자체 서버로 바뀌더라도 기본적인 문제 해결 방식은 그대로 활용할 수 있습니다.

실습 경로·결과·복구

독자 질문

배포 장애의 첫 증거로 어느 계층을 선택할까요?

배포 전제

실패 URL·발생 시각·배포 commit·증상 화면·Network 상태와 로그 접근 권한을 준비합니다. 비밀값과 사용자 데이터는 기록에서 가립니다.

실행 단계

  1. 홈과 실패 경로의 status를 확인합니다. build가 실패했으면 설치/컴파일 로그, 배포 성공 후 500이면 런타임 로그, 404면 도메인·라우트·rewrite·정적 파일, 접속 자체 실패면 DNS/TLS 증거를 모읍니다.
  2. 기존 체크포인트의 deployment-plan, URL smoke test, 환경 비교표, rollback-runbook, incident-template을 펼쳐 같은 배포 SHA를 기준으로 증거를 맞춥니다.
  3. 확인된 원인 하나를 최소 수정한 뒤 로컬 검사와 해당 플랫폼의 새 배포를 거쳐 주요 URL·기능·로그를 재검사합니다.

성공·실패 확인

예를 들어 /tasks 404에서 홈은 200이면 route/rewrite가 우선이고, 두 URL 모두 DNS 조회가 안 되면 도메인이 우선입니다. 동일 증상이라도 HTTP 상태·요청 URL·배포 SHA가 없으면 원인을 확정하지 않습니다. 최종 완료는 실제 환경에서 체크리스트의 항목별 결과가 남았을 때만 표시합니다.

복구와 검증 상태

회귀 또는 장애 확대 시 검증된 이전 정상 배포와 호환성을 확인하고 복귀 절차를 진행합니다. 되돌린 뒤 동일 smoke test와 로그를 다시 보고 사건 기록에 미해결 항목을 남깁니다. TaskFlow의 실제 Production·도메인·롤백 통합 검증은 미확인입니다.

다음 학습

배포 과정에서 만든 deployment plan, runbook, incident 기록은 이후 AI 코딩 도구 과정에서 에이전트의 작업 범위와 검증 조건으로 사용할 수 있고, 업무·자동화 과정에서는 재시도·알림·실패 복구 설계의 실제 사례로 연결할 수 있습니다.

다음 회차 확인 과제: 다음 과정에서는 이 배포 계획과 incident 기록을 AI 코딩 도구 또는 업무 자동화의 작업 범위·운영 인수 자료로 재사용합니다.

공식 문서

공식 문서 확인 기준: 2026-09-21

체크포인트 다운로드

deploy-step-11-production-final 완료 ZIP 다운로드

시작 체크포인트: 10회차 완료 ZIP

글 소개·학습 준비·전체 목차
노트북과 돋보기 도구함으로 표현한 배포 오류 점검 표지

배포·서버 · 11 / 11 · 최종 정리 · 배포 오류 해결 허브

프론트엔드 배포 오류를 해결할 때 가장 중요한 것은 증상만 보고 해결책을 고르는 것이 아니라 실패한 계층을 먼저 찾는 것입니다.

404가 보인다고 항상 rewrite 문제는 아니고, 화면이 오래되었다고 항상 브라우저 캐시 문제도 아닙니다. 같은 증상이라도 install, build, runtime, routing, DNS, cache에서 서로 다른 원인이 발생할 수 있습니다.

이 글은 배포·서버 과정에서 만든 진단 방법을 하나의 실무 체크리스트로 통합합니다.

이번 글에서 배우는 내용

  • 배포 장애를 계층별로 분류하는 방법
  • 증상별 첫 확인 지점
  • 수정 전에 수집할 증거
  • Vercel, Firebase, 일반 호스팅에서 공통으로 적용할 진단 순서
  • 재배포와 rollback 판단
  • TaskFlow Production 최종 운영 체크리스트

선수 지식

  • npm ci와 package-lock.json
  • npm run build
  • 환경변수
  • Next.js routing
  • DNS와 HTTPS
  • HTTP status
  • 배포 로그

목차

  1. 가장 먼저 기록할 정보
  2. Install 오류
  3. Build 오류
  4. Runtime 오류
  5. 404와 routing
  6. DNS와 HTTPS
  7. CORS와 proxy
  8. 캐시된 구버전
  9. 500과 서버 오류
  10. 증상별 빠른 표
  11. 수정 후 검증
  12. rollback 판단
  13. 최종 배포 체크리스트
  14. 학습 완료 체크리스트
  15. TaskFlow 프로젝트 최종 적용
  16. 실습 프로젝트 전체 코드
  17. 과정 정리
  18. 실습 경로·결과·복구
  19. 다음 학습
  20. 공식 문서
  21. 단독 실습과 결과 확인

이 글이 도움이 되었나요?

조회 중

읽음 기록

읽음 — / 전체 11개 · 필수 7개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기