스프링 AWS + Docker 배포를 해보자! - 2

Jun·2025년 5월 31일
post-thumbnail

이어서 RDS 연결 및 도커 설정을 해보겠습니다.

RDS 설정

RDS 인스턴스 생성하기

다음과 같이 검색창에 rds를 입력하고, RDS 대시보드에서 데이터베이스 생성 버튼을 클릭합니다.


다양한 데이터베이스 유형이 있지만 저희는 익숙한 MySQL을 선택하겠습니다.

기타 항목은 기본값으로 두고, 템플릿 부분에서 프리티어를 선택하여 줍니다.

설정 입력

다음으로 설정 부분은 아래 화면과 같이 동일하게 작성합니다. 여기서 마스터 사용자 이름은 root로, 마스터 암호는 root1234로 지정하겠습니다.

인스턴스 및 스토리지 구성

프리티어가 지원되는 db.t4g.micro를 선택하여 줍니다.

스토리지 설정에서 과금 방지를 위해 프리티어 최대 사용량이 20GiB이므로 20GiB으로 변경하고 스토리지 자동 조정도 꼭 꺼줍시다.

연결 정보 설정

다음으로 연결 항목에서 퍼블릭 엑세스 부분을 '예'로 변경하고, 그 아래 VPC 보안 그룹(방화벽) 부분에 새로 생성을 선택하고 보안 그룹에 적당한 이름을 설정합니다.

퍼블릭 엑세스를 활성화 하면 외부에서 데이터베이스에 접근할 수 있습니다.

보안 그룹은 네트워크 액세스를 제어하는 방화벽 역할입니다. 새로 생성하여 적용해 보겠습니다.

모든 설정을 완료하였으면 데이터베이스 생성 버튼을 클릭합니다.

생성되는 동안 시간이 걸릴 수 있습니다. 천천히 기다려 줍시다.

RDS 보안 그룹 설정하기

생성이 완료된 이후에 데이터베이스 상세 페이지에서 하단 보안 그룹 규칙 항목의 첫 번째 보안그룹을 선택합니다.

보안 그룹 ID를 선택하여 들어가줍니다.

인바운드 규칙 편집을 눌러줍니다.

인바운드 규칙 편집

인바운드 규칙 편집 버튼을 클릭하여 인바운드 규칙을 편집 및 삭제할 수 있습니다. 인바운드 규칙에서는 외부에서 특정 리소스(RDS, EC2 등)로 들어오는 트래픽을 허용하거나 차단할 수 있습니다.

다음과 같이 규칙 추가를 눌러 화면과 동일하게 3306 포트를 전체 개방하여 주시고, 기존의 인바운드 규칙은 삭제 버튼을 눌러 없애 줍니다. 규칙 저장을 누르고 마무리합니다.

RDS 파라미터 그룹 설정

파라미터 그룹은 RDS에소 데이터베이스 인스턴스의 동작을 제어하는 설정 그룹입니다. 인스턴스 생성 시 파라미터 그룹을 지정하지 않으면 기본 파라미터 그룹이 사용됩니다.

다시 RDS 페이지로 돌아와서 좌측 카테고리에서 파라미터 그룹 탭을 클릭해서 이동합니다.

파라미터 그룹 생성 버튼을 눌러봅시다.

세부 정보 구성은 다음과 동일하게 입력합니다. DB 엔진은 반드시 이전에 선택한 MySQL 버전과 동일하게 설정해야 합니다. 입력을 완료하면 생성 버튼을 클릭합니다.

방금 생성한 파라미터 그룹을 클릭하고 편집 버튼을 눌러줍니다.

이제 편집 모드에서 하나씩 설정을 변경해 보겠습니다. 우선 검색 창에 time_zone을 입력합니다.
데이터베이스에서 사용하는 시간을 애플리케이션과 서버 시간과 맞추기 위해 타임존을 Asia/Seoul 로 변경합니다.

그대로 검색창으로 돌아와서 char까지만 입력하고 다음에 해당하는 항목들을 전부 utf8mb4로 입력해 줍니다.

utf8mb4는 최대 4바이트를 지원하며, 이모지(emoji) 및 일부 언어의 특수 문자를 저장할 수 있습니다.

  • character_set_client
  • character_set_connection
  • character_set_database
  • character_set_filesystem
  • character_set_results
  • character_set_server

그리고 다시 검색창으로 돌아와서 colla까지만 입력하고 다음에 해당하는 항목들을 전부 utf8mb4_general_ci로 입력합니다.

마지막으로 max_connections을 수정합니다. 동시에 처리할 수 있는 연결 수의 최대값을 의미합니다. RDS의 Max Connection은 프리티어의 사양에 따라 자동으로 설정되기 때문에 더 넉넉하게 150개로 설정해 줍니다.

위 사항들을 모두 수정했으면 변경 사항 저장 버튼을 클릭하여 저장해줍니다.

이렇게 생성된 파라미터 그룹을 데이터베이스에 적용하겠습니다. 좌측 탭에서 데이터베이스를 클릭하고 생성한 데이터베이스를 선택 후 수정 버튼을 눌러줍니다.

그리고 하단의 추가 구성 항목에서 다음과 같이 방금 생성한 파라미터 그룹으로 변경해 줍니다. 이후 계속을 클릭합니다.

즉시 적용을 반영하고 수정사항을 저장합니다.

다음과 같이 수정 중 상태가 나타납니다. 조금 기다려 줍니다.

간혹 변경사항이 제대로 반영되지 않는 경우가 있기 때문에 수정이 완료되면 작업 탭에서 재부팅 버튼을 다시 눌러줍니다. 그리고 다시 기다려줍니다.

데이터베이스 연결

