들어가기 앞서
강의 영상과 강의록
•
강의 영상
•
강의 자료
안녕하세요, 6주차 멘토 김지현입니다. 
어느덧 실전 백엔드 스터디의 마지막 주차입니다! 

이번 주차에는 지금까지 만든 애플리케이션을 Docker 이미지로 만들고, AWS EC2에 배포해보았습니다.
내 컴퓨터에서 실행하던 API를 인터넷에서 접속할 수 있는 서버에 올려보고, GitHub Actions를 통해 코드 변경 사항이 자동으로 배포되는 과정까지 함께 살펴봅니다.
강의나 과제에 대해 궁금하거나 막히는 부분이 있다면 언제든지 디스코드 #정규스터디-질문방으로 연락 주세요!
이번 주차 진행 전 확인해주세요!
이번 주차 실습과 과제를 위해 다음 준비가 필요합니다.
•
AWS 계정
•
Docker 실행 환경
•
Docker Hub 계정
•
GitHub 계정과 실습 저장소
AWS를 처음 사용하는 분은 가입 시 프리 티어 무료 플랜을 선택할 수 있습니다. 가입 화면에서 무료 제공 조건과 크레딧을 확인해주세요.
기존 AWS 계정이 있다면 프리 티어 적용 여부와 남은 크레딧을 확인해주세요.
AWS 리소스 사용 시 계정 상태와 사용량에 따라 비용이 발생할 수 있습니다. 과제 확인이 끝난 뒤에는 사용한 리소스를 정리해주세요.
실습 환경 안내이번 주차에는 강의를 따라 필요한 파일을 직접 생성하고, 아래 제공된 코드를 복사하여 사용합니다.
개인 계정이나 서버에 따라 변경해야 하는 설정은 강의에서 안내합니다.
비밀번호, 인증 토큰, SSH 개인 키는 코드에 직접 작성하거나 GitHub 저장소에 올리지 마세요!
Docker Desktop 설치하기
실습에 사용할 코드
1. Dockerfile
FROM eclipse-temurin:21-jre-jammy
WORKDIR /app
COPY build/libs/commerce-app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
Plain Text
복사
2. .dockerignore
*
!build/
!build/libs/
!build/libs/commerce-app.jar
Plain Text
복사
3. EC2에 Docker 설치
sudo apt update
sudo apt install -y docker.io
sudo systemctl is-active docker
Plain Text
복사
3. GitHub Actions Workflow
# GitHub Actions 화면에 표시될 워크플로 이름
name: Week 6 CI/CD
on:
# main 브랜치에 코드가 반영되면 실행
push:
branches: [main]
# GitHub Actions 화면에서 직접 실행하는 것도 허용
workflow_dispatch:
# 저장소의 코드를 읽는 권한 부여
permissions:
contents: read
jobs:
build-and-deploy:
# GitHub에서 제공하는 Ubuntu 환경에서 작업 실행
runs-on: ubuntu-latest
steps:
# CI
# 저장소의 코드를 실행 환경으로 가져오기
- name: Checkout
uses: actions/checkout@v4
# 프로젝트 실행에 필요한 Java 21 설치
- name: Set up Java 21
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'
# gradlew 파일을 실행할 수 있도록 권한 부여
- name: Grant execute permission for gradlew
working-directory: commerce
run: chmod +x gradlew
# 테스트를 실행하고 JAR 파일 생성
- name: Test and build with Gradle
working-directory: commerce
run: ./gradlew clean build --no-daemon
# CD
# GitHub Secrets에 저장한 정보로 Docker Hub 로그인
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# Docker 이미지를 빌드하고 Docker Hub에 업로드
- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
# commerce 폴더의 Dockerfile과 빌드 결과 사용
context: ./commerce
# EC2와 동일한 x86 아키텍처의 이미지 생성
platforms: linux/amd64
# 빌드한 이미지를 Docker Hub에 업로드
push: true
# 커밋마다 고유한 이미지 태그를 붙임
tags: ${{ secrets.DOCKERHUB_USERNAME }}/commerce:${{ github.sha }}
# SSH로 EC2에 접속해 새 이미지 실행
- name: Deploy to EC2
env:
# GitHub Secrets에 저장한 EC2 접속 정보
EC2_HOST: ${{ secrets.EC2_HOST }}
EC2_USER: ${{ secrets.EC2_USER }}
EC2_SSH_KEY: ${{ secrets.EC2_SSH_KEY }}
EC2_KNOWN_HOSTS: ${{ secrets.EC2_KNOWN_HOSTS }}
# 방금 빌드한 이미지 이름과 태그
IMAGE: ${{ secrets.DOCKERHUB_USERNAME }}/commerce:${{ github.sha }}
run: |
# SSH 설정 파일을 저장할 폴더 준비
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 개인키와 서버 확인 정보를 파일로 생성
printf '%s\n' "$EC2_SSH_KEY" > ~/.ssh/deploy_key
printf '%s\n' "$EC2_KNOWN_HOSTS" > ~/.ssh/known_hosts
chmod 600 ~/.ssh/deploy_key ~/.ssh/known_hosts
# EC2에 접속해 아래 명령어 실행
ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=yes "$EC2_USER@$EC2_HOST" bash -s -- "$IMAGE" <<'REMOTE'
set -eu
image="$1"
# Docker Hub에서 새 이미지 다운로드
sudo docker pull "$image"
# 기존 컨테이너가 있다면 중지하고 삭제
sudo docker rm -f commerce 2>/dev/null || true
# 새 이미지로 컨테이너 실행
sudo docker run -d --name commerce --restart unless-stopped -p 8080:8080 "$image"
REMOTE
Plain Text
복사
위 코드는 main 브랜치에 변경 사항이 반영될 때 실행됩니다. 본인의 저장소에서 사용하는 브랜치명이 다르다면 강의 내용을 참고해 수정해주세요!
macOS / Windows 명령어 모아보기
과제
목표
•
Docker를 이용해 애플리케이션을 실행한다.
•
AWS EC2에 애플리케이션을 배포한다.
•
인터넷에서 배포된 API에 접속한다.
•
GitHub Actions를 이용한 자동 배포 흐름을 이해한다.
내 API 배포해보기 (선택)
AWS 리소스 사용 시 비용이 발생할 수 있어 선택 과제로 진행합니다. 가능하다면 직접 배포해보면서 강의에서 배운 내용을 확인해보세요!강의에서 배운 내용을 바탕으로 본인의 EC2 서버에 애플리케이션을 배포해주세요.
배포가 완료되었다면 인터넷에서 아래 API에 접속하여 응답을 확인해주세요.
http://EC2의-외부-주소:8080/deploy-check
Plain Text
복사
1.
외부에서 접속 가능한 API 주소
2.
API 주소에 접속하여 응답이 나온 화면 캡처
WIL 작성
6주차 강의 및 실습 내용을 week6/wil.md에 정리해주세요.
아래 질문에 대한 답변을 포함해주세요.
1.
Dockerfile, 이미지, 컨테이너는 각각 어떤 역할을 하나요?
2.
AWS와 EC2는 각각 무엇인가요?
3.
외부에서 EC2에 배포한 API를 호출할 때, IP 주소와 포트는 어떤 역할을 하나요?
추가로 아래 내용을 알아보고 정리해주세요!
이번 실습에서는 애플리케이션을 Docker 이미지로 만들고, EC2 서버에 배포해 외부에서 API를 호출해보았습니다.
하지만 실제 서비스를 운영하려면 서버를 실행하는 것 외에도 데이터베이스를 연결하고, 사용자가 접속할 도메인을 설정하는 등 여러 가지를 함께 고민해야 합니다.
배포와 클라우드의 세계에 대해 더 알아보아요.•
실제 서비스를 운영할 때 서버 외에 어떤 것들이 필요할까요?
•
사용자가 많아져 서버 한 대로 요청을 감당하기 어려워진다면 어떻게 할 수 있을까요?
•
이번 실습에서 사용한 EC2 외에, 애플리케이션을 배포할 수 있는 다른 방법에는 무엇이 있을까요?
❗️ RDS, 도메인, HTTPS, 로드 밸런서, 오토 스케일링, AWS Elastic Beanstalk 등의 키워드를 참고하여 관심 있는 내용을 자유롭게 조사해보면 더 좋아요 :)
제출해야 할 파일과 파일 경로
•
아래 경로는 필수 디렉터리와 파일을 기입한 것입니다.
•
실습에 따라 다른 디렉터리나 파일이 추가되어도 괜찮습니다.
[여러분의 저장소 이름]
├── README.md
├── .gitignore
├── .github/
│ └── workflows/
│ └── deploy.yml
├── commerce/
│ ├── Dockerfile
│ ├── .dockerignore
│ └── ... // 실습 코드
└── week6/
├── wil.md // 필수
└── deployment.png // 선택: 외부 API 응답 화면
Plain Text
복사
wil.md는 반드시 전체 300자 이상 작성해주세요! 300자 미만일 시 과제 제출이 불가합니다.
•
wil.md: 6주차 강의 내용과 위 질문에 대한 답변 정리
•
deployment.png: 외부 API 접속 결과 캡처
API 주소는 week6/wil.md에도 함께 작성해주세요.
마감 기한
와우스터디에서 확인해주세요.
제출 방법
자신의 레포지토리에 week6 폴더를 생성해 wil.md 파일을 제출합니다.
더 자세한 사항은 아래 링크를 참조해주세요.





