간단하게 만들어 본 사이드 프로젝트를 백엔드만 배포하려고 할 때 거쳤던 여러가지 배포 방법 고민에 대해 공유하면 좋을 것 같아서 정리해놓으려고 합니다.
그래서 배포란 무엇일까?
기획 -> 요구사항 분석 -> 역할 분담 -> 개발 -> 배포 -> 지속적인 서비스 개선 (리팩토링)
개발자들이 개발한 앱, 웹 서비스들을 일반 사용자들이 접근할 수 있게 하는 것이 배포라고 할 수 있습니다.
이런 배포를 하려면 컴퓨터 한 대가 필요합니다.

온프레미스 환경이라고 부릅니다.
정확히 말하면, 온프레미스 환경은 단순히 입출력 장치가 포함된 컴퓨터를 의미하는 것이 아니라, 물리적인 하드웨어 인프라를 구축하여 우리의 웹사이트를 24시간 안정적으로 운영할 수 있도록 하는 것을 말합니다.
그러나 24시간 365일 서버를 계속 가동하려면 전기 비용이 상당히 많이 들 수밖에 없습니다.
이러한 부담을 줄이기 위해 대표적으로 AWS는 클라우드 서비스 환경을 제공하기 시작했습니다.
AWS의 EC2에서 하나의 인스턴스를 실행한다는 것은, 마치 AWS에서 컴퓨터 한 대를 대여하는 것과 같은 개념이라고 할 수 있습니다.
배포 전략
여기서는 Spring 애플리케이션을 배포한다고 가정하고 설명하겠습니다.
1. was(tomcat, jeus) 구축 + 특정 디렉토리에 war 파일을 올려놓는 방식
2. 스프링 부트 기준 애플리케이션을 jar 파일로 빌드하고 자바 파일을 실행시키는 방식
(내장 톰캣, 스프링 부트 spring-boot-starter-web 키워드로 검색)
현재 새로 구축되는 서비스들은 boot 기반의 빌드된 jar 파일을 가지고 배포를 진행합니다.
그래서 2번 방식으로 배포를 진행했던 경험을 정리하려고 합니다.
설명
1. AWS 가입
기본적으로 아마존에서 제공하는 EC2 서비스를 사용하려면 AWS에 가입이 필요합니다.
2. EC2 메뉴로 이동

오른쪽 상단의 인스턴스 시작을 클릭합니다.

이름 및 태그에 자신이 원하는 인스턴스 이름을 기입합니다.
각 OS 별로 명령어의 차이가 있기 때문에 본인이 편한 OS 이미지를 고르시면 됩니다.
보통 리눅스 계열의 OS를 선택하는 방향이 좋다고 할 수 있습니다. (가벼운 리눅스 계열 CLI 기반)

프리티어의 기본으로 제공되는 t2.micro를 선택합니다.
키 페어(로그인)은 없다면 새 키 페어 생성을 클릭합니다.

RSA가 무엇인지 궁금하다면?
RSA와 AWS 키 페어
✅ RSA는 암호화 알고리즘으로, 공개 키(Public Key)와 개인 키(Private Key) 쌍을 생성하는 방식입니다.
1. aws에서 키 페어를 생성하면 RSA 알고리즘 기반으로 공개 키와 개인 키 생성
2. 공개 키는 EC2 인스턴스의 ~/.ssh/authorized_keys 파일에 자동 저장
3. 개인 키(.pem 파일)을 사용자가 다운로드하여 SSH 접속 시 인증에 사용합니다.
SSH란?
✅ SSH(Secure Shell)는 원격 접속 프로토콜이며, 주로 22번 포트를 사용합니다.
✅ 다른 컴퓨터(예: AWS EC2)에 원격으로 안전하게 접속할 때 사용됩니다.
네트워크 설정

네트워크 설정을 수행합니다.
거의 고칠 필요는 없으며 HTTP와 HTTPS 트래픽 허용을 체크해주셔도 됩니다.
체크해두면 보안 그룹의 80포트, 443포트가 인바운드 규칙에 추가되게 됩니다.
스토리지 구성

30GB 까지 프리티어 무료이기 때문에 저는 30GB로 설정을 수정했습니다.

인스턴스를 시작합니다.
3. 인스턴스 연결

생성한 인스턴스가 있고, putty를 이용하는 방안도 있으나
간단하게 aws ec2에서 하는 방향으로 설명하겠습니다.
인스턴스 ID에 커서를 두고 클릭하시면 인스턴스 상세 내역이 나오게 됩니다.

연결을 클릭


