Firebase Hosting과 App Hosting은 정적 배포와 요청별 서버 실행을 어떻게 구분하나요?
Firebase Hosting과 App Hosting은 배포할 앱이 정적 파일인지 서버 실행을 필요로 하는지부터 나눠 선택합니다. HTML·CSS·JavaScript 중심의 정적 배포와 Next.js 서버 기능을 같은 방식으로 취급하지 마세요.
적용 조건·범위: App Hosting을 실제 사용할 때는 Blaze 요금제가 필요합니다. 비용 조건은 공식 문서에서 확인하고 본 비교 학습만을 위해 결제 설정을 변경할 필요는 없습니다. Server Component와 GET Route Handler는 빌드 시 정적으로 생성할 수 있으므로 요청별 서버 실행 여부를 기준으로 판단합니다.
본문 근거: firebase.google.com/docs/hosting · firebase.google.com/docs/app-hosting · firebase.google.com/docs/app-hosting/configure
플랫폼보다 산출물을 먼저 확인하기
같은 JavaScript 프로젝트라도 build 결과는 다를 수 있습니다.
Vite 기반 SPA는 일반적으로 다음과 같은 정적 파일을 만듭니다.
dist/
├─ index.html
├─ assets/
│ ├─ app.js
│ └─ app.css
└─ images/
이 경우 서버에서 JavaScript 코드를 매 요청마다 실행하지 않아도 됩니다.
반면 Next.js 프로젝트는 사용 기능에 따라 서버 실행이 필요할 수 있습니다.
Next.js
├─ 정적 자산
├─ 미리 생성된 페이지
└─ 요청 시 실행되는 서버 코드
├─ Route Handler
├─ Server Action
└─ 동적 렌더링
따라서 “Next.js니까 무조건 정적 Hosting” 또는 “Firebase니까 App Hosting”처럼 이름만 보고 고르면 안 됩니다.
Firebase Hosting
Firebase Hosting은 정적 웹 자산과 SPA를 빠르게 제공하는 데 잘 맞는 관리형 호스팅입니다.
Firebase 공식 문서 기준으로 Hosting은 글로벌 CDN과 SSL을 제공하고, 커스텀 도메인을 연결할 수 있습니다. firebase.json을 통해 redirects, rewrites, headers, 캐시 관련 동작도 설정할 수 있습니다.
정적 Vite 앱이라면 보통 다음 흐름으로 이해할 수 있습니다.
npm run build
↓
dist 생성
↓
firebase.json public이 dist를 가리킴
↓
firebase deploy --only hosting
↓
CDN에서 정적 파일 제공
예시 설정은 다음과 같습니다.
{
"hosting": {
"public": "dist",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
]
}
}
이 설정은 Vite 같은 정적 결과물을 예로 든 것입니다. 프로젝트의 실제 output 디렉터리를 확인한 뒤 지정해야 합니다.
Firebase App Hosting
App Hosting은 Next.js와 Angular 같은 풀스택 프레임워크 앱의 빌드와 실행 환경을 관리하는 방향으로 설계되어 있습니다.
GitHub 저장소와 연결해 rollout을 만들고, 빌드와 런타임 환경변수 및 Secret을 구성할 수 있습니다.
핵심 차이는 다음처럼 생각하면 됩니다.
Hosting
→ 만들어진 웹 자산을 제공
App Hosting
→ 프레임워크 앱을 빌드하고 필요한 서버 런타임까지 운영
App Hosting에서는 apphosting.yaml을 통해 일부 런타임 설정과 환경변수 구성을 관리할 수 있고, 민감한 값은 Secret Manager의 Secret을 참조하는 방식으로 분리할 수 있습니다.
Hosting과 App Hosting 선택 기준
| 상황 | 우선 검토 |
|---|---|
| Vite SPA | Hosting |
| 정적 HTML/CSS/JS | Hosting |
| 정적 export 결과물 | Hosting |
| Next.js SSR | App Hosting |
| 요청 시 실행되는 Route Handler 사용 | App Hosting |
| 서버에서 Secret 사용 | App Hosting 또는 별도 서버 런타임 |
중요한 것은 이 표를 절대적인 규칙으로 외우는 것이 아니라 현재 프로젝트가 실제로 어떤 런타임을 요구하는지 확인하는 것입니다.
Firebase Hosting도 Cloud Functions나 Cloud Run과 rewrite로 동적 백엔드에 연결할 수 있습니다. 따라서 “Hosting은 동적 기능을 전혀 못 한다”라고 설명하면 정확하지 않습니다.
다만 풀스택 프레임워크 자체를 운영하는 목적이라면 App Hosting이 제공하는 프레임워크 중심 흐름을 먼저 검토하는 편이 자연스럽습니다.
SPA rewrite와 SSR을 혼동하면 안 되는 이유
SPA에서는 사용자가 /tasks/123으로 직접 접근했을 때 서버에 실제 tasks/123.html 파일이 없을 수 있습니다.
이 경우 모든 경로를 index.html로 보내고 브라우저 라우터가 화면을 선택하게 할 수 있습니다.
{
"hosting": {
"public": "dist",
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
}
하지만 Next.js SSR에서 모든 경로를 정적 index.html로 보내는 것은 같은 해결책이 아닙니다.
SPA rewrite
서버는 index.html 제공
→ 브라우저 라우터가 URL 처리
SSR
요청 URL에 맞춰 서버 런타임이 페이지 결과 생성
이 차이를 모르고 SPA용 rewrite를 Next.js 서버 앱에 그대로 적용하면 라우팅 구조를 오히려 망가뜨릴 수 있습니다.
환경변수도 배포 모델에 영향을 줍니다
정적 빌드에서 브라우저에 포함되는 공개 값과 서버 런타임에서만 읽어야 하는 Secret은 구분해야 합니다.
브라우저 공개 가능
NEXT_PUBLIC_API_BASE_URL
서버 전용
DATABASE_URL
API_SECRET
SERVICE_ACCOUNT_PRIVATE_KEY
클라이언트 번들에 포함되는 공개 환경변수에 서버 비밀값을 넣으면 안 됩니다.
흔한 실수
프레임워크 이름만 보고 호스팅을 선택합니다
프로젝트의 실제 build 결과와 서버 기능을 먼저 확인합니다.
Hosting rewrite를 SSR 대체 수단으로 생각합니다
SPA fallback과 서버 렌더링은 목적이 다릅니다.
public 디렉터리를 추측합니다
Vite라면 dist인 경우가 흔하지만 프로젝트 설정에 따라 다를 수 있습니다. 실제 build 결과를 확인합니다.
Emulator 성공을 Production 성공으로 봅니다
로컬 Hosting Emulator는 설정 검증에 유용하지만 실제 DNS, HTTPS, Production 환경변수까지 대신 검증하지는 않습니다.
이 주제만 따로 연습하기
설치 없이 다음 세 입력을 분류하고 앞의 배포 모델 설명으로 이유를 적습니다.
| 앱 조건 | 우선 검토 | 이유 |
|---|---|---|
| dist만으로 동작하는 Vite SPA | Hosting | 정적 자산 제공과 클라이언트 라우팅 |
| 요청마다 사용자 세션으로 SSR하는 Next.js 앱 | App Hosting 등 서버 런타임 | 요청별 코드 실행이 필요 |
| 빌드 시 생성된 Next.js export의 out | Hosting | 현재 요구가 정적 결과만으로 충족 |
자가 확인: “Server Component 파일이 있다”는 사실만으로 두 번째로 분류하면 될까요? 빌드 시 정적으로 생성되는지 실제 요청 때 실행되는지 먼저 봅니다. 결과물은 제품 이름보다 산출물과 실행 시점으로 설명한 선택표입니다.
학습 완료 체크리스트
- 정적 산출물과 서버 런타임의 차이를 설명할 수 있습니다.
- Firebase Hosting과 App Hosting의 주요 역할을 구분할 수 있습니다.
- SPA rewrite와 SSR을 구분할 수 있습니다.
- 현재 프로젝트의 build output을 먼저 확인할 수 있습니다.
- 서버 Secret을 브라우저 환경변수와 구분할 수 있습니다.
선택 실습: 할 일 앱에 적용하기
TaskFlow는 작업을 관리하는 예제 앱입니다. 이 선택 실습에서는 앱을 배포하고 서버·설정·운영 결과를 확인합니다.
이번 주제: Firebase Hosting App Hosting 차이: 정적 배포와 SSR 기준.
선택: 연재 프로젝트와 전체 자료
연재 프로젝트를 이어 만드는 분을 위한 자료입니다. 이 글의 개념과 예제만 찾으셨다면 필요한 파일과 실행 방법만 펼쳐보세요.
TaskFlow 프로젝트 적용
이 글부터 시작하는 전체 프로젝트
시작 ZIP — deploy-step-01-roadmap-full-20260928을 새 폴더에 풀고, 이번 단계 완료 ZIP은 다른 폴더에 풀어 비교합니다. ZIP 안 프로젝트 폴더의 package.json 위치가 실행 루트입니다.
출발점은 Next.js 누적 TaskFlow와 같은 38단계 소스입니다. 프로젝트에는 홈·로그인·개인 작업 화면, 작업 추가·완료·삭제, Route Handler와 캐시 예제가 들어 있습니다. 설치 버전을 고정한 package-lock.json도 포함합니다.
이번 변경 이유: 현재 앱의 서버 렌더링·API·인증을 근거로 배포 모델을 선택합니다.
docs/deployment-plan.md
- 시작 ZIP을 풀고
npm ci로 의존성을 설치합니다. Node.js 24와 npm을 사용합니다. - 위 변경 파일을 아래 전체 내용 또는 완료 ZIP의 같은 경로와 대조해 적용합니다. 다른 앱 파일은 유지합니다.
npm run typecheck,npm run build를 실행합니다. 오류가 있으면 첫 오류의 파일·명령을 기록하고 해결한 뒤 진행합니다.npm run setup-auth로 일회용 로컬 학습 계정을 설정한 후npm run dev를 실행합니다. 생성된.env.local과 입력 값은 공유하지 않습니다.
예상 결과: 홈과 로그인 화면은 공개됩니다. 로그인 전 /tasks는 로그인 화면으로 이동하고 /api/tasks는 401을 반환합니다. 로그인 후 작업 목록에서 추가·완료·삭제를 확인합니다. /cache-lab의 별도 캐시 실습은 npm run cache-api가 필요합니다.
저장·운영 범위: 작업은 단일 Node 프로세스 메모리에 저장되고 인증은 학습용 계정 예제입니다. 서버 재시작·서버리스 인스턴스 사이의 데이터 유지는 보장하지 않습니다. 로컬 실행 확인과 실제 운영 서비스 구축은 구분하며, 원격 배포·DNS·SSH·CI·롤백 결과는 직접 실행한 항목만 문서에 기록합니다.
전체 파일·코드 보기
이번 단계의 변경 파일 전체
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 검토
나머지 앱 소스와 잠금 파일은 전체 완료 ZIP에 있습니다. 기존 코드 조각은 설명용이며 위 전체 변경 파일과 ZIP이 이 누적 실습의 기준입니다. 다음 글에는 이번 완료 ZIP을 시작본으로 가져갑니다.
이 회차는 아래 전체 TaskFlow 시작 ZIP을 기준으로 진행합니다. 이전 글의 코드를 모으지 않아도 되며, 완료 ZIP에는 이번 변경과 기존 앱 기능이 함께 들어 있습니다.
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 검토
README.md
# 배포·서버 02 — deploy-step-02-artifact-strategy
이 ZIP은 배포 준비·운영 문서와 해당 회차 설정/코드 조각을 누적한 적용 자료입니다. 실행 앱 전체는 포함하지 않습니다. 기존 deploy-step-00-build-ready 프로젝트에 해당 파일을 검토하여 적용하세요. 이 ZIP 루트에서 npm ci/build를 실행하는 구조가 아닙니다.
이 자료에는 실제 배포·DNS 변경·SSH 접속·메일/알림·롤백 결과가 없습니다. 운영 작업은 독자가 본인 환경과 권한을 확인한 후 수행해야 합니다. 문서의 확인 항목은 수행할 체크리스트이며 이미 통과했다는 기록이 아닙니다.
이전 체크포인트
deploy-step-01-roadmap
현재 상태 확인
TaskFlow가 Next.js 기반이라면 다음 항목을 확인합니다.
Server Component 사용 여부
Route Handler 사용 여부
Server Action 사용 여부
서버 전용 환경변수 사용 여부
요청 시 동적 렌더링 필요 여부
이번 변경
docs/deployment-plan.md에 배포 모델 판단을 추가합니다.
## 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 검토
이 회차에서는 Firebase에 실제 배포하지 않아도 됩니다. 목적은 TaskFlow가 어떤 배포 모델인지 설명할 수 있는 상태를 만드는 것입니다.
참고용 문서·최소 예제 코드
아래 기존 문서·설정 예시는 변경 이유를 설명합니다. 실제 누적 앱의 전체 소스는 위의 전체 완료 ZIP에 있으며, 다음 회차의 시작본으로 그대로 사용합니다.
완료 체크포인트
deploy-step-02-artifact-strategy
실습 경로·결과·복구
독자 질문
정적 파일만 올려도 되는지 어떻게 판단할까요?
배포 전제
1회차 deployment-plan.md와 실제 TaskFlow의 package.json, 렌더링·서버 기능 목록이 필요합니다. Firebase 프로젝트 생성이나 배포는 이 판단 실습의 전제가 아닙니다.
실행 단계
- 프로젝트 루트에서 npm run build를 실행하고 설정 및 산출물 경로를 확인합니다. Vite의 dist, Next.js의 정적 export out, 요청 시 서버 실행이 필요한 Next.js 구성을 구분합니다.
- 라우트별로 빌드 시 결과가 확정되는지, 인증·동적 API·서버 액션처럼 요청 시 실행이 필요한지 적습니다. 정적 산출물만으로 충분한 경우 Hosting을, 프레임워크 런타임을 함께 운영할 경우 App Hosting 또는 Vercel을 검토합니다.
- docs/deployment-plan.md에 ‘현재 산출물 / 서버 필요 기능 / 주 경로 / Firebase 대안 / 선택 근거’를 한 줄씩 추가합니다. Hosting도 별도의 Functions·Cloud Run 연동으로 동적 백엔드를 제공할 수 있으므로 제품 이름만으로 가능·불가를 단정하지 않습니다.
성공·실패 확인
dist 또는 out을 실제로 확인했다면 파일 경로를, 그렇지 않으면 예상 경로와 미확인을 기록합니다. SSR 요청 경로를 정적 파일 복사만으로 시험했을 때 동작하지 않는다면 런타임 선택을 다시 확인합니다. SPA rewrite는 URL을 파일에 매핑할 뿐 SSR 코드를 실행하지 않습니다.
복구와 검증 상태
산출물 폴더가 없으면 build 로그와 프레임워크 설정을 확인합니다. 잘못된 Hosting public 경로로 빈 화면이 나오면 실제 빌드 산출물로 경로를 고치고 재배포·새로고침을 다시 확인합니다. Firebase 실제 배포는 미확인입니다.
다음 학습
다음 글에서는 관리형 플랫폼이 대신 처리해 주는 서버 접속과 파일 전송의 기본 개념을 SSH, SFTP, FTP를 통해 정리합니다.
다음 글: SSH SFTP FTP 차이: 서버 접속과 파일 전송 기준 잡기
다음 회차 확인 과제: 03회차에서 SSH·SFTP 역할을 선택 학습으로 확인한 뒤, 04회차의 관리형 Vercel 배포에는 01·02회차 판단 결과를 가져갑니다.
공식 문서
공식 문서 확인 기준: 2026-09-21
체크포인트 다운로드
글 소개·학습 준비·전체 목차

배포·서버 · 2 / 11 · 필수 개념 · 배포 모델
Firebase Hosting과 App Hosting의 차이는 “Firebase에서 배포한다”는 공통점보다 어떤 결과물을 실행해야 하는지로 판단하는 편이 정확합니다.
결론부터 정리하면 정적 HTML·CSS·JavaScript와 SPA를 제공하는 것이 중심이면 Firebase Hosting이 자연스럽고, Next.js처럼 서버 런타임이 필요한 풀스택 프레임워크 앱은 App Hosting을 우선 검토할 수 있습니다.
이번 글에서 배우는 내용
- 정적 산출물과 서버 런타임 차이
- Vite dist와 Next.js 실행 구조
- Firebase Hosting의 역할
- Firebase App Hosting의 역할
- SPA rewrite와 SSR의 차이
- TaskFlow의 배포 모델을 판단하는 방법
선수 지식
- npm run build의 의미
- 정적 파일의 기본 개념
- Next.js 또는 Vite 프로젝트 경험
- HTTP 요청과 URL의 기본 개념
App Hosting을 실제 사용할 때는 Blaze 요금제가 필요합니다. 비용 조건은 공식 문서에서 확인하고 본 비교 학습만을 위해 결제 설정을 변경할 필요는 없습니다. Server Component와 GET Route Handler는 빌드 시 정적으로 생성할 수 있으므로 요청별 서버 실행 여부를 기준으로 판단합니다.
목차
이 글이 도움이 되었나요?
읽음 기록
읽음 — / 전체 11개 · 필수 7개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.