우리는 Vercel로 간다! 프론트엔드 배포 가이드

We Go Vercel !!
We Go Vercel !!

내가 열심히 만든 웹페이지를 세상에 공유못하면 억울하잖아?

대부분의 개발자들은 Visual StudioWebStorm 같은 IDE를 사용해 웹 애플리케이션을 만들고, localhost에서 기능이 잘 돌아가는지 확인합니다.

하지만 이렇게 로컬 환경에만 띄워진 사이트는 오직 본인 컴퓨터에서만 볼 수 있어서, 다른 사람들에게 보여줄 수 없다는 문제가 있습니다.

친구나 동료, 그리고 일반 사용자에게 내 사이트를 공유하려면, 인터넷에 배포해 누구나 접속할 수 있도록 만들어야 합니다.

이전에 제가 UMC라는 동아리에서 Chapter 11. Vercel을 활용해서 내가 만든 웹 사이트 배포하기! 라는 영상 강의로 배포하는 법을 간단하게 설명드렸습니다!

유튜브 구독좀 해주세요..🙏

이번 포스팅은 최근 외부 행사에서 참고 자료로 활용하기 위해 준비했고,

동시에 제 워크북을 보며 학습하시는 분들께도 도움이 되고자 작성했습니다!

또한, 프론트 개발자가 아니더라도 백엔드 개발자가 어드민 페이지를 만드는 경우가 간혹 존재하는데요!

처음에 배포할 때 어려움을 겪을 것 같아 커스텀 도메인을 손쉽게 연결하여

만드신 사이트를 배포할 수 있도록 기존 영상 내용을 보완해 해당 포스팅을 작성했습니다!


그렇다면 프론트엔드 배포가 필요한 이유는 무엇일까요?

우리가 개발한 웹 사이트를 세상에 공개하고 싶다면, 단순히 내 컴퓨터에서 띄워보는 것만으로는 한계가 있습니다. 다른 사람이 내 웹 사이트를 보려면 어딘가 인터넷에 접속 가능한 서버에 웹 사이트 파일들을 올려서 누구든지 주소만 알면 접속할 수 있도록 만들어야 합니다.

이 과정을 우리는 배포(Deployment) 라고 부릅니다.


프론트엔드 배포가 필요한 이유를 정리해보면 다음과 같습니다.

  1. 다른 사람들과 공유하기 위해

    • 개발자뿐만 아니라 사용자, 디자이너, 클라이언트, 친구들에게 내가 만든 사이트를 보여주려면 배포가 필수입니다.

  2. 실제 서비스 환경에서 테스트하기 위해

    • 로컬에서는 잘 동작하던 기능이 실제 인터넷 환경에서는 예상과 다르게 동작할 수 있습니다. 네트워크 속도, 브라우저 호환성, 모바일/PC 환경 등의 실제 상황에서의 동작을 확인하려면 배포가 필요합니다.
    • 특히 Safari와 같이 특정 브라우저에서는 생각보다 많은 문제점을 유발시킵니다!! 실제 배포하거나, 특정 기기 별로 확인을 한 후에 배포를 해야하는 경우가 상당히 많습니다!!

  3. 프로젝트를 실전에 가깝게 운영해보기 위해

    • 배포 경험은 단순히 코딩 실력뿐 아니라, 실무에서의 서비스 운영, 배포 자동화, 버전 관리, 에러 모니터링 등을 익힐 수 있는 좋은 경험이 됩니다.

  4. 포트폴리오/이력서용으로 활용하기 위해

    • 나만의 포트폴리오 사이트나 프로젝트 데모를 배포해두면, 이력서에 URL을 첨부해 실력을 보여줄 수 있습니다.

우리는 Vercel로 간다.

아마존에서 제공하는 S3 + CloudFront 같은 다양한 배포 방법도 있지만, 저희는 **더 쉽고 빠르게 배포할 수 있는 Vercel**을 사용해보겠습니다.

Vercel은 어느 정도까지는 무료로 충분히 사용 가능하고,
손쉽게 배포할 수 있을 뿐만 아니라,
여러분이 구매한 도메인(URL)을 연결하는 것도 아주 간편합니다.

또한, 코드를 수정하고 다시 배포하는 과정도 버튼 몇 번이면 끝이라
복잡하게 배포 환경을 구성할 필요 없이 개발에만 집중할 수 있는 점이 큰 장점입니다.


Vercel을 활용한 프로젝트 배포 가이드

프로젝트를 Vercel에 배포하면, 별도의 서버 관리 없이도 간단하게 정적 사이트나 프론트엔드 애플리케이션을 호스팅할 수 있습니다.