4. GIT 설치
sudo apt update && sudo apt upgrade -y
sudo apt install git -y
프로젝트를 클론하기 위해 git을 설치합니다.
5. Java 설치
본인의 프로젝트 자바 버전에 맞춰서 jdk를 설치합니다.
sudo apt install openjdk-17-jdk -y
6. Github 에서 프로젝트 클론
git clone 나의 프로젝트.git
7. swap 메모리 설정
AWS 프리티어를 사용하면서 가장 아쉬웠던 점은 역시 t2-micro 라고 할 수 있습니다.
도커를 통해 여러 이미지들을 띄우고, CPU 점유율이 100%가 되어 인스턴스를 중지하고 재부팅을 시도한 적이 10번이 넘게 있었습니다.
스왑 메모리를 추가하면 메모리 부족(OOM) 오류 방지 및 CPU 100% 사용 문제를 완화할 수 있습니다.
스왑 메모리는 RAM이 부족할 때 디스크 공간을 임시 메모리로 사용하는 기능입니다.
스왑 파일을 생성하는 명령어
sudo fallocate -l 2G /swapfile
스왑 파일 권한 설정
sudo chmod 600 /swapfile
- sudo: Superuser 권한으로 명령어를 수행
- chmod 600
- 6은 소유자(user)에게 읽기(4), 쓰기(2) 권한을 부여
- 0은 그룹(group)과 다른 사용자(others)에게는 어떠한 권한도 부여하지 않음
- /swapfile
- 권한을 변경할 대상 파일의 경로
스왑 영역으로 포맷 및 활성화
sudo mkswap /swapfile
sudo swapon /swapfile
sudo mkswap /swapfile:
- /swapfile이라는 파일을 스왑 공간으로 초기화합니다
- mkswap은 지정된 파일을 스왑 공간으로 설정하는 데 사용합니다
- 이 명령어를 실행하면 파일이 스왑 공간으로 사용될 수 있도록 준비합니다
sudo swapon /swapfile:
- /swapfile을 활성화하여 시스템에서 스왑 공간으로 사용할 수 있게 합니다
- swapon은 스왑 공간을 활성화하는 데 사용됩니다
- 이 명령어를 실행하면 시스템은 이제 이 파일을 스왑 공간으로 사용합니다
free -m
- Swap 메모리가 추가된 것을 확인할 수 있습니다.
부팅 시 자동 적용
서버를 재부팅하면 스왑 설정이 사라지므로, 자동 적용되도록 /etc/fstab 파일에 추가합니다
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
서버가 재부팅되어도 스왑 메모리가 유지됩니다
장단점 ▽
✅ 1️⃣ 스왑 메모리의 장점
1. RAM 부족 시 시스템 크래시 방지
- 스왑 메모리가 있으면 시스템이 다운되지 않고 계속 실행 가능
2. 실행 중인 애플리케이션 유지 가능
- 일부 비활성화된 프로세스(사용되지 않는 데이터)를 스왑으로 이동 → 현재 작업 중인 프로세스는 RAM 유지 가능
- 즉, 주요 애플리케이션의 성능을 유지하면서 RAM을 효율적으로 사용
3. 서버 다운 없이 일시적인 해결 가능
- 메모리가 부족한 상황에서 즉시 RAM을 추가할 수 없을 때 유용
- AWS EC2 같은 환경에서는 스왑 추가가 메모리 업그레이드보다 쉬움
❌ 2️⃣ 스왑 메모리의 단점
1. 디스크 I/O 성능 저하 (속도 느림)
- RAM은 초당 GB 단위 속도, SSD는 수백 MB/s 속도, HDD는 수십 MB/s 속도
- RAM이 부족할 때 디스크에서 스왑을 읽고 쓰는 과정에서 엄청나게 느려질 수 있음
- 특히 HDD 환경에서는 성능이 심각하게 저하
2. CPU 사용률 증가 (서버 부하 심화)
- 스왑이 자주 발생하면 CPU가 디스크에서 메모리를 읽고 쓰는 작업을 많이 해야 해서 부하가 증가
- top 명령어에서 CPU 사용률이 높은데, 실제 애플리케이션은 느려질 수 있음
3. 지속적인 성능 저하 위험 (느려지는 시스템)
- RAM이 부족한 상태에서 계속 스왑이 사용되면, 시스템 전체가 느려질 수 있음
- 특히 웹 서버(Nginx, Tomcat)가 스왑에 영향을 받으면 응답 속도가 느려지고, 장애가 발생할 수 있음
- OOM Killer가 작동하면 중요한 프로세스가 종료될 수도 있음
🔥 결론: 스왑은 "응급 처방"으로 사용하고, 근본적인 해결책이 아님!
✅ 장기적으로는 RAM 업그레이드가 가장 좋은 해결책
Swap 메모리 최적화 ▽
Swap 사용을 줄이고 RAM을 우선 사용하도록 설정
AWS EC2 같은 서버 환경에서는 swappiness=10~20이 적절
swappiness 값이 클수록 Swap을 적극적으로 사용하고, 작을수록 RAM을 우선 사용
현재 sappiness 값 확인
cat /proc/sys/vm/swappiness
(기본적으로 60으로 설정되어 있을 가능성이 큼 → 너무 높음)
swappiness 값을 10으로 설정 (RAM 우선 사용)
sudo sysctl vm.swappiness=10
설정이 적용됐는지 확인
cat /proc/sys/vm/swappiness
재부팅 후에도 설정 유지 (영구 적용)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
8. DB 설정
추후 rds 설정으로 바꿀 예정입니다. (aws에서 제공하는 관계형 db)
저는 빠르게 배포를 한다는 방향으로 docker-compose로 db를 생성하도록 설정하였습니다.
# Docker 설치
sudo apt install docker.io -y
# Docker Compose 설치
sudo apt install docker-compose -y
# Docker 서비스 시작 및 부팅 시 자동 실행 설정
sudo systemctl start docker
sudo systemctl enable docker
# 현재 사용자(ubuntu)를 docker 그룹에 추가 (재로그인 필요)
sudo usermod -aG docker $USER
PostgreSQL Docker 컨테이너 실행
mkdir ~/postgres-docker && cd ~/postgres-docker
nano docker-compose.yml
- postgres-docker 폴더를 만들고
- docker-compose.yml 파일을 생성하고 편집합니다.
- nano 에디터가 열리고 파일에 다음과 같이 작성합니다.
version: '3.8'
services:
postgres:
image: postgres:latest
container_name: postgres-db
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
- 고칠 부분
- container_name: 원하시는 컨테이너 이름을 지정해줍니다
- POSTGRES_USER: postgres 유저 id 지정
- POSTGRES_PASSWORD: 비밀번호 지정
- POSTGRES_DB: 스키마 이름 지정
- ${POSTGRES_USER} 이렇게 되었는지 의문을 가지실 수도 있습니다.
- 보통 저런 민감한 파일들은 직접 하나의 파일에서 관리하지 않습니다.
보안 설정
1. [.env] 파일을 만들어 관리한다 (여기서는 이 방법 선택)
- gitignore에 추가합니다.
- .env 파일을 ec2 cli 환경에서 생성하고 관리합니다.
POSTGRES_USER=myuser
POSTGRES_PASSWORD=mypassword
POSTGRES_DB=mydatabase
2. AWS Secrets Manager 사용
AWS Secrets Manager를 사용하면 .env 파일 없이도 보안성이 높은 방식으로 환경 변수를 관리할 수 있습니다

