
💡 프로젝트의 마지막 관문 배포입니다.
첫 개발 프로젝트를 하는 과정에서 배포에서 특히 많은 어려움이 있었어요! 배포와 관련한 많은 자료들을 보았지만, 정말 정말 초심자의 입장에서는 이해하기 쉽지 않았습니다..
대부분 "다른 분들이 삽질하지 않았으면 하는 마음에.. "라는 느낌으로 정말 세세하게 알려주셨지만 그런 것조차 이해하지 못하는 초보였습니다. ༼ ◉_◔༽
그런 분들의 위해서, 같은 초보자의 입장에서 배포에 대해서 다뤄보겠습니다.
+ 배포의 방식은 사람들마다 다 다르게 되어있습니다! 그래서 더 어려웠던 것 같아요.
그런 부분들에 대해서도 구체적으로 다루어 보겠습니다.
개요 : VPC 및 AWS를 이해하기 위한 기본 -> EC2 서버 띄우기 -> RDS 구축 -> 무중단 배포 CI/CD -> 도메인 구매 -> Route53 연결 -> HTTPS 추가 -> 블루 그린 무중단 배포
... 까지 진행해 보겠습니다.
📌 배포란 무엇일까요?

개발 프로젝트의 시작점은 보통 인텔리제에서 Spring Application을 만듭니다. 또 이걸 localhost에서 테스트를 하면서 개발을 진행하게 되는데요.. 결국 중요한 점은 나뿐만 아니라 다른 사람들도 쓸 수 있도록 만들어야 합니다. 당연하게도 결국 다른 사람들도 내가 만든 어플리케이션에 접속을 할 수가 있어야 프로젝트를 보여주거나 할 수 있잖아요? 이 과정이 바로 배포입니다.
이렇게 외부로 배포를 할 수 있는 선택지는 크게 두 가지가 있습니다.
✅ 온프레미스(On-Premises) 또는 자체 서버 호스팅
AWS와 같은 클라우드 서비스를 사용하지 않고, 컴퓨터 하나를 서버로 만들어 애플리케이션을 배포하는 방식을 일반적으로 온프레미스(On-Premises) 방식 또는 자체 서버 호스팅이라고 합니다.
이 방식은 직접 서버를 관리하고 네트워크를 설정하여 애플리케이션을 실행하는 것을 의미합니다.
AWS는 선택에 따라서 과금이 발생할 수도 있기 때문에 집에 남아도는 노트북이 하나 있고 24시간 꺼지지 않고 계속 구동시킬 수 있다면 이 방법도 사용할 수 있습니다.
당연하게도 추천드리지는.. 않습니다.
✅ 클라우드 서버
AWS처럼 클라우드에 서버를 열어두고 배포를 하고자 하는 애플리케이션을 해당 서버에 올려서 WAS를 실행시키는 방식입니다.
대부분 배포할 때 AWS를 이용하기 때문에 저 역시 AWS로 진행해 보겠습니다.
📌 AWS 구조
- 우선 프리티어 계정을 만들어 주세요! (혹시 팀원들과 사용할 거라면 Gmail을 하나 만들어서 하는 것도..? 괜찮습니다.)
계정을 만드는 과정은 크게 설명할 부분이 없어서 생략하겠습니다. - 간략하게 개요만 설명하겠습니다.
✅ 리전 (Region)

리전은 이름처럼 직관적으로 서버의 물리적인 위치를 의미합니다.
이렇게 나누어둔 이유는 다음과 같습니다.
- 네트워크 속도의 문제 (멀면 느리니까요~)
- 재해에 대비하는 이유 ( 하나의 서버가 문제가 생겨도 괜찮도록 분산)
- 나라마다 데이터와 관련된 법률이 다르다.
✅ 가용영역 (Availibility Zone)
리전은 지리적인 위치입니다. 가용영역(AZ)는 각 리전 내부에 있는 데이터 센터 정도로 이해하면 편합니다.
- 서울이 가용 영역이 3개라고 한다면... 서울-A, 서울-B, 그리고 서울-C 이정도로 나누어 놓은 정도라고만 이해하시면 됩니다..
기본적으로 AWS의 각 리전 안에는 2개 이상의 가용영역을 가지도록 하고 있습니다.