여기서는 로컬에서 작성한 코드를 GitHub에 올리고, Vercel CLI를 이용해 배포하는 과정을 단계별로 정리합니다.

🚨 주의 사항

  1. 프로젝트 루트(프로젝트 폴더 최상위 경로)에서 모든 명령어가 실행된다고 가정합니다.

  2. .env 파일 등 민감 정보가 담긴 환경 변수 파일은 절대 GitHub에 업로드하지 않습니다.


1. 준비 단계: GitHub에 레포지토리 생성하기

  1. 프로젝트를 Git 초기화

    cd /path/to/your/project
    git init
    git add .
    git commit -m "Initial commit"bash

  2. GitHub에서 새 레포지토리 생성

    • GitHub 웹사이트에서 ‘New Repository’ 버튼을 클릭합니다.

    • 레포지토리 이름(예: my-app)을 입력하고, 적절히 공개/비공개 여부를 선택합니다.

    • 로컬 레포지토리와 연결할 원격 레포 URL을 복사합니다.


  3. 로컬 레포지토리에 원격 추가 후 푸시

    git remote add origin https://github.com/your-username/my-app.git
    git branch -M main        # 기본 브랜치를 main으로 사용할 경우
    git push -u origin mainbash

  4. .env 같은 환경 변수 파일은 절대 담지 않도록 .gitignore에 추가하세요.

    # .gitignore 예시
    node_modules/
    .env
    
    등등...


2. Vercel 설치 및 로그인

배포를 위해서는 Vercel CLI를 설치하고, 계정에 로그인해야 합니다.

Vercel CLI 글로벌 설치

npm install -g vercelbash

또는 yarn global add vercel, pnpm add -g vercel , bun i -g vercel등 원하는 패키지 매니저를 사용해도 됩니다.

Vercel 계정으로 로그인

→ 미리 Vercel 사이트에 들어가 회원가입을 하시면 저와 같이 동일하게 진행하실 수 있습니다!