방법
1. AWS 콘솔 → Secrets Manager → 새 시크릿 생성
2. "RDS 자격 증명"을 선택하고 아래 정보를 입력:
- 사용자 이름: myuser
- 비밀번호: mypassword
- 데이터베이스 이름: mydatabase
3. 이름을 my-app-postgres-secret 으로 저장
4. EC2에서 Secrets Manager의 값을 가져와 Docker Compose에서 사용
export SECRETS=$(aws secretsmanager get-secret-value --secret-id my-app-postgres-secret --query SecretString --output text)
export POSTGRES_USER=$(echo $SECRETS | jq -r .username)
export POSTGRES_PASSWORD=$(echo $SECRETS | jq -r .password)
export POSTGRES_DB=$(echo $SECRETS | jq -r .dbname)
docker-compose up -d
jq 설치 필요 시
sudo yum install jq -y # Amazon Linux 2
sudo apt install jq -y # Ubuntu
Docker Compose 파일에서는 .env 없이 환경 변수를 직접 읽어서 실행할 수 있음
3. EC2 인스턴스의 환경 변수 활용
AWS EC2의 환경 변수에 값을 미리 설정해두면 .env 파일 없이 사용
# 환경 변수 설정
echo "export POSTGRES_USER=myuser" >> ~/.bashrc
echo "export POSTGRES_PASSWORD=mypassword" >> ~/.bashrc
echo "export POSTGRES_DB=mydatabase" >> ~/.bashrc
# 변경 적용
source ~/.bashrc
Docker Compose에서 .env 없이 실행 가능
environment:
POSTGRES_USER: $POSTGRES_USER
POSTGRES_PASSWORD: $POSTGRES_PASSWORD
POSTGRES_DB: $POSTGRES_DB
장단점
장점: .env 파일 없이 보안성이 올라감.
단점: EC2에 직접 로그인해야 변경 가능.
4. AWS Systems Manager Parameter Store 사용
AWS 콘솔 → Systems Manager → Parameter Store
새 Parameter 추가
- /postgres/username → myuser
- /postgres/password → mypassword
- /postgres/database → mydatabase
EC2에서 환경 변수 불러오기
export POSTGRES_USER=$(aws ssm get-parameter --name "/postgres/username" --query "Parameter.Value" --output text)
export POSTGRES_PASSWORD=$(aws ssm get-parameter --name "/postgres/password" --with-decryption --query "Parameter.Value" --output text)
export POSTGRES_DB=$(aws ssm get-parameter --name "/postgres/database" --query "Parameter.Value" --output text)
docker-compose up -d
github에서 받은 프로젝트 db 설정 추가
application.yml의 db 설정 존재
spring:
datasource:
url: jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
username: ${POSTGRES_USER}
password: ${POSTGRES_PASSWORD}
driver-class-name: org.postgresql.Driver
jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: update # 필요에 따라 'none', 'create', 'update', 'validate' 설정 가능
show-sql: true # 콘솔에 SQL 쿼리 출력
- 다음과 같이 Docker 환경변수를 Spring Boot application.yml에서 사용할 수 있습니다
- 일단 이 방법으로 수행되지 않는다면 직접 입력을 해주어도 괜찮긴 합니다(보안과 추후 환경변수 관리에 있어서 어려워진다는 점 참고)
9. docker-compose up 명령어 수행
# Docker Compose 실행
docker-compose up -d
# Postgresql 띄어졌는지 확인
docker ps
10. Application clone 폴더 위치로 이동
[ec2-user@ip-10-0-0-76 Foody]$ ls
application.log build build.gradle gradle gradlew gradlew.bat readme.md settings.gradle src
11. 빌드 수행
./gradelw clean build
12. cd build/libs/~~.jar 파일을 찾아 실행
[ec2-user@ip-10-0-0-76 libs]$ ls
Foody-0.0.1-SNAPSHOT-plain.jar Foody-0.0.1-SNAPSHOT.jar
- 후자
nohup java -jar Foody-0.0.1-SNAPSHOT.jar
- nohup 백그라운드에서 실행하겠다는 뜻
- 그대로 실행하게 되면 다른 ec2 서비스 폴더에 접근할 수 없습니다
문제점 (트러블 슈팅)
1. 프리티어 CPU, RAM 점유 이슈
- swap 메모리 설정
2. Spring application 외부 접근(보안 그룹 설정)
- 현재는 8080포트로 jar 파일을 실행시켰기 때문에 8080포트를 인바운드 규칙에 추가해줬어야 함