하지만, 가용 영역이 정확히 데이터 센터를 대변하는 것은 아닙니다.
유저 A와 B가 AZ-A 가용영역을 같이 사용한다고 해도 정확히 둘의 데이터가 같은 데이터 센터에 저장되지 않을 수도 있습니다.
이건 무작위로 유저마다 다르게 정해지게 됩니다.
이는 트래픽 통제와 보안과 관련되어 있습니다.
- 보안 : 다른 사람들이 특정 유저의 데이터가 정확히 어떤 데이터 센터에 저장되는지 특정하기 어려우니까 당연히 보안이 올라가겠죠..?
- 트래픽 분산 : 모든 데이터 센터에 데이터가 골고루 저장되도록 분산해줄 수 있습니다. 특정 가용 영역에 트래픽이 몰릴 수도 있으니까요..
정리하면, AWS는 특정 지역마다 서버가 따로 있고 그 안에도 서버가 분산되어 있다~ (게임이랑 비슷하죠..?)

AWS에 들어오게 되면 다음과 같은 메인 화면이 있는데 사진의 메뉴바가 리전입니다. 일반적인 경우 서울을 사용하시면 됩니다!
📌 AWS 기본 설정
AWS에 처음 들어오게 된다면 자동으로 기본 리소스(ex VPC)가 설정되며 루트(Root) 유저로 로그인 됩니다. 루트 유저는 관리자 느낌의 계정이고 다음과 같은 특징을 가지고 있어요!
- 모든 권한을 자동으로 가지고 있고 생성한 이메일로 로그인이 됩니다.
- 일반적으로 관리용으로만 사용됩니다. ( 계정 설정 변경 , 빌링 )
- AWS API를 호출할 수 없습니다.
보통 프로젝트를 하게 되면 여러 팀원들이 AWS에 접속을 해야하는 경우가 많이 있습니다. 루트 계정을 통해서 IAM 계정을 만들고 이 계정들을 팀원들에게 분배해 줄 수 있습니다. IAM 계정의 특징은 다음과 같습니다.
- 기본 권한이 따로 없고 루트 계정으로 부터 부여 받아야 합니다.
- AWS API를 호출할 수 있습니다.
따라서, Root 계정에서 IAM 계정을 만드는 과정을 진행 해보겠습니다.

- 우선 AWS로 로그인 한 후, 오른쪽 위 메뉴바에서 이름을 누르고 > 보안 자격 증명으로 들어가주세요.

- 여기서 멀티 팩터 인증(MFA) 에서 MFA 디바이스 할당을 눌러주세요.

- 이름은 자유롭게 설정해주시고 > 인증 관리자 앱을 눌러주세요. (디바이스명이 중복되면 안되는 것 같아요.. )
Root 계정은 관리자 계정이기 때문에 MFA라는 보안 OTP를 필수적으로 사용하도록 권장하고 있어요! 저는 핸드폰에 Google Authentication을 설치하고 이것으로 OTP인증을 진행하도록 하겠습니다. (설치해주세요!)

- 들어오게 돼면 다음과 같이 QR 코드를 스캔하라고 하는데, Google Authentication에서 스캔하게 되면 60초마다 숫자가 계속 바뀌면서 앱에 뜨게 됩니다.
- 그 숫자를 두 번 써주면 됩니다. MFA 코드 1에 써주고 60초 뒤에 바뀐 숫자를 MFA 코드 2에 써줍니다.
- QR은 컴퓨터에 다른 이름으로 저장해 두시는 것을 추천합니다. 핸드폰을 잃어버리면 AWS에 접속할 수 없고 복구하기도 정말 힘들거든요...

- 다음으로 왼쪽 메뉴에 대시보드를 눌러주세요.

- 계정 별칭을 생성해 주도록 하겠습니다. 별칭을 만들어 놓으면 나중에 계정 ID가 아닌 별칭으로 로그인이 가능합니다! ( 계정 ID 숫자를 이용해서 로그인 한다고 생각하면 불편하겠죠..?)

