AWS + CI/CD 스터디를 위한 풀스택 프로젝트 보일러플레이트입니다.
- React 19
- React-Router
- TypeScript
- Node.js
- npm
- Spring Boot
- Java 21
- Maven
- Mysql
- Nginx (리버스 프록시)
- AWS
- Docker
- GitHub Actions (CI/CD)
fullstack-boilerplate/
├── frontend/ # React 프론트엔드
├── backend/ # Spring Boot 백엔드
├── nginx/ # Nginx 설정
├── scripts/ # 배포 스크립트
└── .github/ # GitHub Actions 워크플로우
- Node.js 설치 (v16 이상 권장)
- 의존성 설치:
cd frontend
npm install- 개발 서버 실행:
npm run dev- 빌드:
npm run build- JDK 21 설치
- 프로젝트 빌드:
cd backend
mvn clean install- 서버 실행:
mvn spring-boot:run- Nginx 설치
- nginx.conf 파일을 nginx 설정 디렉토리에 복사
- Nginx 시작:
sudo service nginx start프로젝트 실행을 위해 다음 환경 변수들을 설정해야 합니다:
# Frontend (.env)
VITE_API_URL=http://localhost:8080
# Backend (application.properties)
spring.profiles.active=dev
server.port=8080프로젝트는 Docker와 docker-compose를 사용하여 컨테이너화되어 있습니다.
- Docker 이미지 빌드 및 실행:
# 모든 서비스 빌드 및 실행
docker-compose up --build
# 백그라운드에서 실행
docker-compose up -d- 서비스 중지:
docker-compose down- 개별 서비스 로그 확인:
# 프론트엔드 로그
docker-compose logs frontend
# 백엔드 로그
docker-compose logs backend- 컨테이너 상태 확인:
docker-compose ps각 서비스는 다음 포트로 접근 가능합니다:
- 프론트엔드: http://localhost:3000
- 백엔드: http://localhost:8080
- Nginx: http://localhost:80
-
AWS 콘솔에서 EC2 인스턴스 생성
- Ubuntu Server 22.04 LTS 또는 Amazon Linux 2 AMI 선택
- t2.micro 이상 권장 (프리티어 가능)
- 보안 그룹 설정: 80(HTTP), 22(SSH), 8080, 8081, 3000 포트 개방
- 키 페어 생성 및 다운로드
-
탄력적 IP 할당 (선택 사항)
- AWS 콘솔 > EC2 > 탄력적 IP > 주소 할당
- 인스턴스에 탄력적 IP 연결
- SSH로 EC2 인스턴스에 접속:
ssh -i your-key.pem ec2-user@your-ec2-ip- 시스템 업데이트:
sudo yum update -y # Amazon Linux
# 또는
sudo apt update && sudo apt upgrade -y # Ubuntu- Docker 설치:
# Amazon Linux 2
sudo amazon-linux-extras install docker
sudo service docker start
sudo usermod -a -G docker ec2-user
sudo systemctl enable docker
# Ubuntu
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -a -G docker ubuntu- Docker Compose 설치:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose- GitHub Actions 배포를 위한 SSH 키 설정:
# authorized_keys 파일에 GitHub Actions 공개키 추가
echo "YOUR_PUBLIC_KEY_CONTENT" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys- 애플리케이션 디렉토리 생성:
mkdir -p ~/frontend/dist
mkdir -p ~/backend
mkdir -p ~/nginx수동으로 배포 스크립트 실행:
chmod +x ~/deploy.sh
./deploy.sh이 프로젝트는 GitHub Actions를 사용한 CI/CD 파이프라인을 구현했습니다.
- 프론트엔드 테스트 및 빌드: 프론트엔드 코드를 테스트하고 빌드합니다.
- 백엔드 테스트 및 빌드: 백엔드 코드를 테스트하고 빌드합니다.
- 배포: 메인 브랜치에 푸시된 경우 테스트 통과 후 EC2에 무중단 배포합니다.
-
저장소 구조 확인:
.github/workflows/ci-cd.yml파일이 있는지 확인합니다.scripts/deploy.sh파일이 있는지 확인합니다.
-
GitHub Secrets 설정:
- GitHub 저장소로 이동
- Settings > Secrets and variables > Actions 접속
- 다음 Secrets 추가:
SSH_PRIVATE_KEY: EC2 서버 접속용 SSH 프라이빗 키 (전체 키 내용 복사)EC2_HOST: EC2 서버 IP 주소 또는 도메인 (예: 123.456.789.123)EC2_USER: EC2 서버 접속 사용자명 (예: ubuntu, ec2-user)
-
EC2 서버 준비:
- EC2 인스턴스에 Docker 및 Docker Compose 설치
- 퍼블릭 IP를 할당하고 보안 그룹에서 필요한 포트 개방 (80, 8080, 8081, 3000)
- SSH 접속 키 페어 설정
-
SSH 키 설정:
- 로컬에서 SSH 키 생성:
ssh-keygen -t rsa -b 4096 -f github-actions-key - 생성된 프라이빗 키(
github-actions-key)는 GitHub Secrets에 등록 - 퍼블릭 키(
github-actions-key.pub)는 EC2 인스턴스의~/.ssh/authorized_keys에 추가
- 로컬에서 SSH 키 생성:
-
GitHub Actions 워크플로우 확인:
- main 브랜치에 코드 푸시
- GitHub 저장소의 "Actions" 탭에서 워크플로우 실행 상태 확인
- 워크플로우가 성공적으로 실행되는지 로그 확인
필요에 따라 .github/workflows/ci-cd.yml 파일을 수정할 수 있습니다:
# 브랜치 이름 변경
on:
push:
branches: [ main, develop ] # 원하는 브랜치 이름으로 변경
# 테스트 설정 변경
- name: Run tests
run: npm test -- --coverage # 커버리지 리포트 추가
# JDK 버전 변경
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '21' # JDK 버전 변경이 프로젝트는 블루-그린 배포 방식의 무중단 배포를 구현했습니다:
- 새 버전을 다른 포트(블루/그린)에 배포
- 헬스 체크 통해 새 버전 정상 동작 확인
- Nginx 설정 변경으로 트래픽 전환
- 이전 버전 종료
일반적인 문제 해결 방법:
- 포트 충돌: 8080(백엔드) 또는 3000(프론트엔드) 포트가 이미 사용 중인 경우 환경 변수에서 포트를 변경하세요.
- CORS 에러: nginx.conf의 CORS 설정을 확인하세요.
- 빌드 실패: Node.js 및 Java 버전이 요구사항과 일치하는지 확인하세요.
- 배포 실패: GitHub Secrets 설정 및 SSH 키 권한을 확인하세요.
-
SSH 인증 문제
- GitHub Secrets에 등록한 SSH 키가 EC2 인스턴스의 authorized_keys 파일에 제대로 등록되었는지 확인
- SSH 키 권한이 올바른지 확인:
chmod 600 ~/.ssh/id_rsa - 워크플로우 로그에서 SSH 오류 메시지 확인
-
빌드 실패
- 프론트엔드:
npm run lint또는npm test명령 실패 시 해당 스크립트가 package.json에 정의되어 있는지 확인 - 백엔드: Maven 빌드 실패 시 의존성 문제 검토
- 프론트엔드:
-
배포 실패
- EC2 인스턴스의 디스크 공간 부족 여부 확인:
df -h - Docker 서비스 실행 중인지 확인:
sudo systemctl status docker - 워크플로우 로그에서 실패한 단계 확인
- EC2 인스턴스의 디스크 공간 부족 여부 확인:
-
GitHub Actions 워크플로우가 트리거되지 않음
.github/workflows/ci-cd.yml파일이 올바른 위치에 있는지 확인- 트리거 조건(브랜치 이름 등)이 올바르게 설정되었는지 확인
-
새 버전이 시작되지 않음
- EC2 인스턴스에서 직접 Docker 로그 확인:
docker logs <container-id> - Spring Boot 애플리케이션 로그 확인:
docker-compose logs backend - 포트 충돌 여부 확인:
netstat -tulpn | grep LISTEN
- EC2 인스턴스에서 직접 Docker 로그 확인:
-
Nginx 프록시 문제
- Nginx 설정 파일에서 upstream 설정 확인
- Nginx 로그 확인:
docker-compose logs nginx - Nginx 구성 테스트:
nginx -t
-
헬스 체크 실패
- Spring Boot Actuator 엔드포인트 접근 가능 여부 확인
- 데이터베이스 연결 상태 확인
- 방화벽/보안그룹에서 필요한 포트가 열려있는지 확인
- 이 저장소를 포크합니다.
- 새로운 브랜치를 생성합니다.
- 변경사항을 커밋합니다.
- 브랜치에 푸시합니다.
- Pull Request를 생성합니다.
- E2E 테스트 추가 (Cypress 또는 Playwright)
- 환경별 설정 파일 구분 (.env.development, .env.production)
- 에러 로깅 시스템 구축 (Sentry 등)
- 성능 최적화 (Code splitting, 이미지 최적화)
- PWA(Progressive Web App) 지원 추가
- API 문서화 (Swagger/OpenAPI)
- 통합 테스트 추가
- 캐싱 전략 구현 (Redis)
- 로그 수집 시스템 구축 (ELK 스택)
- 서버 성능 모니터링 도구 추가
-
다양한 환경 설정
- 개발/테스트/스테이징/프로덕션 환경 분리 구성
- 환경별 CI/CD 파이프라인 구성
-
모니터링 시스템 구축
- 서버 상태 모니터링 (Prometheus + Grafana)
- 알림 시스템 설정 (Slack, 이메일)
-
테스트 자동화 강화
- 프론트엔드 E2E 테스트 추가
- 백엔드 통합 테스트 추가
-
컨테이너 오케스트레이션
- Kubernetes로 마이그레이션
- 쿠버네티스 Manifest 파일 작성
- GitHub Actions를 이용한 K8s 배포 자동화
-
마이크로서비스 아키텍처
- 모놀리식 백엔드를 마이크로서비스로 분리
- API 게이트웨이 구축 (Spring Cloud Gateway)
- 서비스 디스커버리 추가 (Consul, Eureka)
-
데이터베이스 성능 최적화
- 읽기/쓰기 분리 (Master-Slave 구성)
- 데이터베이스 마이그레이션 툴 적용 (Flyway, Liquibase)
-
멀티 리전 배포
- AWS 리전 간 배포 구성
- 글로벌 로드 밸런싱 설정
- 재해 복구 (DR) 전략 구현
-
서버리스 아키텍처
- AWS Lambda로 일부 기능 마이그레이션
- API Gateway와 통합
- 서버리스 데이터베이스 연결 (DynamoDB)
-
고급 CI/CD 파이프라인
- 카나리 배포 구현
- A/B 테스트 인프라 구축
- 자동 롤백 전략 고도화