3. 파일 업로드 AWS S3 사용
(추후 정리)
4. application-yml 설정
- 개발: application-dev.yml
- 로컬: application-local.yml
- 운영: application-prod.yml
관리하고 있는데 prod를 지정해서 실행해야 했음
1. 방법으로는 application.yml을 만들고
spring:
profiles:
include:
- prod
다음과 같이 설정
2. 실행 시 prod 환경을 명확하게 지정하는 방법
# 지정
java -jar Foody-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
# 백그라운드
nohup java -jar Foody-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
1번 2번 중에 둘중에 하나를 선택해서 하면 됩니다.
참고 사이트
https://f-lab.kr/insight/linux-vs-windows-os-comparison
리눅스와 윈도우: 운영 체제 비교
리눅스와 윈도우 운영 체제의 기본 차이, 각각의 장점, 그리고 사용자의 요구 사항에 따른 적합한 운영 체제 선택에 대해 설명합니다.
f-lab.kr
[AWS] 📚 S3 개념 & 버킷 · 권한 설정 방법
S3 (Simple Storage Service) 개념 AWS S3는 업계 최고의 확장성과 데이터 가용성 및 보안과 성능을 제공하는 온라인 오브젝트(객체) 스토리지 서비스이다. (참고로 S 앞글자가 3개라서 S3 이라고 한다.) 쉽
inpa.tistory.com
OpenAI. (2025). ChatGPT (February 13 version) [Large language model]. https://chat.openai.com
'배포관련 > AWS' 카테고리의 다른 글
AWS EC2에서 Nginx + Docker Compose + Jenkins를 활용한 CI/CD 구축 (0) | 2025.02.23 |
---|---|
Spring Boot AWS S3 설정 (0) | 2025.02.16 |
AWS 에서의 망에 대해.. (0) | 2024.01.09 |
리전(Region)이란? (1) | 2024.01.01 |
EC2란? (0) | 2023.12.31 |
간단하게 만들어 본 사이드 프로젝트를 백엔드만 배포하려고 할 때 거쳤던 여러가지 배포 방법 고민에 대해 공유하면 좋을 것 같아서 정리해놓으려고 합니다.
그래서 배포란 무엇일까?
기획 -> 요구사항 분석 -> 역할 분담 -> 개발 -> 배포 -> 지속적인 서비스 개선 (리팩토링)
개발자들이 개발한 앱, 웹 서비스들을 일반 사용자들이 접근할 수 있게 하는 것이 배포라고 할 수 있습니다.
이런 배포를 하려면 컴퓨터 한 대가 필요합니다.