- 별칭은 자유롭게 만들어 주시면 됩니다..

- 다음으로 IAM 사용자를 만들어 주도록 합시다.

- 사용자 생성을 눌러주세요.

- 다음과 같이 설정하고 사용자 지정 암호를 설정해 주세요. 맨 아래 "사용자는 다음 로그인 시 새 암호를 생성해야 합니다"를 체크 하게 되면 로그인시 암호 변경을 할 수 있게 됩니다. 이는 팀원들에게 ID를 만들어 줘야 하는 경우 사용하면 좋습니다, 지금은 직접 사용할 것이기 때문에 체크 해제 해주겠습니다.

- 직접 정책 연결에서 AdministratorAccess( 빌링을 제외한 모든 권한)을 준 상태에서 다음으로 넘어가겠습니다.

- 별도의 태그는 설정 해주지 않겠습니다. 그리고 완료해주세요!

- 성공적으로 생성이 완료되었습니다. AWS API AccessKey가 필요하다면 추가적으로 만들수도 있지만 우선 넘어가겠습니다!

- 이제 로그아웃을 진행하고 아까 만들었던 별칭, IAM username, 그리고 비밀번호를 이용해서 로그인 해주세요!

- 들어오셔서 루트 계정에 해주었던 MFA 등록을 똑같이 해주세요! (생략) 앞으로는 Root 계정이 아닌 IAM 계정을 사용하겠습니다.
- 참고로 IAM 계정의 QR은 너무 철저하게 관리할 필요는 없습니다. 잃어버리면 삭제하고 다시 만들어도 됩니다..
❗IAM에는 훨씬 더 많은 기능이 있습니다.
- 구체적인 권한 설정 ex) 몇시에 회사 IP만 EC2에 접속 가능
- 사용자 그룹 설정 (그룹 별로 묶어서 권한 설정)
- 역할 (Role)설정
이런게 있다 ~ 라고 참고만 하시고 넘어가 주세요.
📌 AWS를 통해서 서버를 구축하기
❗ 프리 티어 사용 시 꼭 알아야 할 주의 사항
- 인스턴스 개수 관리
- 한 번에 단 하나의 인스턴스만 실행해야 합니다.
- 두 개 이상의 인스턴스를 동시에 실행하면 사용 시간이 합산되어, 한도를 초과할 수 있습니다.
- 프리 티어 대상 인스턴스 확인
- t2.micro 등 프리 티어에 포함된 인스턴스 유형을 선택하세요.
- 만약 다른 인스턴스 유형을 사용하면, 무료 혜택을 받지 못하고 비용이 발생할 수 있습니다.
- 12개월 제한
- 프리 티어 혜택은 계정 생성 후 12개월 동안만 제공됩니다.
- 12개월이 지나면 사용한 리소스에 대해 정상 요금이 부과됩니다. -> 새로운 구글 계정을 또 만들면 되겠죠..?
✅ 어떤 도구를 사용하지?
1. AWS Elastic Beanstalk (EB)
- 특징:
EB는 서버 설정, 로드 밸런싱, 스케일링 등을 자동으로 관리하여 간편하게 배포할 수 있는 서비스입니다. - 장점:
- 복잡한 설정 없이 빠르게 배포가 가능하며, 관리 작업을 최소화할 수 있습니다.
- 단점:
- 세부적인 서버 설정을 직접 제어하기 어렵고, 특정 요구사항을 반영하기에는 유연성이 부족할 수 있습니다.
2. Amazon ECS (Elastic Container Service)
- 특징:
ECS는 컨테이너 기반으로 애플리케이션을 배포하고 관리할 수 있는 서비스입니다. - 장점:
- Kubernetes보다 간단한 설정으로 컨테이너를 관리할 수 있으며, 유연성과 성능이 뛰어납니다.
- 단점:
- 컨테이너 개념과 구조에 대한 사전 지식이 필요하며, 설정 및 운영이 다소 복잡할 수 있습니다.
3. Amazon EKS (Elastic Kubernetes Service)
- 특징:
Kubernetes를 기반으로 대규모 애플리케이션 배포를 지원하는 서비스입니다. - 장점:
- 자동화된 컨테이너 관리 및 높은 확장성을 제공하여 대규모 시스템에 적합합니다.
- 단점:
- Kubernetes 자체의 복잡성으로 인해 초기 설정과 학습 곡선이 가파릅니다.
- 소규모 프로젝트에서는 과도한 비용과 불필요한 복잡성을 초래할 수 있습니다.
🤔 초보자 입장에서는 무엇을 골라야 할지 감이 전혀 오지 않습니다.
비용적인 문제들과 배포 과정을 직접적으로 경험할 수 있는 EC2를 사용할 것입니다.
그냥 "EC2라는 것이 나의 어플리케이션(WAS)를 돌려주는 서버(컴퓨터) 구나"라고만 생각하고 우선 넘어가셔도 좋을 것 같아요.
이제 본격적으로 시작하기에 앞서서 실습을 이해하기 위한 필수적인 포스트를 따로 정리를 해두었습니다.
❗❗꼭 숙지하시길 바랍니다 ㅠㅠ
VPC에 대한 정리까지 읽으신 후 Private VPC와 Public VPC를 만들어주시고 돌아오시면 됩니다. 🔗
✅ EC2 서버를 띄워보자

