백엔드트러블슈팅

[POP-SPOT] GCP + Nginx + SSL + 도메인 배포 순서 정리

김동현
··4분 읽기

POP-SPOT 백엔드를 GCP에 올리면서 정리한 배포 순서. 도메인 DNS 설정, Nginx 리버스 프록시, SSL 인증서, 소셜 로그인 콘솔 업데이트까지.

GCP에 처음 배포하는 거라 삽질이 꽤 많았음. 그냥 서버 올리면 되는 줄 알았는데 할 게 한가득이었음.

이 글은 처음 배포하는 사람도 따라할 수 있도록 순서대로 정리한 배포 체크리스트임.


전체 흐름

javascript
1. 도메인 구입 + DNS 설정
       ↓
2. GCP 서버 세팅
       ↓
3. Nginx 설치 및 설정
       ↓
4. SSL 인증서 발급 (HTTPS)
       ↓
5. 소셜 로그인 콘솔 주소 변경
       ↓
6. Vercel 환경변수 업데이트
       ↓
7. 서버 백그라운드 실행

STEP 1 — 도메인 + DNS 설정

도메인이 뭔지 모른다면?

도메인은 192.168.0.1 같은 숫자 주소 대신 사람이 읽기 쉬운 이름을 붙인 것. google.com 같은 것. 가비아, 카페24 같은 곳에서 연간 비용을 내고 구입함.

popspot.co.kr 을 구입한 뒤, 프론트와 백엔드 주소를 분리함.

도메인 구입처 관리 페이지에서 DNS 설정 → A 레코드 추가.

javascript
타입:  A
호스트: api
값:    GCP 인스턴스의 고정 외부 IP
TTL:   600

⚠️ 반드시 고정 IP 먼저 설정해야 함

GCP 기본 설정은 임시 IP라서 서버를 껐다 켜면 IP가 바뀜. DNS에 등록한 IP랑 달라지면 접속이 안 됨.

GCP 콘솔 → VPC 네트워크 → 외부 IP 주소 → 고정으로 변경.


STEP 2 — GCP 서버 기본 세팅

e2-micro 인스턴스(RAM 1GB)에 Ubuntu 22.04로 생성 후 SSH 접속.

bash
# 서버에 접속한 뒤 필수 프로그램 설치

sudo apt update

# Java 17 설치 (Spring Boot 실행에 필요)
sudo apt install openjdk-17-jdk -y

# Nginx 설치 (다음 단계에서 사용)
sudo apt install nginx -y

# Certbot 설치 (SSL 인증서 발급 도구)
sudo apt install certbot python3-certbot-nginx -y

용어 정리

sudo — 관리자 권한으로 명령 실행. 윈도우의 "관리자 권한으로 실행"과 같음.

apt — Ubuntu에서 프로그램을 설치하는 명령어. 앱스토어 같은 것.

-y — "설치할 거야? Yes/No" 물어볼 때 자동으로 Yes 선택.


STEP 3 — Nginx 리버스 프록시 설정

Nginx가 왜 필요함?

Spring Boot는 8080번 포트에서 실행됨. 근데 인터넷 표준 HTTPS 포트는 443번. 외부에서 api.popspot.co.kr로 접속하면 443번으로 들어오는데, 이걸 8080으로 전달해주는 중간 다리 역할이 Nginx임.

javascript
외부 요청 (443 포트)
       ↓
    Nginx
       ↓
Spring Boot (8080 포트)
bash
# Nginx 설정 파일 열기
sudo nano /etc/nginx/sites-available/default

아래 내용으로 덮어씀.

javascript
server {
    server_name api.popspot.co.kr;

    location / {
        # 들어온 요청을 8080 포트로 전달
        proxy_pass http://127.0.0.1:8080;

        # 원래 요청 정보 같이 전달 (접속자 IP 등)
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
bash
sudo nginx -t               # 설정 파일 문법 오류 검사
sudo systemctl restart nginx  # Nginx 재시작해서 설정 적용

STEP 4 — SSL 인증서 발급 (HTTPS)

SSL이 뭔지 모른다면?

주소창에 https:// 로 시작하는 사이트를 보면 자물쇠 아이콘이 보임. 이게 SSL이 적용된 것. 데이터를 암호화해서 주고받기 때문에 중간에 누가 훔쳐봐도 내용을 알 수 없음. 요즘은 https가 없으면 브라우저가 "안전하지 않음" 경고를 띄움.

Certbot이 Nginx 설정을 자동으로 수정해주기 때문에 명령어 하나만 치면 됨.

bash
sudo certbot --nginx -d api.popspot.co.kr

실행하면 이메일 입력하고, 약관 동의하고, 마지막에 이런 질문이 나옴.

javascript
Please choose whether or not to redirect HTTP traffic to HTTPS
1: No redirect
2: Redirect (권장)

2번 선택 → http로 접속해도 자동으로 https로 연결됨.

완료되면 Nginx 설정에 443 블록이 자동으로 추가됨. 이제 https://api.popspot.co.kr 접속 가능.


STEP 5 — 소셜 로그인 콘솔 Callback URL 변경

소셜 로그인(구글, 카카오, 네이버)은 로그인 성공 후 "이 주소로 돌아와" 라고 미리 등록한 주소로만 이동함. 주소가 바뀌었으니 콘솔에서도 변경해줘야 함.

구글 — Google Cloud Console → 사용자 인증 정보 → 승인된 리디렉션 URI

카카오 — 카카오 디벨로퍼스 → 앱 → 카카오 로그인 → Redirect URI

네이버 — 네이버 개발자 센터 → 내 애플리케이션 → API 설정

javascript
변경 전: https://임시주소.duckdns.org/login/oauth2/code/kakao
변경 후: https://api.popspot.co.kr/login/oauth2/code/kakao

⚠️ 구글, 카카오, 네이버 셋 다 바꿔야 함. 하나라도 빠지면 그 소셜 로그인만 에러남.


STEP 6 — Vercel 환경변수 업데이트

프론트엔드(Vercel)에서 백엔드 주소를 환경변수로 관리하고 있기 때문에 여기도 바꿔줘야 함.

Vercel 대시보드 → 프로젝트 → Settings → Environment Variables

javascript
NEXT_PUBLIC_API_URL = https://api.popspot.co.kr

변경 후 Redeploy 필수. 환경변수는 배포 시점에 적용되기 때문에 저장만 하면 안 되고 재배포해야 반영됨.


STEP 7 — 서버 백그라운드 실행

Spring Boot jar 파일을 그냥 실행하면 SSH 세션 끊기는 순간 서버도 같이 꺼짐.

nohup 명령어로 백그라운드 실행해야 함.

bash
# 백그라운드로 실행하고 로그는 app.log 파일에 저장
nohup java -jar popspot-backend.jar \
  --spring.profiles.active=prod > app.log 2>&1 &

# 실행 중인지 확인
ps aux | grep popspot

# 서버 종료할 때
pkill -f popspot-backend.jar

nohup이 뭔지 모른다면?

"no hang up"의 줄임말. SSH 접속이 끊겨도 프로그램을 계속 실행하라는 명령어. 전화를 끊어도 음악이 계속 재생되게 하는 것과 같음.

& 는 "백그라운드에서 실행해"라는 뜻. 이걸 붙이지 않으면 터미널이 서버를 실행하는 동안 다른 명령어를 못 씀.


체크리스트 요약