온프레미스 환경이라고 부릅니다.
정확히 말하면, 온프레미스 환경은 단순히 입출력 장치가 포함된 컴퓨터를 의미하는 것이 아니라, 물리적인 하드웨어 인프라를 구축하여 우리의 웹사이트를 24시간 안정적으로 운영할 수 있도록 하는 것을 말합니다.
그러나 24시간 365일 서버를 계속 가동하려면 전기 비용이 상당히 많이 들 수밖에 없습니다.
이러한 부담을 줄이기 위해 대표적으로 AWS는 클라우드 서비스 환경을 제공하기 시작했습니다.
AWS의 EC2에서 하나의 인스턴스를 실행한다는 것은, 마치 AWS에서 컴퓨터 한 대를 대여하는 것과 같은 개념이라고 할 수 있습니다.
배포 전략
여기서는 Spring 애플리케이션을 배포한다고 가정하고 설명하겠습니다.
1. was(tomcat, jeus) 구축 + 특정 디렉토리에 war 파일을 올려놓는 방식
2. 스프링 부트 기준 애플리케이션을 jar 파일로 빌드하고 자바 파일을 실행시키는 방식
(내장 톰캣, 스프링 부트 spring-boot-starter-web 키워드로 검색)
현재 새로 구축되는 서비스들은 boot 기반의 빌드된 jar 파일을 가지고 배포를 진행합니다.
그래서 2번 방식으로 배포를 진행했던 경험을 정리하려고 합니다.
설명
1. AWS 가입
기본적으로 아마존에서 제공하는 EC2 서비스를 사용하려면 AWS에 가입이 필요합니다.
2. EC2 메뉴로 이동

오른쪽 상단의 인스턴스 시작을 클릭합니다.

이름 및 태그에 자신이 원하는 인스턴스 이름을 기입합니다.
각 OS 별로 명령어의 차이가 있기 때문에 본인이 편한 OS 이미지를 고르시면 됩니다.
보통 리눅스 계열의 OS를 선택하는 방향이 좋다고 할 수 있습니다. (가벼운 리눅스 계열 CLI 기반)

프리티어의 기본으로 제공되는 t2.micro를 선택합니다.
키 페어(로그인)은 없다면 새 키 페어 생성을 클릭합니다.

RSA가 무엇인지 궁금하다면?
RSA와 AWS 키 페어
✅ RSA는 암호화 알고리즘으로, 공개 키(Public Key)와 개인 키(Private Key) 쌍을 생성하는 방식입니다.
1. aws에서 키 페어를 생성하면 RSA 알고리즘 기반으로 공개 키와 개인 키 생성
2. 공개 키는 EC2 인스턴스의 ~/.ssh/authorized_keys 파일에 자동 저장
3. 개인 키(.pem 파일)을 사용자가 다운로드하여 SSH 접속 시 인증에 사용합니다.
SSH란?
✅ SSH(Secure Shell)는 원격 접속 프로토콜이며, 주로 22번 포트를 사용합니다.
✅ 다른 컴퓨터(예: AWS EC2)에 원격으로 안전하게 접속할 때 사용됩니다.
네트워크 설정

네트워크 설정을 수행합니다.
거의 고칠 필요는 없으며 HTTP와 HTTPS 트래픽 허용을 체크해주셔도 됩니다.
체크해두면 보안 그룹의 80포트, 443포트가 인바운드 규칙에 추가되게 됩니다.
스토리지 구성

30GB 까지 프리티어 무료이기 때문에 저는 30GB로 설정을 수정했습니다.

인스턴스를 시작합니다.
3. 인스턴스 연결

생성한 인스턴스가 있고, putty를 이용하는 방안도 있으나
간단하게 aws ec2에서 하는 방향으로 설명하겠습니다.
인스턴스 ID에 커서를 두고 클릭하시면 인스턴스 상세 내역이 나오게 됩니다.

연결을 클릭


