정적 호스팅 배포
빌드 산출물을 Netlify에 배포하고 Git 연동 자동 배포·도메인 연결·SPA 경로 새로고침 문제를 해결합니다.
이번 장에서는 리액트 SPA(Single Page Application) 배포에서 가장 흔히 쓰는 방식 중 하나인 정적 호스팅 서비스(Static Hosting Service) 배포 흐름을 정리합니다.
정적 호스팅은 HTML, CSS, JavaScript 파일을 전 세계 가까운 서버에서 제공하고, 라우팅은 SPA fallback으로 보완한다.
- 1React SPA 배포 개요
React SPA 배포 개요
- 2Git 연결 Netlify, Vercel, Pages
저장소 변경을 감지한다.
- 3Build Vite 기준 `npm run build`
정적 파일을 만든다.
정적 호스팅 서비스란?
정적 호스팅 서비스는 HTML, CSS, JavaScript, 이미지 등과 같은 정적인 파일(Static Files)을 저장하고 웹을 통해 제공하는 서비스입니다.
리액트와 같은 SPA는 빌드 과정을 거치면 결과적으로 이러한 정적 파일들의 집합이 되기 때문에, 정적 호스팅 서비스에 배포하기에 매우 적합합니다.
정적 호스팅 서비스의 장점- 간편한 배포: 대부분 Git 저장소(GitHub, GitLab, Bitbucket 등)와 연동하여 자동 배포(CI/CD)를 쉽게 설정할 수 있습니다.
- 저렴하거나 무료: 많은 서비스가 무료 티어를 제공하며, 유료 플랜도 비교적 저렴합니다.
- 빠른 로딩 속도: CDN(Content Delivery Network)을 사용하여 사용자에게 가장 가까운 서버에서 파일을 제공하므로 로딩 속도가 빠릅니다.
- 안정성: 서버리스(Serverless) 형태로 운영되어 트래픽 급증에도 안정적입니다.
- 확장성: 별도의 서버 관리 없이도 쉽게 확장 가능합니다.
다양한 정적 호스팅 서비스가 있지만, 리액트 개발자들에게 인기 있는 몇 가지를 소개합니다.
- Git 통합을 통한 자동 배포, 커스텀 도메인, SSL 인증서, 서버리스 함수(Lambda Functions), 폼 처리 등 다양한 기능을 무료로 제공합니다.
- 초보자에게 가장 추천하는 서비스입니다.
- Netlify와 유사한 배포 기능을 제공하며, Next.js 프로젝트에 특히 최적화되어 있습니다.
- 직관적인 UI와 빠른 배포 속도가 장점입니다.
- GitHub 저장소에 있는 정적 파일을 무료로 호스팅할 수 있습니다. 매우 간단하지만, CI/CD 설정은 직접 해야 합니다.
- 개인 프로젝트나 포트폴리오 사이트에 적합합니다.
- Google의 Firebase 플랫폼에서 제공하는 서비스로, 빠르고 안전한 웹 호스팅을 제공합니다.
- Firebase의 다른 서비스(인증, 데이터베이스 등)와 연동해 사용하기 좋습니다.
- 클라우드 서비스에 대한 이해가 있다면 AWS S3에 정적 파일을 저장하고, CloudFront를 통해 CDN을 구성하여 배포할 수 있습니다.
- 가장 강력하고 유연하지만, 설정이 복잡하고 비용 관리가 필요합니다.
이 장에서는 Netlify를 중심으로 배포 과정을 설명합니다.
Netlify는 무료로 시작하기 쉽고, 대부분의 리액트 앱 배포에 필요한 기능을 제공합니다.
Netlify를 이용한 배포 (GitHub 연동)
Netlify를 사용하여 React 앱을 배포하는 과정은 매우 간단하며, 대부분의 단계가 자동화되어 있습니다.
Netlify 배포 전 준비
Git 저장소에 코드 푸시: 리액트 프로젝트 코드가 GitHub, GitLab, 또는 Bitbucket과 같은 Git 원격 저장소에 푸시되어 있어야 합니다. (이전 장에서 만들었던 build 폴더는 .gitignore에 의해 Git에 추적되지 않으므로 별도 처리하지 않아도 됩니다.)
Netlify 계정 생성: Netlify 웹사이트(https://www.netlify.com/)에 접속하여 GitHub 계정 등으로 회원가입하고 로그인합니다.
Netlify를 통한 배포 과정
- 로그인 후 Netlify 대시보드(Dashboard)로 이동합니다.
- Add new site 또는 New site from Git 버튼을 클릭합니다.
- GitHub, GitLab, Bitbucket 중 여러분의 프로젝트가 있는 Git 저장소 공급자를 선택하고 연결합니다. (최초 연결 시 권한 요청이 있을 수 있습니다.)
- 연결된 Git 저장소 목록에서 배포하고자 하는 리액트 프로젝트의 저장소를 선택합니다.
- Netlify는 자동으로 리액트 프로젝트임을 감지하고 적절한 설정을 제안합니다.
- Owner: 프로젝트를 소유한 Git 계정/조직
- Branch to deploy: 배포할 Git 브랜치 (일반적으로
main또는master) - Base directory: 빌드 명령어를 실행할 디렉토리 (보통 프로젝트 루트이므로 비워둡니다).
- Build command: 프로젝트를 빌드하기 위한 명령어. Vite 기반 프로젝트는 기본값이
npm run build(또는yarn build)입니다. - Publish directory: 빌드된 정적 파일이 생성되는 디렉토리. Vite 기반 프로젝트는 기본값이
dist입니다.
확인: Vite 프로젝트는 Build command=npm run build, Publish directory=dist로 설정하면 대부분 바로 배포됩니다.
- 모든 설정을 확인한 후 Deploy site 버튼을 클릭합니다.
- Netlify는 Git 저장소에서 코드를 가져와 설정된 빌드 명령어를 실행하고,
publish directory의 내용을 CDN에 배포합니다. - 배포 진행 상황은 Netlify 대시보드에서 실시간으로 확인할 수 있습니다.
- 배포가 완료되면 임의의 URL(예:
https://your-random-name.netlify.app/)이 생성되며, 이 URL을 통해 여러분의 리액트 앱에 접속할 수 있습니다.
자동 배포 (Continuous Deployment)
Netlify의 가장 큰 장점 중 하나는 자동 배포(Continuous Deployment) 기능이에요.
- 한번 설정해두면, 여러분이 지정한 브랜치(
main등)에 코드를 푸시할 때마다 Netlify가 이를 감지하여 자동으로 빌드하고 배포를 시작합니다. - 이로 인해 개발자는 배포 과정에 신경 쓸 필요 없이 코드 작성에만 집중할 수 있습니다.
아래 다이어그램은 Git 푸시 이후 정적 호스팅 자동 배포가 어떤 단계를 거쳐 사용자에게 도달하는지 요약한 것입니다.
git push가 CI를 트리거하고, 빌드된 정적 파일이 호스팅 스토리지와 CDN 캐시에 배포된다.
- repository
push repository 변경 트리거
- CI runner
build CI runner 정적 산출물 생성
- hosting storage
publish hosting storage HTML/CSS/JS 업로드
- cache invalidation
CDN cache invalidation 전 세계 엣지 반영
커스텀 도메인 설정
임의의 Netlify URL 대신 자체 도메인(예: www.myawesomeapp.com)을 연결할 수 있습니다.
Netlify 대시보드에서 해당 사이트를 선택합니다.
Domain settings 탭으로 이동합니다.
Add custom domain 버튼을 클릭하고, 여러분이 소유한 도메인 이름을 입력합니다.
Netlify가 제시하는 DNS 설정(CNAME 또는 A 레코드)을 여러분의 도메인 등록 업체(가비아, GoDaddy 등)에서 적용합니다.
설정이 반영되면 Netlify가 자동으로 무료 SSL 인증서(Let's Encrypt)를 발급해 HTTPS를 적용합니다.
라우팅 문제 해결 (SPA Fallback)
브라우저가 /settings 같은 경로를 직접 요청하면 서버 파일은 없지만, index.html을 돌려주면 클라이언트 라우터가 화면을 선택한다.
- /settings
request /settings 브라우저 직접 접근
- 정적 파일 없음
file lookup 정적 파일 없음 서버는 경로를 모름
- index.html
fallback index.html 앱 shell 반환
- client route
router client route 해당 화면 렌더
리액트 SPA는 클라이언트 측 라우팅(예: React Router)을 사용합니다.
즉, 모든 경로 요청(example.com/about, example.com/products/123)이 결국 index.html 파일을 로드해야 합니다.
하지만 웹 서버는 기본적으로 요청된 경로에 해당하는 파일이 없으면 404 Not Found 에러를 반환합니다.
이 문제를 해결하기 위해 Netlify와 같은 정적 호스팅 서비스에서는 리다이렉트 규칙을 설정하여 모든 유효하지 않은 경로 요청을 index.html로 fallback 시키는 기능을 제공합니다.
Netlify에서는 프로젝트의 public 폴더 안에 _redirects 파일을 생성하여 이 규칙을 추가할 수 있습니다.
public/_redirects 파일 생성 (필수)
/* /index.html 200이 한 줄은 "모든 경로(/*)로 들어오는 요청을 /index.html로 보내고, HTTP 상태 코드 200(OK)을 반환하라"는 의미입니다.
이렇게 하면 React Router가 경로를 처리할 수 있게 됩니다.
주의: 이 파일은 public 폴더에 있어야 빌드 시 dist 폴더로 복사됩니다.
기타 정적 호스팅 서비스의 배포 (간략)
다른 주요 정적 호스팅 서비스들도 Netlify와 유사한 배포 과정을 가집니다.
-
Vercel
- Netlify와 거의 동일한 흐름으로 Git 저장소 연동 및 자동 배포를 지원합니다.
vercelCLI 도구를 사용하면 명령줄에서도 쉽게 배포할 수 있습니다. (vercel명령 후dist폴더를 선택).
-
GitHub Pages
- 프로젝트의
main(또는gh-pages) 브랜치에dist폴더의 내용을 배포합니다. - Vite 프로젝트는
gh-pages패키지와vite.config의base설정을 함께 사용하면 안정적으로 배포할 수 있습니다.package.json { "name": "my-react-app", "scripts": { "dev": "vite", "build": "vite build", "preview": "vite preview", "predeploy": "npm run build", "deploy": "gh-pages -d dist" }, "devDependencies": { "gh-pages": "^6.3.0" } }vite.config.ts에서base: '/<YOUR_REPO_NAME>/'를 설정한 뒤npm run deploy를 실행하면 됩니다.
- 프로젝트의
-
Firebase Hosting
- Firebase CLI를 설치하고
firebase init으로 프로젝트를 초기화한 후,firebase deploy명령어로 배포합니다. firebase.json설정 파일에서public디렉토리를dist로,rewrites규칙을index.html로 설정하여 SPA 라우팅 문제를 해결합니다.
- Firebase CLI를 설치하고
아래 다이어그램은 정적 호스팅 서비스를 선택하고 실제 배포 전에 확인할 설정을 압축한 점검표입니다.
React SPA는 dist를 올리는 구조가 단순하지만, 브랜치와 빌드 명령, 라우팅 fallback이 어긋나면 배포 후 바로 막힙니다.
- 초기 추천
Netlify Git 연동, SSL, 도메인, SPA fallback 설정이 직관적입니다.
- 빠른 프리뷰
Vercel 브랜치별 미리보기와 자동 배포 흐름이 가볍습니다.
- 저장소 배포
Pages 포트폴리오처럼 단순한 공개 정적 사이트에 맞습니다.
- Firebase 연동
Firebase 인증, DB 등 Firebase 기능과 함께 쓸 때 편합니다.
정적 호스팅에서는 사용자의 URL 요청이 어떤 과정을 거쳐 React Router로 넘어가는지도 함께 이해해야 합니다.
직접 진입 요청은 먼저 정적 호스팅을 통과한다. 서버가 앱 셸을 돌려준 뒤에야 브라우저의 라우터가 원래 경로를 읽을 수 있다.
- 원래 경로 요청
BROWSER 원래 경로 요청 GET /dashboard/settings 주소창의 pathname은 그대로 유지
- 실제 파일인지 판별
HOST / CDN 실제 파일인지 판별 요청 경로와 배포 산출물을 먼저 대조한다. 파일 있음 → 그대로 응답 파일 없음 → SPA fallback
- 앱 셸 반환
FALLBACK 앱 셸 반환 index.html 을 200 응답으로 보내 브라우저 실행을 시작한다. rewrite는 URL을 바꾸는 redirect가 아님
- 원래 경로 매칭
REACT ROUTER 원래 경로 매칭 JS가 실행되면 라우터가 location.pathname 을 읽고 화면을 선택한다. DashboardLayout + Settings
- 서버 책임
정적 파일 선택 · 없는 앱 경로를 index.html 로 rewrite
- 브라우저 책임
번들 실행 · 현재 pathname에 대응하는 React 화면 렌더링
정적 호스팅 서비스 개념과 Netlify를 이용한 배포 (GitHub 연동) 흐름을 함께 정리한 보조 다이어그램입니다.
dist 가 만들어졌다고 배포가 끝난 것은 아니다. 산출물, rewrite 규칙, 브라우저 캐시가 서로 다른 실패 지점을 만든다.
- 1. Build boundary커밋과 산출물
npm run build 가 같은 커밋에서 dist 를 만드는지 본다.
- 2. Hosting라우팅과 publish 경로
직접 진입 URL이 서버에서 index.html 로 돌아오는지 확인한다.
- 3. Runtime캐시와 실제 화면
HTML은 새로 받고, 해시 asset은 길게 캐시되는지 분리해서 본다.
배포 절차 정리와 다음 학습 포인트
이제는 React 앱을 빌드하고, Netlify와 같은 강력하고 편리한 정적 호스팅 서비스를 사용하여 전 세계 사용자에게 배포하는 방법을 익히셨습니다.
- 정적 호스팅 서비스는 React SPA 배포에 가장 적합한 옵션 중 하나입니다.
- Netlify는 Git 통합, 자동 배포, 무료 SSL, 커스텀 도메인 등 주요 배포 기능을 무료로 제공하여 초보자에게 특히 추천됩니다.
_redirects파일 설정을 통해 SPA 라우팅 문제를 해결하는 것이 중요합니다.
이제 사용자는 배포된 웹 애플리케이션에 접근해 상호작용할 수 있습니다.
정적 호스팅 배포는 build 결과물, base path, fallback 규칙이 서버 환경과 맞는지 확인하는 흐름입니다.
- 1Build 산출물
Build 번들, 에셋 경로, sourcemap 공개 여부를 hosting 정책에 맞춥니다.
- 2Host 설정
Host root directory, cache header, rewrite rule을 배포 대상에 맞게 둡니다.
- 3Release 기준
Release 환경 변수와 preview, production 분기를 배포 파이프라인에서 분리합니다.
- 4path SPA 새로고침
index fallback으로 연결되어야 합니다.
- 5env public env
secret 값을 build 단계에서 혼동하지 않습니다.
- 6404 페이지
권한 없는 화면은 hosting rewrite와 충돌하지 않게 둡니다.