- 항상 시작하면 region이 시드니가 되어 있는 것 같아요. 서울로 바꿔주세요.
- 그 후에 위의 검색창에 EC2를 검색해 주세요.

- 인스턴스 시작을 눌러주세요.

- 말 그대로 내 인스턴스(서버)의 이름을 지어주는 과정입니다.
- 인스턴스 시작을 눌러 줍니다.
- 이름 : 원하는 것으로 지으시면 됩니다. 저는 Practice-App으로 하겠습니다

- 인스턴스를 시작하는 데 필요한 소프트웨어 구성(운영체제, 어플리케이션서버, 어플리케이션)들을 선택하는 과정이에요.
- 어플리케이션 및 OS 이미지 : Ubuntu를 골라주세요.
- 프리티어로 사용가능하다면 다른 것도 상관없지만 저는 Ubuntu를 기준으로 진행할 예정입니다!

- 서버의 CPU와 메모리를 골라주는 단계입니다.
- 인스턴스 유형 : t2.micro 를 선택해 주세요 (프리 티어 사용가능 확인)

- 서버에 접속할 수 있는 인증 키를 발급하는 단계입니다.
- 키페어 : 다음과 같이 이름은 자유롭게 생성해서 보관해 주시면 되겠습니다. (열쇠 같은 용도로 쓰이니 잊어버리면 안 됨)

- VPC 정리글에서 만들었던 VPC를 선택하고 서브넷은 Public 서브넷을 만들었던 것으로 선택해주세요.
- Public IP 자동 할당을 활성화 해주세요. ( 외부와 연결이 되는 Ec2 이므로 Public IP가 필요합니다).
- 보안그룹은 생성해주고 이름과 설명은 자유롭게 설정해주세요

- 다음과 같이 보안그룹 규칙을 추가해주세요.

- 스토리지의 구성을 설정하는 단계입니다.
- 스토리지는 30GiB까지 가능하다고 하니.. 30까지 써주도록 하겠습니다!
- 전부 완료하고 인스턴스 생성을 눌러주세요.

- 다 만들어 주시면 인스턴스가 만들어져 있는 것을 확인할 수 있습니다!
🤔 여기까지! AWS의 클라우드에 나만의 인스턴스를 띄우는 것을 성공했습니다.
-> 내 어플리케이션을 돌려줄 서버를 만들어 주었다고 이해하시면 됩니다.
✅ EC2 접속
EC2에 접속을 할 수 있어야 합니다. 저는 두 가지를 알려드리겠습니다.

첫 번째로 AWS API입니다. EC2> 인스턴스로 들어가서 연결을 눌러주세요. ( 사진 경로와는 좀 달라 보이는데 뒤로 가기를 누르면 저렇게 버그처럼 다르게 보이더라고요. 실제로는 보안그룹이 아닙니다.)