4. GIT 설치
sudo apt update && sudo apt upgrade -y
sudo apt install git -y
프로젝트를 클론하기 위해 git을 설치합니다.
5. Java 설치
본인의 프로젝트 자바 버전에 맞춰서 jdk를 설치합니다.
sudo apt install openjdk-17-jdk -y
6. Github 에서 프로젝트 클론
git clone 나의 프로젝트.git
7. swap 메모리 설정
AWS 프리티어를 사용하면서 가장 아쉬웠던 점은 역시 t2-micro 라고 할 수 있습니다.
도커를 통해 여러 이미지들을 띄우고, CPU 점유율이 100%가 되어 인스턴스를 중지하고 재부팅을 시도한 적이 10번이 넘게 있었습니다.
스왑 메모리를 추가하면 메모리 부족(OOM) 오류 방지 및 CPU 100% 사용 문제를 완화할 수 있습니다.
스왑 메모리는 RAM이 부족할 때 디스크 공간을 임시 메모리로 사용하는 기능입니다.
스왑 파일을 생성하는 명령어
sudo fallocate -l 2G /swapfile
스왑 파일 권한 설정
sudo chmod 600 /swapfile
- sudo: Superuser 권한으로 명령어를 수행
- chmod 600
- 6은 소유자(user)에게 읽기(4), 쓰기(2) 권한을 부여
- 0은 그룹(group)과 다른 사용자(others)에게는 어떠한 권한도 부여하지 않음
- /swapfile
- 권한을 변경할 대상 파일의 경로
스왑 영역으로 포맷 및 활성화
sudo mkswap /swapfile
sudo swapon /swapfile
sudo mkswap /swapfile:
- /swapfile이라는 파일을 스왑 공간으로 초기화합니다
- mkswap은 지정된 파일을 스왑 공간으로 설정하는 데 사용합니다
- 이 명령어를 실행하면 파일이 스왑 공간으로 사용될 수 있도록 준비합니다
sudo swapon /swapfile:
- /swapfile을 활성화하여 시스템에서 스왑 공간으로 사용할 수 있게 합니다
- swapon은 스왑 공간을 활성화하는 데 사용됩니다
- 이 명령어를 실행하면 시스템은 이제 이 파일을 스왑 공간으로 사용합니다
free -m
- Swap 메모리가 추가된 것을 확인할 수 있습니다.
부팅 시 자동 적용
서버를 재부팅하면 스왑 설정이 사라지므로, 자동 적용되도록 /etc/fstab 파일에 추가합니다
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
서버가 재부팅되어도 스왑 메모리가 유지됩니다
장단점 ▽
✅ 1️⃣ 스왑 메모리의 장점
1. RAM 부족 시 시스템 크래시 방지
- 스왑 메모리가 있으면 시스템이 다운되지 않고 계속 실행 가능
2. 실행 중인 애플리케이션 유지 가능
- 일부 비활성화된 프로세스(사용되지 않는 데이터)를 스왑으로 이동 → 현재 작업 중인 프로세스는 RAM 유지 가능
- 즉, 주요 애플리케이션의 성능을 유지하면서 RAM을 효율적으로 사용
3. 서버 다운 없이 일시적인 해결 가능
- 메모리가 부족한 상황에서 즉시 RAM을 추가할 수 없을 때 유용
- AWS EC2 같은 환경에서는 스왑 추가가 메모리 업그레이드보다 쉬움
❌ 2️⃣ 스왑 메모리의 단점
1. 디스크 I/O 성능 저하 (속도 느림)
- RAM은 초당 GB 단위 속도, SSD는 수백 MB/s 속도, HDD는 수십 MB/s 속도
- RAM이 부족할 때 디스크에서 스왑을 읽고 쓰는 과정에서 엄청나게 느려질 수 있음
- 특히 HDD 환경에서는 성능이 심각하게 저하
2. CPU 사용률 증가 (서버 부하 심화)
- 스왑이 자주 발생하면 CPU가 디스크에서 메모리를 읽고 쓰는 작업을 많이 해야 해서 부하가 증가
- top 명령어에서 CPU 사용률이 높은데, 실제 애플리케이션은 느려질 수 있음
3. 지속적인 성능 저하 위험 (느려지는 시스템)
- RAM이 부족한 상태에서 계속 스왑이 사용되면, 시스템 전체가 느려질 수 있음
- 특히 웹 서버(Nginx, Tomcat)가 스왑에 영향을 받으면 응답 속도가 느려지고, 장애가 발생할 수 있음
- OOM Killer가 작동하면 중요한 프로세스가 종료될 수도 있음
🔥 결론: 스왑은 "응급 처방"으로 사용하고, 근본적인 해결책이 아님!
✅ 장기적으로는 RAM 업그레이드가 가장 좋은 해결책
Swap 메모리 최적화 ▽
Swap 사용을 줄이고 RAM을 우선 사용하도록 설정
AWS EC2 같은 서버 환경에서는 swappiness=10~20이 적절
swappiness 값이 클수록 Swap을 적극적으로 사용하고, 작을수록 RAM을 우선 사용
현재 sappiness 값 확인
cat /proc/sys/vm/swappiness
(기본적으로 60으로 설정되어 있을 가능성이 큼 → 너무 높음)
swappiness 값을 10으로 설정 (RAM 우선 사용)
sudo sysctl vm.swappiness=10
설정이 적용됐는지 확인
cat /proc/sys/vm/swappiness
재부팅 후에도 설정 유지 (영구 적용)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
8. DB 설정
추후 rds 설정으로 바꿀 예정입니다. (aws에서 제공하는 관계형 db)
저는 빠르게 배포를 한다는 방향으로 docker-compose로 db를 생성하도록 설정하였습니다.
# Docker 설치
sudo apt install docker.io -y
# Docker Compose 설치
sudo apt install docker-compose -y
# Docker 서비스 시작 및 부팅 시 자동 실행 설정
sudo systemctl start docker
sudo systemctl enable docker
# 현재 사용자(ubuntu)를 docker 그룹에 추가 (재로그인 필요)
sudo usermod -aG docker $USER
PostgreSQL Docker 컨테이너 실행
mkdir ~/postgres-docker && cd ~/postgres-docker
nano docker-compose.yml
- postgres-docker 폴더를 만들고
- docker-compose.yml 파일을 생성하고 편집합니다.
- nano 에디터가 열리고 파일에 다음과 같이 작성합니다.
version: '3.8'
services:
postgres:
image: postgres:latest
container_name: postgres-db
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
- 고칠 부분
- container_name: 원하시는 컨테이너 이름을 지정해줍니다
- POSTGRES_USER: postgres 유저 id 지정
- POSTGRES_PASSWORD: 비밀번호 지정
- POSTGRES_DB: 스키마 이름 지정
- ${POSTGRES_USER} 이렇게 되었는지 의문을 가지실 수도 있습니다.
- 보통 저런 민감한 파일들은 직접 하나의 파일에서 관리하지 않습니다.
보안 설정
1. [.env] 파일을 만들어 관리한다 (여기서는 이 방법 선택)
- gitignore에 추가합니다.
- .env 파일을 ec2 cli 환경에서 생성하고 관리합니다.
POSTGRES_USER=myuser
POSTGRES_PASSWORD=mypassword
POSTGRES_DB=mydatabase
2. AWS Secrets Manager 사용
AWS Secrets Manager를 사용하면 .env 파일 없이도 보안성이 높은 방식으로 환경 변수를 관리할 수 있습니다

