본문 바로가기

정적 호스팅 배포

빌드 산출물을 Netlify에 배포하고 Git 연동 자동 배포·도메인 연결·SPA 경로 새로고침 문제를 해결합니다.

이번 장에서는 리액트 SPA(Single Page Application) 배포에서 가장 흔히 쓰는 방식 중 하나인 정적 호스팅 서비스(Static Hosting Service) 배포 흐름을 정리합니다.


정적 호스팅 서비스란?

정적 호스팅 서비스는 HTML, CSS, JavaScript, 이미지 등과 같은 정적인 파일(Static Files)을 저장하고 웹을 통해 제공하는 서비스입니다.

리액트와 같은 SPA는 빌드 과정을 거치면 결과적으로 이러한 정적 파일들의 집합이 되기 때문에, 정적 호스팅 서비스에 배포하기에 매우 적합합니다.

정적 호스팅 서비스의 장점
  • 간편한 배포: 대부분 Git 저장소(GitHub, GitLab, Bitbucket 등)와 연동하여 자동 배포(CI/CD)를 쉽게 설정할 수 있습니다.
  • 비용 선택: 서비스별 요금·사용량 한도·기능 조건을 확인해 프로젝트에 맞는 플랜을 선택합니다. 무료라는 이유만으로 제한 없이 운영할 수 있다고 가정하지 않습니다.
  • 빠른 로딩 속도: CDN(Content Delivery Network)을 사용하여 사용자에게 가장 가까운 서버에서 파일을 제공하므로 로딩 속도가 빠릅니다.
  • 운영 부담 분담: 파일 제공 인프라는 서비스가 운영합니다. 사용량 한도·장애·외부 API 지연까지 없어지는 것은 아니므로 자신의 요청 경로를 확인합니다.
  • 확장성: 별도의 서버 관리 없이도 쉽게 확장 가능합니다.
정적 호스팅 서비스의 종류

다양한 정적 호스팅 서비스가 있지만, 리액트 개발자들에게 인기 있는 몇 가지를 소개합니다.

Netlify (이 장의 실습 대상)
  • Git 연동 빌드와 정적 파일 배포를 중심으로 설명합니다. 도메인·인증서·함수·폼 등 추가 기능은 이용 플랜과 현재 서비스 문서의 조건을 확인합니다.
  • 이 절에서 선택한 서비스이며 모든 프로젝트에 같은 도구를 요구하지 않습니다.
Vercel (Next.js 개발사가 만든 서비스)
  • Netlify와 유사한 배포 기능을 제공하며, Next.js 프로젝트에 특히 최적화되어 있습니다.
  • 직관적인 UI와 빠른 배포 속도가 장점입니다.
GitHub Pages
  • GitHub 저장소에 있는 정적 파일을 무료로 호스팅할 수 있습니다. 매우 간단하지만, CI/CD 설정은 직접 해야 합니다.
  • 개인 프로젝트나 포트폴리오 사이트에 적합합니다.
Firebase Hosting
  • Google의 Firebase 플랫폼에서 제공하는 서비스로, 빠르고 안전한 웹 호스팅을 제공합니다.
  • Firebase의 다른 서비스(인증, 데이터베이스 등)와 연동해 사용하기 좋습니다.
AWS S3 + CloudFront
  • 클라우드 서비스에 대한 이해가 있다면 AWS S3에 정적 파일을 저장하고, CloudFront를 통해 CDN을 구성하여 배포할 수 있습니다.
  • 가장 강력하고 유연하지만, 설정이 복잡하고 비용 관리가 필요합니다.

이 장에서는 Netlify를 중심으로 배포 과정을 설명합니다.

먼저 빌드 산출물, 배포할 브랜치, 출력 경로를 정합니다. 계정별 요금·사용량·권한과 화면의 버튼 이름은 바뀔 수 있으므로 실제 대시보드에서 확인합니다. 아래 UI 이름은 설정 항목을 찾기 위한 예시입니다.


Netlify를 이용한 배포 (GitHub 연동)

Netlify를 사용하여 React 앱을 배포하는 과정은 매우 간단하며, 대부분의 단계가 자동화되어 있습니다.

Netlify 배포 전 준비

