Spring Boot 프로젝트에 RDS 연결하기
Spring Boot 애플리케이션을 AWS RDS와 연결하는 방법을 실습을 통해 정리해보았습니다.
이 실습에서는 MySQL 데이터베이스를 사용하며, IDE는 인텔리제이, 데이터베이스 관리도구로는 DBeaver을 사용하였습니다.
RDS 데이터베이스를 스프링부트 애플리케이션과 연결하고, Github Actions를 활용해 배포 환경에서 데이터베이스를 설정하는 방법을 살펴보겠습니다.
1. Spring Boot 프로젝트 생성
깃허브 실습 레포: https://github.com/bestlalala/cloudschool-Server.git
스프링부트 프로젝트를 생성한다.
Language: Java 17
Framework: Spring Boot 3.4.x, JDK 17
IDE: IntelliJ IDEA
Database: MySQL
SQL Client: DBeaver
[Dependencies]
Lombok
Spring Web
MySQL Driver
Spring Boot DevTools
2. RDS 데이터베이스 생성
AWS 관리 콘솔에서 RDS 검색 > 데이터베이스 생성
- 데이터베이스 생성 방식: 표준 생성
- 엔진 옵션: MySQL
템플릿
공부용으로 작업할 것이기 때문에, 프리티어로 설정한다.
프로덕션으로 선택하면 비용이 굉장히.. 많이 나올 수 있다.
설정
데이터베이스 이름을 설정하고, 관리자 계정(마스터) 암호를 설정한다.
@warning
DB 연결할 때 필요하기 때문에, 잘 기억해두거나 따로 적어두는 것이 좋다.
- DB 인스턴스 식별자 (초기 데이터베이스 이름)
- 마스터 사용자 이름
- 마스터 암호
스토리지
스토리지 크기는 20GiB로 설정한다. 이는 프리티어에서 제공하는 용량의 최대치이다.
스토리지 자동 조정은 기본값으로 체크가 되어 있는데, 이를 해제한다.
스토리지 자동 조정이 활성화되어 있을 경우, 20GiB가 초과되었을 때 요금이 추가로 부과될 수 있다.
연결
EC2 컴퓨팅 리소스에 연결 안 함: 여기서는 EC2 인스턴스가 필요하지 않기 때문에 연결하지 않는다.
추가설정: 퍼블릭 액세스 허용 - 예
보안그룹에서 포트 개방
데이터베이스 > VPC 보안 그룹 > 보안그룹 ID 선택 > 인바운드 규칙 편집
MySQL 접속을 위해 3306번 포트를 열어준다
3. 데이터베이스 연결
DBeaver에서 데이터베이스를 연결한다.
(인텔리제이 데이터베이스 탭에서도 연결할 수 있다! 방법은 거의 동일)
- Server Host : 데이터베이스 엔드포인트
- Port : 데이터베이스 포트 번호
- Databse: (초기)데이터베이스 이름
- Username : 데이터베이스 생성시 설정했던 마스터 사용자 이름
- Password : 데이터베이스 생성시 설정했던 마스터 암호
4. GitHub Actions에 업로드
1) workflow 파일 생성
`.github/workflows/cs.yaml` 파일을 만들어서 다음과 같이 작성한다.
DB URL, 사용자 이름, 비밀번호는 노출되면 안 되기 때문에, secrets 변수로 설정할 것이다.
name: cloudschool
on:
push:
branches: ["main"]
env:
SPRING_DATASOURCE_URL: ${{ secrets.DB_URL }}
SPRING_DATASOURCE_USERNAME: ${{ secrets.DB_USERNAME }}
SPRING_DATASOURCE_PASSWORD: ${{ secrets.DB_PASSWORD }}
jobs:
# Spring Boot 애플리케이션을 빌드하여 도커허브에 푸시하는 과정
build-docker-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# 1. Java 17 세팅
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# Spring Boot 애플리케이션 빌드를 위한 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Spring Boot Application Build
- name: Build with Gradle
run: ./gradlew clean build
2) Secrets 등록
데이터베이스 URL이나 암호는 깃허브에 그냥 올리면 안 된다.
따라서 GitHub Actions의 Secrets 변수를 생성하고, 이 변수로 연결해야 한다.
깃허브 레포지토리에서 Settings > Security > Secrets and variables > Actions > New repository secret
다음과 같이 변수를 설정해준다.
DB_URL:jdbc:mysql://{RDS-endpoint}:{port}/{(초기)데이터베이스 이름}
DB_USERNAME: 마스터 사용자 이름 (ex. admin)
DB_PASSWORD: 마스터 사용자 비밀번호
@warning
DB_URL은 RDS 엔드포인트를 그대로 적는 게 아니라, 위의 예시처럼 적어야 한다!!
3) application.yaml 생성
GitHub Actions에서 db 테스트를 할 수 있도록 `application-test.yaml` 파일을 생성 후 다음과 같이 작성한다.
workflow 파일의 env에서 설정한 변수를 `${변수이름}`으로 사용하면 된다.
spring:
datasource:
url: ${SPRING_DATASOURCE_URL}
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: create-drop
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect
format_sql: true # SQL 포맷팅
4) GitHub에 푸시 후 Actions 확인
git add .
git commit -m "[CONFIG] Add workflow"
git push
나는 중간에 하다가 설정을 잘못해서 빌드 에러가 몇 번 났어서 수정한 끝에 저렇게 성공할 수 있었다.
다음 글에서는 도커 이미지를 ECR에 푸시하고, 이를 이용하여 ECS로 배포하여 외부 접근 가능하도록 하는 과정에 대해 다루겠습니다.