방법
1. AWS 콘솔 → Secrets Manager → 새 시크릿 생성
2. "RDS 자격 증명"을 선택하고 아래 정보를 입력:
- 사용자 이름: myuser
- 비밀번호: mypassword
- 데이터베이스 이름: mydatabase
3. 이름을 my-app-postgres-secret 으로 저장
4. EC2에서 Secrets Manager의 값을 가져와 Docker Compose에서 사용
export SECRETS=$(aws secretsmanager get-secret-value --secret-id my-app-postgres-secret --query SecretString --output text)
export POSTGRES_USER=$(echo $SECRETS | jq -r .username)
export POSTGRES_PASSWORD=$(echo $SECRETS | jq -r .password)
export POSTGRES_DB=$(echo $SECRETS | jq -r .dbname)
docker-compose up -d
jq 설치 필요 시
sudo yum install jq -y # Amazon Linux 2
sudo apt install jq -y # Ubuntu
Docker Compose 파일에서는 .env 없이 환경 변수를 직접 읽어서 실행할 수 있음
3. EC2 인스턴스의 환경 변수 활용
AWS EC2의 환경 변수에 값을 미리 설정해두면 .env 파일 없이 사용
# 환경 변수 설정
echo "export POSTGRES_USER=myuser" >> ~/.bashrc
echo "export POSTGRES_PASSWORD=mypassword" >> ~/.bashrc
echo "export POSTGRES_DB=mydatabase" >> ~/.bashrc
# 변경 적용
source ~/.bashrc
Docker Compose에서 .env 없이 실행 가능
environment:
POSTGRES_USER: $POSTGRES_USER
POSTGRES_PASSWORD: $POSTGRES_PASSWORD
POSTGRES_DB: $POSTGRES_DB
장단점
장점: .env 파일 없이 보안성이 올라감.
단점: EC2에 직접 로그인해야 변경 가능.
4. AWS Systems Manager Parameter Store 사용
AWS 콘솔 → Systems Manager → Parameter Store
새 Parameter 추가
- /postgres/username → myuser
- /postgres/password → mypassword
- /postgres/database → mydatabase
EC2에서 환경 변수 불러오기
export POSTGRES_USER=$(aws ssm get-parameter --name "/postgres/username" --query "Parameter.Value" --output text)
export POSTGRES_PASSWORD=$(aws ssm get-parameter --name "/postgres/password" --with-decryption --query "Parameter.Value" --output text)
export POSTGRES_DB=$(aws ssm get-parameter --name "/postgres/database" --query "Parameter.Value" --output text)
docker-compose up -d
github에서 받은 프로젝트 db 설정 추가
application.yml의 db 설정 존재
spring:
datasource:
url: jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
username: ${POSTGRES_USER}
password: ${POSTGRES_PASSWORD}
driver-class-name: org.postgresql.Driver
jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: update # 필요에 따라 'none', 'create', 'update', 'validate' 설정 가능
show-sql: true # 콘솔에 SQL 쿼리 출력
- 다음과 같이 Docker 환경변수를 Spring Boot application.yml에서 사용할 수 있습니다
- 일단 이 방법으로 수행되지 않는다면 직접 입력을 해주어도 괜찮긴 합니다(보안과 추후 환경변수 관리에 있어서 어려워진다는 점 참고)
9. docker-compose up 명령어 수행
# Docker Compose 실행
docker-compose up -d
# Postgresql 띄어졌는지 확인
docker ps
10. Application clone 폴더 위치로 이동
[ec2-user@ip-10-0-0-76 Foody]$ ls
application.log build build.gradle gradle gradlew gradlew.bat readme.md settings.gradle src
11. 빌드 수행
./gradelw clean build
12. cd build/libs/~~.jar 파일을 찾아 실행
[ec2-user@ip-10-0-0-76 libs]$ ls
Foody-0.0.1-SNAPSHOT-plain.jar Foody-0.0.1-SNAPSHOT.jar
- 후자
nohup java -jar Foody-0.0.1-SNAPSHOT.jar
- nohup 백그라운드에서 실행하겠다는 뜻
- 그대로 실행하게 되면 다른 ec2 서비스 폴더에 접근할 수 없습니다
문제점 (트러블 슈팅)
1. 프리티어 CPU, RAM 점유 이슈
- swap 메모리 설정
2. Spring application 외부 접근(보안 그룹 설정)
- 현재는 8080포트로 jar 파일을 실행시켰기 때문에 8080포트를 인바운드 규칙에 추가해줬어야 함