vercel loginbash
  • 명령을 입력하면 다음과 같은 선택지가 나옵니다.

    // 여러분들의 맞는 로그인 방식으로 진행해주시고
    // 만약 계정이 없으시다면, 회원가입을 진행해주시면 됩니다.
    // 저는 깃허브로 로그인 해서 해당 부분을 체크하겠습니다.
    // 키보드 화살표 위 아래로 선택할 수 있습니다.
    Vercel CLI 41.7.0
    ? Log in to Vercel (Use arrow keys)
    Continue with GitHub           // ✅
      Continue with GitLab
      Continue with Bitbucket
      Continue with Email
      Continue with SAML Single Sign-On
    
    ? Log in to Vercel Continue with GitHub
    > Success! GitHub authentication complete for dydals3440@gmail.com // 여러분들 이메일
    Congratulations! You are now logged in. In order to deploy something, run `vercel`.
    💡  Connect your Git Repositories to deploy every branch push automatically (https://vercel.link/git).tsx
  • Continue with GitHub 등 여러분들이 만든 선택해 로그인 과정을 완료하세요.

  • 로그인이 성공하면 “Success! GitHub authentication complete for your-email@example.com” 메시지가 표시됩니다.


3. 프로젝트 초기 설정 및 Preview 배포

이제 로컬 프로젝트를 Vercel에 연결하고, Preview 환경(미리보기)으로 배포해 보겠습니다.

  1. vercel 명령어 실행
vercelshell

처음 실행하면 다음과 같이 묻습니다.

? Set up and deploy “~/deploy-vercel”? (Y/n) // Y 입력 후 Enter
  • 기본값 Y를 그대로 사용하고 Enter를 누릅니다.

Scope(팀 또는 개인 사용자)를 선택

? Which scope should contain your project? (Use arrow keys)
여러분들아이디's projects                 // 파란글씨 Entertsx

개인 프로젝트라면 your-username’s projects를 선택합니다.

팀 프로젝트면 팀 프로젝트명을 선택하시면 됩니다.

기존 프로젝트와 연결할지 묻는 단계

// 여러분들은 지금 레포를 연결하지 않았으므로 N 후 Enter 입니다.
// 만약 레포지토리를 사이트를 통해서 미리 연결했으면 y를 진행 후 해당 레포지토리를 연결해주시면 됩니다.
? Link to existing project? (y/N)  // N 입력 후 Entertsx
  • GitHub에 미리 Vercel을 연동하지 않았으면 N을 입력하고 Enter를 누릅니다.
  • 이미 프로젝트를 Vercel에 연결한 상태라면 y를 선택해 해당 레포지토리를 연결할 수 있습니다.

프로젝트 이름 입력

// ()안에있는게 기본 이름이고 바꾸고 싶으면 변경하셔도 좋습니다.
// 단 프로젝트 이름은 아래 조건이 맞아야 하니 유의해주세요
// Project names can be up to 100 characters long and must be lowercase. They can include letters, digits, and the following characters: '.', '_', '-'. However, they cannot contain the sequence '---'. (400)
? Whats your projects name? (deploy-vercel)  // ohtani라고 저는 이름 변경후 Entertsx
  • 기본값으로 제안되는 이름을 사용하거나, 영문 소문자, 숫자, ., _, 만 포함하도록 직접 지정할 수 있습니다.
  • 프로젝트 이름은 최대 100자까지 가능하며, 연속으로 --은 포함할 수 없습니다.

코드가 위치한 디렉터리

// (./)는 현재 프로젝트 루트를의미합니다. 맞으니 Enter
? In which directory is your code located? ./tsx
  • 보통 ./ 그대로 두고 Enter를 눌러 프로젝트 루트를 지정합니다.

자동 감지된 설정 확인

Vite, Next.js, Nuxt.js 등 특정 프레임워크라면 Vercel이 기본 빌드/실행 명령을 자동으로 감지해서 보여줍니다.

// 바꾸지 않을겁니다. N 입력 후 Enter
Local settings detected in vercel.json:
Auto-detected Project Settings (Vite):
- Build Command: vite build
- Development Command: vite --port $PORT
- Install Command: `yarn install`, `pnpm install`, `npm install`, or `bun install`
- Output Directory: dist
? Want to modify these settings? (y/N) // N 입력 후 Entertsx
  • 별도 설정이 필요 없으면 N을 입력하고 Enter를 눌러 넘어갑니다.

Preview 환경 배포 완료

설정이 끝나면 아래와 같이 Preview(deploy preview) URL이 반환됩니다.

Vercel CLI 41.7.0
🔍  Inspect: https://vercel.com/dydals3440s-projects/ohtani/2V16YYxwLyp55YKZ2mQ7RfsfFSDG [2s]
✅  Preview: https://ohtani-r06wspu21-dydals3440s-projects.vercel.app [2s]
📝  To deploy to production (ohtani-seven.vercel.app), run `vercel --prod`
  • Preview: https://ohtani-r06wspu21-dydals3440s-projects.vercel.app 주소를 브라우저에 입력하면, 로그인된 Vercel 계정일 때만 실제 배포된 페이지를 확인할 수 있습니다.
  • 주의: 아직 Production(실제 서비스) 환경이 아니기 때문에, 위 URL은 Vercel 인증을 거친 사용자만 접근이 가능합니다.

4. Production(실서비스) 배포

Preview 환경이 정상적으로 동작하는 것을 확인했다면, 이제 실제 서비스용 URL을 생성하기 위해 --prod 옵션을 사용합니다.

vercel --prodtsx

배포가 성공하면 콘솔에 다음과 같은 메시지가 나옵니다.

Vercel CLI 41.7.0
🔍  Inspect: https://vercel.com/your-username/projects/project-name/hijklmn67890 [800ms]
✅  Production: https://project-name-uvw456.vercel.app [800ms]

이제 실제 배포된 URL을 확인해보겠습니다.

vercel을 로그인 한 후, 여러분들의 대시보드 페이지로 와주시면 됩니다.

Vercel Dashboard 페이지
Vercel Dashboard 페이지

Deployments 탭에 들어가시면 여러분들이 Production에 이제 배포했음을 확인할 수 있습니다.

클릭해서 들어가보시면 Deployment Details를 아래와 같이 확인할 수 있습니다.

Vercel Deployment Details 페이지
Vercel Deployment Details 페이지

빨간색으로 밑줄 그은 URL을 통해 접속하시면
어떠한 기기에서도 자유롭게 만드신 사이트를 공유받을 수 있습니다!


5. 환경변수는 어떻게 넣어주나요??

프로젝트를 배포할 때, API 키나 비밀 토큰 같은 값을 코드에 직접 적어두면 보안상 위험해요.
그래서 이런 값들은 환경변수(Environment Variables)로 따로 관리하는 게 원칙이에요.

그러나 우리는 .env, .env.local과 같은 파일에 환경변수를 넣고 실제로 이를 깃허브에 올리지 않습니다. 그리고 실제로 환경변수를 활용하는 코드는 당연히 현재 배포된 사이트에서는 값을 알 수 없으니 동작하지 않겠죠.

우리 사이트에서 환경변수를 쓰는 코드가 아래와 같이 있다고 가정해봅시다.

// .env
VITE_API_URL=https://ohtani.example.comtsx

해당 환경변수를 만약 아래와 같이 사용하고 있다면

// src/libs/axiosClient.ts
import axios from 'axios';

const api = axios.create({
  // 배포된 사이트는 이 값을 알 수 없어요 ㅠㅠ
  baseURL: import.meta.env.VITE_API_URL,
  headers: {
    'Content-Type': 'application/json',
  },
});

export default api;tsx

당연히 모든 api 통신은 동작하지 않을 것 입니다.

Vercel에서는 프로젝트 설정에서 간단하게 환경변수를 등록하고, 코드에서 그 값을 사용할 수 있습니다.

  1. 대시보드로 간 후 여러분들의 프로젝트 명을 클릭해주세요 (ohtani)

    첫번째. 프로젝트 명을 클릭해주세요
    첫번째. 프로젝트 명을 클릭해주세요

  2. 그 후 settings를 클릭해주세요.

    두번째. 프로젝트 명을 클릭해주세요
    두번째. 프로젝트 명을 클릭해주세요

  3. Environment Variables 탭에서 여러분들의 환경변수 keyvalue에 맞게 값을 넣어주셔도 되고 많은 경우 그냥 .env 파일자체를 첨부하셔도 좋습니다. 그 이후 save를 해주세요.

    세번쨰. 환경 변수 첨부
    세번쨰. 환경 변수 첨부

vercel도 여러분이 반영한 키에 대해서 알아야하므로 Save후에 파란색 팝업이 나오는데 Redeploy를 눌러주시면 됩니다.

vercelshell
vercel --prodshell

혹시라도 못 누르셨다면 그냥 다시 명령어를 통해 배포를 진행해주셔도 상관없습니다.


6. 어.. 내 다른 페이지는 왜 안나오지..?

여러분들의 홈페이지는 보통 하나의 페이지만 있는 것이 아닌, 여러개의 페이지가 있을 겁니다.

예를들어 저의 개인 블로그 같은 경우는 여러개의 페이지가 존재합니다.

정말 많은 페이지로 구성되어있습니다. 여러분들이 next.jsastro, remix와 같은 SSR 기반 사이트를 만드셨다면 4번까지만 하셔도 충분히 배포가 되셨을 것이라고 믿어 의심치 않습니다.

하지만 지금 React와 같은 SPA 기반 웹사이트 같은 경우 보통은 react-router를 활용하거나, tanstack-router를 활용하여 여러개의 페이지를 구성하게 됩니다.

import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import './App.css';
import HomePage from './pages/HomePage';
import BaseballPage from './pages/BaseballPage';

const router = createBrowserRouter([
  {
    path: '/',
    element: <HomePage />,
  },
  {
    path: '/baseball',
    element: <BaseballPage />,
  },
]);

function App() {
  return <RouterProvider router={router} />;
}

export default App;tsx

지금 제가 블로그 게시글 작성을 위해 만든 예제 사이트는 react-router-dom을 활용하여 두개의 경로로 접근할 수 있는 페이지로 구성되어있습니다.

실제로 배포 했을 떄 / 루트 경로의 홈페이지는 아래 이미지와 같이 의도한대로 잘 보이게 됩니다.

홈페이지는 의도한대로 잘 나오군..!
홈페이지는 의도한대로 잘 나오군..!

하지만 /baseball 페이지는 실제로 개발환경에서는 잘 보이나 배포된 환경에서는 보이지 않습니다.

어라라..! 왜.. 이건
어라라..! 왜.. 이건


이러한 문제가 발생하는 이유는 아래와 같습니다.

React, Vue 같은 SPA(Single Page Application)에서는 클라이언트 측 라우팅을 사용해 페이지를 이동합니다.

즉 사용자가 /baseball 페이지를 이동해도 실제로는 서버에 별도의 /baseball.html 파일이 있는 것이 아니라, 항상 index.html 하나를 로드하고, 자바스크립트가 URL에 따라 화면을 바꿔주는 구조입니다!!

(SPA의 동작 방식이죠!)

그런데 이것을 Vercel 같은 정적 호스팅 서비스에 배포를 하면 문제가 생깁니다.


🕵️‍♀️ 사건의 재구성

  • /로 접속 → 잘 동작
  • /baseball으로 직접 접속 (새로고침) → 404 에러

왜냐하면 서버는 /baseball 이라는 실제 파일이나 디렉토리를 찾으려다가 없으니까 404를 반환합니다.

SPA는 이러한 경우에도 무조건 index.html을 불러주고, 클라이언트 라우터가 화면을 다시 그려줘야 정상인데 서버가 이것을 모르니 문제가 됩니다.


✅ 해결 방법: vercel.json 설정

감사하게도 vercel은 이러한 부분을 쉽게 해결할 수 있도록 해결 방법을 공식문서에 제공해주었습니다.

프로젝트의 루트에 vercel.json 파일을 만들어줍니다.

나의 루트 파일
나의 루트 파일

그 후 정규표현식을 활용한 약간의 코드를 작성해줄 것입니다.

// vervcel.json
{
  "routes": [
    {
      "src": "/[^.]+",
      "dest": "/index.html",
      "status": 200
    }
  ]
}tsx
  • src: "/[^.]+"
    👉 .(점)이 없는 경로를 모두 잡아요. 즉, /about, /contact 같은 경로는 잡히고, /favicon.ico, /bundle.js 같은 파일 요청은 무시해요.


  • dest: "/index.html"
    👉 이렇게 걸린 경로는 전부 index.html을 반환해요.


  • status: 200
    👉 정상 응답 상태로 보내줍니다.


위와 같이 동작하고 다시 배포를 진행해봅시다.

vercelshell
vercel --prodshell

두개의 명령어를 순서대로 친 후 배포에 성공했으면

아래와 같이 /baseball 경로에서도 제대로 동작함을 확인할 수 있습니다.

야호! 🍠
야호! 🍠


7. 내 URL만 못생긴 점에 대해서..

여러분들이 보시는 저의 블로그는 여러분들의 URL과 다르게 못생기지 않았습니다.

부럽죠?

이렇게 할 수 있는 방법은 없습니다.. 라고 하기에는
제 블로그는 이미 yolog.co.kr 이라는 도메인을 구매해서 사용하고 있습니다.

vercel은 특히나 커스텀 도메인을 손쉽게 연결할 수 있습니다.

순서대로 잘 진행하셨으면
이제 여러분들은 아래 도메인 탭이 어디에 있는지 아실겁니다!

Domains 탭에 들어간 후

도메인 탭 들어가기
도메인 탭 들어가기

Add Domain 버튼 클릭 이후
여러분들이 가비아나, GoDaddy 등을 통해
URL을 구매한 후 해당 도메인을 입력해줍니다.

도메인 입력하기
도메인 입력하기

그 후 다시 Add Domain을 눌러주세요.

도메인 추가하기
도메인 추가하기

별다른 설정없이 일단은 Save를 진행하겠습니다.

도메인 저장하기
도메인 저장하기

이렇게 이제 A 레코드와, CNAME 레코드를 주게 되는데
해당 값을 이제 해당 도메인을 구매한 곳에서 DNS 레코드 설정을 해주시면 됩니다.

저는 가비아에서 구매해서 DNS 설정을 여기서 했습니다!
저는 가비아에서 구매해서 DNS 설정을 여기서 했습니다!

  • A Record
    → 도메인 주소를 IP 주소로 연결
    예: yolog.co.kr → 123.45.67.89
  • CNAME Record
    → 도메인을 다른 도메인으로 연결
    예: www.yolog.co.kr → yolog.vercel.app

조금만 기다려주시면 아래와 같이 모든 것들이 Configured Correctly 라고 나오면서

여러분들이 구매한 Url로 만드신 사이트에 접속할 수 있습니다.

짜잔 ✨
짜잔 ✨

이제 실제로 여러분들이 구매하신 도메인으로 접속이 가능합니다!

배포 성공한 URL을 신중히 보셔야 합니다 ✨
배포 성공한 URL을 신중히 보셔야 합니다 ✨


8. 마무리

앞으로 프로젝트를 진행하면서 새로운 기능을 추가하거나 디자인을 수정했다면,
변경 사항을 커밋한 뒤 vercel 또는 vercel --prod 명령 한 번으로 즉시 배포할 수 있으니 꼭 활용해 보세요.

위 과정을 통해 별도의 서버 구성 없이도 Vercel만으로 쉽고 빠르게 웹사이트를 배포할 수 있습니다.
특히 GitHub 연동을 해두고 CI/CD 파이프라인을 구축하시면

브랜치 푸시만으로 테스트 코드, 린트 검증 후 배포(Pull Request Preview, Production 배포 등)가 가능해져 개발 안정성과 효율이 더욱 높아집니다.

해당 부분은 추후에 추가 포스팅을 해도록 하겠습니다!