Git 저장소에 코드 푸시: 리액트 프로젝트 코드가 GitHub, GitLab, 또는 Bitbucket과 같은 Git 원격 저장소에 푸시되어 있어야 합니다. (Vite의 기본 산출물은 dist이며, 프로젝트 .gitignore에서 이 폴더를 제외했는지 확인합니다.)

Netlify 계정 생성: Netlify 웹사이트(https://www.netlify.com/)에 접속하여 GitHub 계정 등으로 회원가입하고 로그인합니다.

Netlify를 통한 배포 과정

Netlify 대시보드에서 새로운 사이트 추가
  • 로그인 후 Netlify 대시보드(Dashboard)로 이동합니다.
  • Add new site 또는 New site from Git 버튼을 클릭합니다.
Git 공급자 연결
  • GitHub, GitLab, Bitbucket 중 여러분의 프로젝트가 있는 Git 저장소 공급자를 선택하고 연결합니다. (최초 연결 시 권한 요청이 있을 수 있습니다.)
저장소 선택
  • 연결된 Git 저장소 목록에서 배포하고자 하는 리액트 프로젝트의 저장소를 선택합니다.
빌드 설정 (Build settings) 구성
  • 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)
  • 모든 설정을 확인한 후 Deploy site 버튼을 클릭합니다.
