KTB 3기 클라우드 과정에서 진행한 개인 커뮤니티 프로젝트의 배포 단계로,
하나의 EC2 서버에 백엔드(Spring Boot), 프론트엔드(Node.js Express), 그리고 MySQL을 함께 올려 ‘단일 인스턴스 빅뱅 배포’를 진행한 과정을 기록한 글입니다.
개인적으로 처음부터 끝까지 직접 배포 과정을 경험해 본 것은 이번이 처음이라,
앞으로 비슷한 환경을 구성할 분들께 참고용으로 도움이 되었으면 합니다.
빅뱅 배포?
모든 변경사항을 한번에 배포하는 방식입니다.
준비와 배포가 빠르지만, 문제 발생시 전체 시스템에 영향을 줄 수 있습니다.
AWS-EC2?
EC2 접속 방법 비교
작업 환경
| 구분 | 내용 |
|---|---|
| 로컬 개발 환경 | macOS |
| AWS 인스턴스 | EC2 프리티어 (t3.micro) |
| 사양 | CPU 2vCore / RAM 1GB / EBS 30GB |
| 운영체제(OS) | Ubuntu 24.04 LTS |
| 빌드 도구 | Gradle |
| JDK 버전 | OpenJDK 21 |
| Node.js / npm | Node.js v24.10.0 / npm |
| 데이터베이스(DB) | MySQL 9.4.0 |

EC2와 연결해주었습니다.# Ubuntu 접속
ssh -i ~/.ssh/key.pem ubuntu@<EC2_IP>
# Ubuntu가 “현재 등록된 리포지토리”에서 최신 패키지 목록을 받아옴
sudo apt-get update
# 이미 설치된 패키지들을 최신 버전으로 업그레이드함
sudo apt-get upgrade
# jdk 21버전 설치
sudo apt install openjdk-21-jdk
# node 24버전 설치 - apt로 설치시에 낮은버전이 깔려서 24버전 설치를 위해 해당 코드 실행
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt install -y nodejs
# 프론트엔드 서버 실행을 위해 Express 등 의존성을 설치
npm install
# mysql 설치
sudo apt install -y mysql-server
# git 설치
sudo apt install -y git
# 설치 후 버전 확인
java -version
node -v
mysql --version
/home/ubuntu/be
/home/ubuntu/fe
# 보안설정
sudo mysql_secure_installation
# DB 계정 생성 및 권한 부여
CREATE DATABASE community;
CREATE USER 'community_user'@'localhost' IDENTIFIED BY 'your_pw';
GRANT ALL PRIVILEGES ON community.* TO 'community_user'@'localhost';
FLUSH PRIVILEGES;
# 덤프 업로드
scp -i ~/.ssh/key.pem ~/Desktop/community_dump.sql ubuntu@<EC2_IP>:/home/ubuntu/
# 덤프 설치
mysql -u root -p community < /home/ubuntu/community_dump.sql
빌드 전, application.yml 파일의 DB 관련 설정을 4번에서 생성한 community_user 계정 기준으로 수정합니다.
현재는 로컬과 서버에서 같은 application.yml을 사용했지만,
추후에는 환경별로 설정 파일(application-prod.yml 등)을 분리하여 보안 관리를 강화할 예정입니다.
spring:
datasource:
url: jdbc:mysql://localhost:3306/community?serverTimezone=Asia/Seoul&useSSL=false
username: **community_user**
password: **your_pw**
driver-class-name: com.mysql.cj.jdbc.Driver
문제
원인
해결
# 2GB 크기 스왑 파일 생성(2배 크기의 파일이 안전)
sudo fallocate -l 2G /swapfile
#권한 설정 및 활성화
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
문제
원인
해결
./gradlew clean build -x test --no-daemon
# build/libs/~~jar 있으면 빌드 성공
nohup java -jar build/libs/community-0.0.1-SNAPSHOT.jar > /home/ubuntu/app/backend.log 2>&1 &
# 톰캣·DB 연결 확인
tail -f /home/ubuntu/app/backend.log
npm start


# Spring Boot 종료
ps -ef | grep java
kill -9 <PID>
# Node.js 종료
ps -ef | grep node
kill -9 <PID>
# MySQL 종료 (선택)
sudo systemctl stop mysql
처음으로 직접 배포를 진행하다 보니 어려움이 많았습니다.
하지만 여러 자료를 찾아보고 하나씩 시도해보면서,
눈에 보이는 UI뿐 아니라, 실제 서비스가 동작하기 위한 “보이지 않는 인프라의 작동 원리”를 경험할 수 있었던 의미 있는 시간이었습니다.
아직 보안적인 부분이나 운영 환경에서 고려해야 할 세부 요소들은 미숙하지만,
앞으로 공부를 이어가며 이를 보완하고,
더 안정적이고 확장성 있는 배포 방식(Docker, Nginx, CI/CD 등) 도 시도해볼 예정입니다.