3. 파일 업로드 AWS S3 사용
(추후 정리)
4. application-yml 설정
- 개발: application-dev.yml
- 로컬: application-local.yml
- 운영: application-prod.yml
관리하고 있는데 prod를 지정해서 실행해야 했음
1. 방법으로는 application.yml을 만들고
spring:
profiles:
include:
- prod
다음과 같이 설정
2. 실행 시 prod 환경을 명확하게 지정하는 방법
# 지정
java -jar Foody-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
# 백그라운드
nohup java -jar Foody-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
1번 2번 중에 둘중에 하나를 선택해서 하면 됩니다.
참고 사이트
https://f-lab.kr/insight/linux-vs-windows-os-comparison
리눅스와 윈도우: 운영 체제 비교
리눅스와 윈도우 운영 체제의 기본 차이, 각각의 장점, 그리고 사용자의 요구 사항에 따른 적합한 운영 체제 선택에 대해 설명합니다.
f-lab.kr
[AWS] 📚 S3 개념 & 버킷 · 권한 설정 방법
S3 (Simple Storage Service) 개념 AWS S3는 업계 최고의 확장성과 데이터 가용성 및 보안과 성능을 제공하는 온라인 오브젝트(객체) 스토리지 서비스이다. (참고로 S 앞글자가 3개라서 S3 이라고 한다.) 쉽
inpa.tistory.com
OpenAI. (2025). ChatGPT (February 13 version) [Large language model]. https://chat.openai.com
'배포관련 > AWS' 카테고리의 다른 글
AWS EC2에서 Nginx + Docker Compose + Jenkins를 활용한 CI/CD 구축 (0) | 2025.02.23 |
---|---|
Spring Boot AWS S3 설정 (0) | 2025.02.16 |
AWS 에서의 망에 대해.. (0) | 2024.01.09 |
리전(Region)이란? (1) | 2024.01.01 |
EC2란? (0) | 2023.12.31 |