배포 진행 및 확인
  • Netlify는 Git 저장소에서 코드를 가져와 설정된 빌드 명령어를 실행하고, publish directory의 내용을 CDN에 배포합니다.
  • 배포 진행 상황은 Netlify 대시보드에서 실시간으로 확인할 수 있습니다.
  • 배포가 완료되면 임의의 URL(예: https://your-random-name.netlify.app/)이 생성되며, 이 URL을 통해 여러분의 리액트 앱에 접속할 수 있습니다.

자동 배포 (Continuous Deployment)

Netlify의 가장 큰 장점 중 하나는 자동 배포(Continuous Deployment) 기능이에요.

  • 한 번 설정해 두면, 여러분이 지정한 브랜치(main 등)에 코드를 푸시할 때마다 Netlify가 이를 감지하여 자동으로 빌드하고 배포를 시작합니다.
  • 자동 시작 뒤에도 빌드·배포의 성공 여부와 실제 주소의 응답은 확인합니다. 별도의 테스트 통과를 배포 조건으로 삼으려면 그 의존 관계도 구성해야 합니다.

아래 그림은 배포 이후 요청을 분류하는 운영 설계입니다. 뒤의 간단한 wildcard rewrite 예제보다 엄격하게 앱 경로와 누락 자산을 나누려면 호스트 규칙을 별도로 구성해야 합니다.

호스트의 요청 분기와 브라우저 라우팅을 나눈다 — 상태 추적

하나의 직접 URL 요청에서 호스트 분류/파일 또는 rewrite/브라우저 router 매칭의 현재 위치와 HTTP/view 결과가 달라진다. 더 엄격한 자산 404는 별도 규칙임을 명시한다.

브라우저 요청을 호스트가 분류한다. 존재하는 파일은 직접 제공하고, 허용한 앱 경로는 URL을 유지한 HTML rewrite 뒤 React Router가 처리한다. 누락 자산·앱 밖 경로의 404는 추가 호스트 규칙이 필요한 설계다.

STATIC HOST / SPA REWRITE / ROUTER

호스트의 요청 분기와 브라우저 라우팅을 나눈다

아래는 실제 파일을 먼저 제공하고 허용한 앱 경로만 index.html로 rewrite하는 운영 설계 예시다. 앱 셸과 JS 실행 이후 React Router가 원래 URL의 화면을 선택한다.

호스트의 요청 분기와 브라우저 라우팅을 나눈다브라우저 요청을 호스트가 분류한다. 존재하는 파일은 직접 제공하고, 허용한 앱 경로는 URL을 유지한 HTML rewrite 뒤 React Router가 처리한다. 누락 자산·앱 밖 경로의 404는 추가 호스트 규칙이 필요한 설계다.브라우저 URL 요청호스트에서 먼저 분류존재하는 파일200 · 파일 직접 제공허용한 앱 경로200 · index.html누락 자산 · 앱 밖404 · 별도 규칙JS 실행 → Router 매칭
호스트의 세 요청 결과와 앱 Router브라우저 요청에서 존재 파일·허용 앱 경로·누락 자산 또는 앱 밖의 세 결과로 각각 갈라진다. 세 결과를 세로에 놓았지만 서로 이어지는 실행 순서가 아니다. 허용 앱 경로만 HTML과 JS 실행 뒤 Router 매칭으로 이어진다. 같은 다섯 노드와 네 간선이며 엄격404는 추가 호스트 정책이다. 본문 wildcard 한 줄만으로 이 정책이 자동 완성되지 않는다.브라우저 URL 요청호스트에서 먼저 분류존재하는 파일200 · 파일 직접 제공허용한 앱 경로200 · index.html누락 자산 · 앱 밖404 · 별도 규칙JS 실행Router 매칭

HOST / REAL FILE

존재하는 자산은 직접 제공한다

예: /assets/app-hash.js. Netlify의 기본 rewrite는 실제 배포 파일을 먼저 제공한다. 해시 자산은 내용과 캐시 정책을 맞추고, HTML은 최신 버전 재검증을 구성한다.

HOST → BROWSER / APP ROUTE

깊은 URL도 앱 셸을 받는다

예: /projects/42 직접 진입. 호스트가 index.html을 200으로 응답하며 주소창 URL은 유지된다. 브라우저가 번들을 실행하면 React Router가 원래 path를 매칭한다.

POLICY / MISSING FILE

엄격한 404는 직접 구성한다

예: 존재하지 않는 /assets/missing.js나 앱 밖 경로. 자산·API·앱 경로를 나누는 호스트 규칙을 설정해야 위 404 분기를 구현할 수 있다. 클라이언트 Router만으로 HTTP 응답을 정하지 않는다.

LESSON / WILDCARD RULE

본문의 한 줄은 범위가 넓다

Netlify의 /* /index.html 200은 실제 파일이 없으면 앱 밖 경로나 누락 JS·CSS도 HTML 200으로 응답할 수 있다. 이것만으로 위 엄격한 분기가 완성됐다고 판단하지 않는다.

Vite base는 배포 하위 경로의 자산 URL을 조정한다. BrowserRouter의 basename이나 호스트의 깊은 URL 새로고침 규칙을 자동으로 설정하지 않는다. _redirects는 Netlify 방식이므로 다른 호스트는 해당 규칙을 사용한다.

이 예의 조건

  • 원도표의 전체 구조와 설명은 위 관계도와 표에서 유지합니다. 아래 인쇄 표에도 원도표의 관계·조건·라벨·설명·주석을 보존합니다.
  • 두 관찰 칸의 위치는 고정입니다. 관찰 상태는 해당 순간의 값이며, 동작·이유는 그 조건에서의 판정과 변화 원인입니다. 독립 비교와 실패 분기는 별도 조건으로 읽고 모든 분기를 한 요청의 필수 실행 순서로 이어 읽지 않습니다.
관계도의 보충 설명
원도표의 전체 관계·조건·설명
구분내용
전체 관계·조건 설명브라우저 요청에서 존재 파일·허용 앱 경로·누락 자산 또는 앱 밖의 세 결과로 각각 갈라진다. 세 결과를 세로에 놓았지만 서로 이어지는 실행 순서가 아니다. 허용 앱 경로만 HTML과 JS 실행 뒤 Router 매칭으로 이어진다. 같은 다섯 노드와 네 간선이며 엄격한 404는 추가 호스트 정책이다. 본문 wildcard 한 줄만으로 이 정책이 자동 완성되지 않는다.
전체 상태와 변화 근거
장면현재 관찰값설명변화 이유
호스트 요청host: 파일/app/앱 밖 판정 / router: 실행 전브라우저 document 요청이 host에서 분류된다BrowserRouter보다 호스트 응답이 먼저다
응답 경계app: index.html 응답 / 누락 자산: 별도 404 규칙 필요파일은 직접 제공하고 허용 app 경로는 URL 유지 rewrite를 한다단순 wildcard 예제는 엄격한 자산 분리를 완성하지 않는다
router 실행URL: 원 pathname / UI: 매칭 결과받은 문서에서 JS가 pathname을 읽어 화면을 고른다client 화면 선택이 반환 HTTP 상태를 바꾸지 않는다

호스트의 요청 분기와 브라우저 라우팅을 나눈다 — 상태 추적

하나의 직접 URL 요청에서 호스트 분류/파일 또는 rewrite/브라우저 router 매칭의 현재 위치와 HTTP/view 결과가 달라진다. 더 엄격한 자산 404는 별도 규칙임을 명시한다.

브라우저 요청을 호스트가 분류한다. 존재하는 파일은 직접 제공하고, 허용한 앱 경로는 URL을 유지한 HTML rewrite 뒤 React Router가 처리한다. 누락 자산·앱 밖 경로의 404는 추가 호스트 규칙이 필요한 설계다.

STATIC HOST / SPA REWRITE / ROUTER

호스트의 요청 분기와 브라우저 라우팅을 나눈다

아래는 실제 파일을 먼저 제공하고 허용한 앱 경로만 index.html로 rewrite하는 운영 설계 예시다. 앱 셸과 JS 실행 이후 React Router가 원래 URL의 화면을 선택한다.

호스트의 요청 분기와 브라우저 라우팅을 나눈다브라우저 요청을 호스트가 분류한다. 존재하는 파일은 직접 제공하고, 허용한 앱 경로는 URL을 유지한 HTML rewrite 뒤 React Router가 처리한다. 누락 자산·앱 밖 경로의 404는 추가 호스트 규칙이 필요한 설계다.브라우저 URL 요청호스트에서 먼저 분류존재하는 파일200 · 파일 직접 제공허용한 앱 경로200 · index.html누락 자산 · 앱 밖404 · 별도 규칙JS 실행 → Router 매칭
호스트의 세 요청 결과와 앱 Router브라우저 요청에서 존재 파일·허용 앱 경로·누락 자산 또는 앱 밖의 세 결과로 각각 갈라진다. 세 결과를 세로에 놓았지만 서로 이어지는 실행 순서가 아니다. 허용 앱 경로만 HTML과 JS 실행 뒤 Router 매칭으로 이어진다. 같은 다섯 노드와 네 간선이며 엄격404는 추가 호스트 정책이다. 본문 wildcard 한 줄만으로 이 정책이 자동 완성되지 않는다.브라우저 URL 요청호스트에서 먼저 분류존재하는 파일200 · 파일 직접 제공허용한 앱 경로200 · index.html누락 자산 · 앱 밖404 · 별도 규칙JS 실행Router 매칭

HOST / REAL FILE

존재하는 자산은 직접 제공한다

예: /assets/app-hash.js. Netlify의 기본 rewrite는 실제 배포 파일을 먼저 제공한다. 해시 자산은 내용과 캐시 정책을 맞추고, HTML은 최신 버전 재검증을 구성한다.

HOST → BROWSER / APP ROUTE

깊은 URL도 앱 셸을 받는다

예: /projects/42 직접 진입. 호스트가 index.html을 200으로 응답하며 주소창 URL은 유지된다. 브라우저가 번들을 실행하면 React Router가 원래 path를 매칭한다.

POLICY / MISSING FILE

엄격한 404는 직접 구성한다

예: 존재하지 않는 /assets/missing.js나 앱 밖 경로. 자산·API·앱 경로를 나누는 호스트 규칙을 설정해야 위 404 분기를 구현할 수 있다. 클라이언트 Router만으로 HTTP 응답을 정하지 않는다.

LESSON / WILDCARD RULE

본문의 한 줄은 범위가 넓다

Netlify의 /* /index.html 200은 실제 파일이 없으면 앱 밖 경로나 누락 JS·CSS도 HTML 200으로 응답할 수 있다. 이것만으로 위 엄격한 분기가 완성됐다고 판단하지 않는다.

Vite base는 배포 하위 경로의 자산 URL을 조정한다. BrowserRouter의 basename이나 호스트의 깊은 URL 새로고침 규칙을 자동으로 설정하지 않는다. _redirects는 Netlify 방식이므로 다른 호스트는 해당 규칙을 사용한다.

이 예의 조건

  • 원도표의 전체 구조와 설명은 위 관계도와 표에서 유지합니다. 아래 인쇄 표에도 원도표의 관계·조건·라벨·설명·주석을 보존합니다.
  • 두 관찰 칸의 위치는 고정입니다. 관찰 상태는 해당 순간의 값이며, 동작·이유는 그 조건에서의 판정과 변화 원인입니다. 독립 비교와 실패 분기는 별도 조건으로 읽고 모든 분기를 한 요청의 필수 실행 순서로 이어 읽지 않습니다.

관계도의 보충 설명

원도표의 전체 관계·조건·설명
구분내용
전체 관계·조건 설명브라우저 요청에서 존재 파일·허용 앱 경로·누락 자산 또는 앱 밖의 세 결과로 각각 갈라진다. 세 결과를 세로에 놓았지만 서로 이어지는 실행 순서가 아니다. 허용 앱 경로만 HTML과 JS 실행 뒤 Router 매칭으로 이어진다. 같은 다섯 노드와 네 간선이며 엄격한 404는 추가 호스트 정책이다. 본문 wildcard 한 줄만으로 이 정책이 자동 완성되지 않는다.
전체 상태와 변화 근거
장면현재 관찰값설명변화 이유
호스트 요청host: 파일/app/앱 밖 판정 / router: 실행 전브라우저 document 요청이 host에서 분류된다BrowserRouter보다 호스트 응답이 먼저다
응답 경계app: index.html 응답 / 누락 자산: 별도 404 규칙 필요파일은 직접 제공하고 허용 app 경로는 URL 유지 rewrite를 한다단순 wildcard 예제는 엄격한 자산 분리를 완성하지 않는다
router 실행URL: 원 pathname / UI: 매칭 결과받은 문서에서 JS가 pathname을 읽어 화면을 고른다client 화면 선택이 반환 HTTP 상태를 바꾸지 않는다

커스텀 도메인 설정

임의의 Netlify URL 대신 자체 도메인(예: www.myawesomeapp.com)을 연결할 수 있습니다.

Netlify 대시보드에서 해당 사이트를 선택합니다.

Domain settings 탭으로 이동합니다.

Add custom domain 버튼을 클릭하고, 여러분이 소유한 도메인 이름을 입력합니다.

Netlify가 제시하는 DNS 설정(CNAME 또는 A 레코드)을 여러분의 도메인 등록 업체(가비아, GoDaddy 등)에서 적용합니다.

DNS 연결 뒤에는 대시보드에서 인증서 발급 상태와 HTTPS 접속을 확인합니다. 도메인 소유 확인·DNS 오류·현재 플랜 조건 때문에 완료되지 않을 수 있으므로 설정 입력만으로 발급 성공을 단정하지 않습니다.

라우팅 문제 해결 (SPA Fallback)

리액트 SPA는 클라이언트 측 라우팅(예: React Router)을 사용합니다.

즉, /about이나 /products/123처럼 클라이언트 라우터가 소유한 앱 경로는 직접 요청해도 index.html을 받을 수 있어야 합니다. 실제 자산과 API 경로는 별도로 처리합니다.

하지만 웹 서버는 기본적으로 요청된 경로에 해당하는 파일이 없으면 404 Not Found 에러를 반환합니다.

이 문제를 해결하기 위해 Netlify와 같은 정적 호스팅 서비스에서는 리다이렉트 규칙을 설정하여 모든 유효하지 않은 경로 요청을 index.html로 fallback 시키는 기능을 제공합니다.

Netlify에서는 프로젝트의 public 폴더 안에 _redirects 파일을 생성하여 이 규칙을 추가할 수 있습니다.

public/_redirects 파일 생성 (필수)
/* /index.html   200

이 기본 규칙은 실제 배포 파일이 있으면 그 파일을 우선 제공하고, 나머지는 URL을 유지한 채 index.html을 200으로 응답하는 rewrite입니다. 누락된 JS·CSS 요청과 앱 밖 경로도 HTML 200으로 가릴 수 있으므로, 그림의 엄격한 404 분기는 이 한 줄만으로 구현되지 않습니다.

이렇게 하면 React Router가 경로를 처리할 수 있게 됩니다.

주의: 이 파일은 public 폴더에 있어야 빌드 시 dist 폴더로 복사됩니다.


파일 요청과 앱 경로를 따로 확인하기

Netlify rewrite의 공식 설명에서 200 rewrite는 원 URL을 유지한 채 다른 파일 내용을 응답하는 동작입니다. 다른 주소로 브라우저를 이동시키는 3xx redirect와 구별합니다. 위 wildcard는 실제 파일을 우선하는 기본 동작이지만, 파일이 없는 나머지 요청을 모두 앱 HTML로 바꿀 수 있습니다.

예시

배포 HTML이 assets/app.js를 참조하고 라우터에 /about이 있다고 가정합니다. 브라우저 Network에서 다음 네 요청의 URL·상태·Content-Type·첫 응답 내용을 나란히 확인합니다. 파일 이름은 실제 빌드에 맞춰 바꿉니다.

요청확인할 결과결과를 해석할 때의 주의
/assets/app.js실제 JS 파일 내용200이어도 HTML이면 JS를 받은 것이 아니다.
/about 직접 열기앱 HTML을 받은 뒤 About 화면링크 클릭 성공과 서버에 직접 요청한 성공을 구별한다.
/assets/missing.js누락 자산을 구별할 수 있는 응답위 wildcard만 쓰면 HTML 200이 될 수 있다. 엄격한 누락 자산 처리는 추가 정책이다.
/unknown 직접 열기라우터의 없음 화면 또는 서버의 없음 응답SPA의 없음 화면이 보여도 HTTP 상태가 404라는 뜻은 아니다.

이 표는 실제 운영 응답을 이미 확인했다는 보고가 아니라 독자가 수행할 확인 방법입니다. 정적 호스팅은 회원가입 API나 로컬 json-server를 자동으로 실행해 주지 않습니다. API를 쓰는 앱은 브라우저가 접근할 수 있는 별도 API 주소·권한·CORS 조건도 확인합니다.

하위 경로 배포를 독립적으로 판단하기

사이트를 https://example.test/learn/ 아래에 배포했고, 자산 app.js가 /learn/assets/app.js에 있다고 가정합니다. HTML이 /assets/app.js를 요청하면 어디를 찾나요? Vite base를 /learn/에 맞추면 BrowserRouter의 basename과 /learn/about 직접 열기도 자동으로 해결될까요?

자산 URL과 앱 경로의 풀이

슬래시로 시작하는 /assets/app.js는 사이트의 루트인 https://example.test/assets/app.js를 요청합니다. 의도한 /learn/assets/app.js와 다릅니다. base는 빌드 자산 URL을 배포 경로에 맞추는 설정입니다.

BrowserRouter의 앱 경로 기준과 서버의 깊은 경로 rewrite는 별도 설정입니다. base만 바꾼 뒤 모두 해결됐다고 판단하지 않고, HTML의 실제 자산 요청과 /learn/about 직접 열기를 각각 확인합니다. 이 문제의 example.test와 파일 이름은 조건을 설명하기 위한 모형이며 실제 배포 주소가 아닙니다.

기타 정적 호스팅 서비스의 배포 (간략)

다른 주요 정적 호스팅 서비스들도 Netlify와 유사한 배포 과정을 가집니다.

  • Vercel
    • Netlify와 거의 동일한 흐름으로 Git 저장소 연동 및 자동 배포를 지원합니다.
    • vercel CLI 도구를 사용하면 명령줄에서도 쉽게 배포할 수 있습니다. (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를 실행합니다. base는 자산 경로 설정이며 BrowserRouter의 basename이나 GitHub Pages의 깊은 경로 새로고침 문제까지 자동으로 해결하지는 않습니다.
  • Firebase Hosting
    • Firebase CLI를 설치하고 firebase init으로 프로젝트를 초기화한 후, firebase deploy 명령어로 배포합니다.
    • firebase.json 설정 파일에서 public 디렉터리를 dist로, rewrites 규칙을 index.html로 설정하여 SPA 라우팅 문제를 해결합니다.

정적 호스팅에서는 사용자의 URL 요청이 어떤 과정을 거쳐 React Router로 넘어가는지도 함께 이해해야 합니다.


배포 절차 정리와 다음 학습 포인트

이제는 React 앱을 빌드하고, Netlify와 같은 강력하고 편리한 정적 호스팅 서비스를 사용하여 전 세계 사용자에게 배포하는 방법을 익히셨습니다.

  • 정적 호스팅 서비스는 React SPA 배포에 가장 적합한 옵션 중 하나입니다.
  • Netlify 예제에서는 Git 연동 빌드, 출력 폴더, rewrite와 실제 요청을 연결했습니다. 추가 기능과 비용은 사용하는 계정의 현재 조건을 확인합니다.
  • _redirects 파일 설정을 통해 SPA 라우팅 문제를 해결하는 것이 중요합니다.

이제 사용자는 배포된 웹 애플리케이션에 접근해 상호작용할 수 있습니다.