그다음 그냥 연결을 눌러주시면 됩니다.
- 쉽기도 하고 저는 이 방법을 선호하는 것 같습니다. 인텔리제이로 하는 것도 괜찮지만, 메모리 초과로 서버가 터지면 한동안 접속이 안 되는 경우가 있는데(1분 정도..?).. 그때 이 방법이 재접속이 제일 안정적으로 되는 것 같아요.

다음으로 SSH 클라이언트입니다. 인텔리제이 터미널에서 접속하는 방법인데요.. 매번 해당 코드를 칠 수는 없으니 인텔리제이에 서버와 인증을 등록해 두도록 하겠습니다.

Tools> Deployment > Configuration

+ 누르고 > SFTP 생성

SSH configuration 옆에... 클릭

HOST : 공용 IP
USERNAME : ubuntu
Authentication Type: Key pair
Private Key File : Ec2 생성 시 만들어 놓았던 pem을 등록해 줍시다.
Test Connection을 누르고 성공이 뜨면 된 겁니다. Apply를 누르고 OK
나와서도 Test Connection이 하나 더 있는데요. 그것 역시 성공하는지 확인하시고 최종적으로 나오시면 됩니다.

아래 EC2 서버에 연결되는 터미널이 열렸어요!
언제든지 아래 토글을 누르고 ubuntu를 클릭하시면 Ec2로 연결되는 터미널을 열 수 있습니다.
이제 진짜로 설정을 해보죠.. (;´Д`);
✅ 자바 설치하기
ubuntu 터미널에서 실행해 주시면 됩니다.
sudo apt update
sudo apt install openjdk-17-jdk
설치가 완료되면 Java 버전을 확인합니다:
# Java 버전 확인
java -version
✅ 스왑 메모리 설정
EC2 t2.micro와 같은 프리티어 인스턴스는 메모리(RAM)가 1GB 미만으로 제한되어 있기 때문에 서버가 죽는 경우가 종종 있습니다.
스왑 메모리를 설정하면 물리적 메모리가 부족할 때 디스크를 사용해 메모리를 보충해 주므로, 서버가 안정적으로 동작할 수 있습니다.
스왑 메모리(Swap Memory)는 운영체제에서 물리적인 메모리(RAM)가 부족할 때, 디스크 공간을 사용하여 추가 메모리처럼 활용하는 기술을 의미합니다. 주로 리눅스와 유닉스 계열 시스템에서 사용됩니다.
sudo fallocate -l 2G /swapfile # 2GB 크기의 스왑 파일을 생성합니다.
sudo chmod 600 /swapfile # 스왑 파일의 권한을 설정(root 사용자만 읽고 쓰는게 가능합니다)
sudo mkswap /swapfile # 생성한 파일을 스왑 영역으로 초기화합니다.
sudo swapon /swapfile # 스왑 파일을 활성화하여 실제로 사용하게 합니다
정상적으로 설정이 되었는지 확인합니다.
sudo swapon --show

#스왑 파일을 /etc/fstab에 등록
sudo nano /etc/fstab
이 코드를 실행하게 되면 아래와 같은 창이 뜹니다.

# 파일의 마지막 줄에 아래 내용을 추가합니다
#이 줄은 시스템 부팅 시 /swapfile을 스왑 파일로 인식하고 활성화하라는 설정입니다.
/swapfile none swap sw 0 0
이걸 치고 cntr+o > Enter > cntr+x 를 눌러서 나가줍시다.
sudo swapoff /swapfile # 스왑 비활성화
sudo swapon -a # fstab에 따라 스왑 활성화

#서버를 재부팅한 뒤 아래 명령으로 스왑이 유지되는지 확인합니다:
sudo swapon --show
가끔 스왑 메모리를 설정했음에도 서버가 죽는 경우가 있습니다. 재부팅 후에는 스왑메모리가 적용되지 않아서 서버가 너무 쉽게 죽는 것의 원인이 죽고 다시 살아나면 스왑을 다시 설정해주어야 한다는 것을 몰랐습니다.
따라서, 다시 부팅되는 경우에도 다시 스왑 메모리를 적용하도록 설정해 주었습니다!!
sudo apt install -y nginx
마지막으로 nginx까지 설치해 두겠습니다.
✅ 탄력적 IP 설정
EC2의 퍼블릭 IP는 동적이기 때문에 중지(Stop) 후 실행(Start)되면 바뀌어버리는 일이 일어나게 됩니다.
따라서, IP가 고정되는 탄력적 IP를 설정해 줄 것입니다.
Elastic ip는 사용 자체는 무료지만, 사용하지 않거나 ENI에 붙어있지 않을 때는 돈이 나가게 된다.
- 실행 중인 인스턴스에 연결된 IP 주소 (EIP) 한 개는 무료로 사용
- 해당 인스턴스에 추가 EIP를 연결하면 인스턴스와 연결된 추가 EIP당 시간에 비례하여 요금 부과
- 요금 (아시아 태평양 [서울])
- 실행 중인 인스턴스와 연결된 각 추가 IP 주소에 대해 시간당 0.005 USD(비례 할당으로 계산)
- 실행 중인 인스턴스와 연결되지 않은 각 탄력적 IP 주소에 대해 시간당 0.005 USD(비례 할당으로 계산)
- 매달 처음 100개의 재매 핑에 대해 탄력적 IP 주소 재 매핑당 0.00 USD
- 매달 100개 이후 추가 재매핑에 대해 탄력적 IP 주소 재 매핑당 0.10 USD
- AWS 리전당 5개의 탄력적 IP로 제한된다. 만약 더 필요하다면 AWS에 요청하면 된다
출처: Inpa님 티스토리
하나까지는 무료로 사용할 수 있기 때문에 괜찮습니다.
(수정됨 - 2024 2월 기준으로 Ipv4 주소를 사용하는 것만으로도 가격이 책정된다고 합니다(무료x). 이런게 있다라고 생각하고 넘어가주세요! 굳이 삭제하지는 않겠습니다.)

탄력적 IP로 가주세요

그대로 확인을 눌러줍니다.

탄력적 주소가 생성되었고 작업을 통해서 탄력적 IP주소를 연결해 줍니다.

토글을 누르게 되면 그대로 인스턴스와 프라이빗 IP주소가 자동으로 들어가게 됩니다.

최종적으로 다시 EC2를 확인하면 탄력적 IP주소가 생성되었고 공용 IP 주소 또한 탄력적 IP 주소로 바뀐 것을 확인할 수 있습니다.
✅ 정리 (지금까지 한 것)
- 배포의 방식에 대해서 알아보았습니다.
- AWS에서 EC2를 생성했습니다.
- EC2에 대해서 알아보았습니다.
- EC2 연결 2가지 방법
- 스왑 메모리 설정
- 탄력적 IP 주소 설정
다음 포스트에서는 RDS와 로컬에 있는 Spring Boot를 연결하는 과정까지 알아보겠습니다.
⭐ 참고로 Key라던지 IP 주소라던지 모든 정보를 정말 정말 정말 조심히 공개되지 않도록 잘 보관하셔야 합니다. 저는 포스트 이후에 서버를 지워버릴 거라 그대로 두었습니다.
reference:
브런치 스토리 - JS code 배포란? 🔗
티스토리 - IP 기초 (사설 IP / 공인IP / NAT) 개념 정말 쉽게 정리 By Inpa Dev 🔗
티스토리 - [AWS] 📚 EIP(탄력적 IP) 개념 & 사용 세팅 정리 By Inpa Dev 🔗
'프로젝트' 카테고리의 다른 글
배포의 모든 것 - 3. Github Action을 통한 CI/CD (0) | 2025.03.18 |
---|---|
배포의 모든 것 - 2. RDS와 Session Manager (0) | 2025.02.25 |
Restful API Endpoint를 어떻게 설계해야 할까? (1) | 2025.01.14 |
DDD(Domain Driven Design) 구조 알아보기 (5) | 2025.01.14 |
API 응답 통일을 파헤치다 (0) | 2025.01.01 |