로컬에서 RDS에 접속이 잘 되는지 IntelliJ로 확인해 보겠습니다.

생성한 데이터베이스 상세 페이지로 돌아와서 아래 화면의 엔드포인트 부분을 복사하여 줍니다.

그리고 진행 중인 프로젝트를 IntelliJ로 열어주고 우측 탭에서 Database를 클릭하고 상단의 플러스 버튼을 클릭합니다.

그리고 다음과 같이 데이터 소스 -> MySQL을 순서대로 선택하여 줍니다.

Host 부분은 방금 복사한 엔드포인트로, UserPasswordrootroot1234를 입력하여 줍니다. 혹시라도 하단에 드라이버가 설치되지 않았다는 메세지가 뜨면 설명대로 설치하여 줍니다.

연결 테스트를 해보고 성공하면 그대로 적용과 확인을 순서대로 해줍니다.

콘솔 화면이 나오면 테스트용 스키마를 생성해보겠습니다.

아까 복사한 데이터베이스 엔드포인트를 yml 파일에 적용시킵니다.

Docker 설치 및 적용

터미널을 열어 EC2에 접속해서 Docker를 설치해봅시다.

먼저 sudo dnf update -y로 최신 버전으로 업데이트 해줍시다.

sudo dnf install -y docker Amazon Linux 2023에서 Docker를 설치하는 명령어
sudo systemctl start docker 설치한 Docker를 즉시 실행합니다.
sudo systemctl enable docker EC2 인스턴스를 재부팅해도 Docker가 자동으로 실행되도록 설정합니다.
sudo usermod -a -G docker ec2-user 현재 EC2 유저(ec2-user)를 Docker 그룹에 추가합니다. sudo 없이도 docker 명령을 사용할 수 있습니다.

Docker 파일 만들기

스프링 프로젝트 안에 Dokcerfile을 만들어 줍니다.

# Java 21 환경 제공
FROM amazoncorretto:21

# JAR 파일 경로를 ARG로 받음 (빌드 시 사용)
ARG JAR_FILE=build/libs/*.jar

# 작업 디렉토리 생성 (선택이지만 권장)
WORKDIR /app

# JAR 파일을 복사하면서 이름을 고정
COPY ${JAR_FILE} app.jar

# 포트 노출
EXPOSE 8080

# 시간대를 Asia/Seoul로 설정
RUN ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime && echo 'Asia/Seoul' > /etc/timezone

# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

Dockerfile을 작성하였다면 스프링 프로젝트 안에서 터미널을 열고 다음과 같은 명령어로 빌드를 해줍니다.
./gradlew clean build

혹시나 권한이 없어 안 된다면 chmod +x ./gradlew 명령으로 권한을 부여 후 다시 시도합니다.

다음으로 Docker 로그인이 되어 있지 않다면
docker login으로 Docker에 로그인 해줍니다.

다음은 터미널에서 다음과 같은 명령으로 Docker 이미지를 빌드합니다.

docker build --platform linux/amd64 -t <DockerHub_계정명>/<이미지명>:<태그> .
뒤의 태그는 생략 가능합니다.

이미지 빌드가 성공적으로 되었다면 다음과 같은 화면이 나오게 됩니다.

Docker 이미지 push

빌드된 이미지를 도커 허브에 올려주겠습니다

docker push <DockerHub_계정명>/<이미지명>:<태그> 명령으로 push 해줍니다.

Docker Hub에서 push된 이미지를 확인할 수 있습니다!

이제 EC2로 다시 돌아가서 터미널에서

docker login으로 Docker 로그인을 해주고

docker pull <이미지이름>:<태그>으로 Docker 이미지를 받아줍니다.

Docker 이미지 실행

이제 EC2에서 이미지를 기반으로 컨테이너를 실행합니다:

docker run -d --restart=always -p 8080:8080 --name <컨테이너이름>-app <DockerHub_계정명>/<이미지명>:<태그>

저는 likelion이라는 이미지 이름을 실행시킬 것이므로
docker run -d --restart=always -p 8080:8080 --name likelion-app treaty0321/likelion 이렇게 입력해 주었습니다. 이미지명 뒤에 태그는 생략 가능합니다.

옵션 설명:

  • -d: 백그라운드(detached) 실행

  • --restart=always: EC2가 재부팅되어도 컨테이너 자동 실행

  • -p 8080:8080: EC2의 8080 포트를 컨테이너의 8080 포트와 연결

  • --name: 실행될 컨테이너의 이름 지정

docker logs -f <컨테이너이름> 명령어를 통해 실행 중인 서버 로그를 실시간으로 확인할 수 있습니다!

배포 확인

배포된 주소로 들어가보면 배포가 완료된 걸 확인할 수 있습니다!

✅ 스프링 프로젝트 변경 사항 반영 방법

스프링 프로젝트에 수정 사항이 생겼다면, 변경 내용을 적용하기 위해 다음과 같은 과정을 거쳐야 합니다:

  1. 로컬에서 프로젝트를 다시 빌드합니다.

  2. 변경된 파일을 기반으로 새 Docker 이미지를 빌드합니다.

  3. Docker Hub에 이미지를 푸시합니다.

  4. EC2에서 기존 컨테이너를 종료하고, 새 이미지를 pull 받은 뒤 다시 실행합니다.

🔁 이 과정을 통해 수정된 코드가 실제 서버에도 정상적으로 반영됩니다.

마치며

다음에는 이어서 GitHub Actions를 이용한 CI/CD 구축을 진행해 보려고 합니다.


참고
Dockerdocs
배포의 정석
Docker를 활용해 AWS EC2에 Spring Boot 배포하기 (feat. Nginx)
AWS + Docker 배포

profile
꾸준하게

0개의 댓글