EC2, RDS, Spring Boot, Redis를 활용한 아키텍처 구성은 아래와 같다.
1. EC2 생성
서울 리전으로 맞추기 & 인스턴스 시작 버튼 클릭
인스턴스 이름 설정
애플리케이션 및 OS 이미지 → Ubuntu (버전 24.04)로 설정
인스턴스 유형은 t3a.small 이상으로 생성할 것을 권장함
- 프리티어인 t2.micro에서 Spring Boot, Redis를 다 돌리기엔 성능이 모자라기 때문에 중간에 EC2가 멈춰버리기도 함
원래는 키페어를 생성해서 셋팅을 해야 하지만, Redis만 연결시켜 보고 테스트 후 바로 종료시킬 것이기 때문에 [키 페어 없이 계속 진행(권장되지 않음)]을 선택
- 서비스를 하는 입장이라면 키 페어를 만드는 걸 추천
네트워크 설정 → 편집 클릭
- VPC는 기본값 그대로 셋팅
- 보안 그룹 규칙 추가
- 유형: 사용자 지정 TCP / 포트 범위: 8080 / 소스 유형: 위치 무관
그후 인스턴스 시작
2. RDS 생성
데이터베이스 생성
엔진 옵션으로 [MySQL] 선택
템플릿 [프리 티어] 선택
DB 인스턴스 이름 및 마스터 암호 설정
연결에서 퍼블릭 액세스 [예]로 설정
- 외부에서 DB에 접근을 쉽게 하기 위함
DB 초기 이름 지정 및 자동 백업 비활성화
DB 생성 및 VPC 보안 그룹 인바운드 규칙 추가
- MySQL RDS 서버로 접속할 때 3306번 포트로 모든 IP가 접근(0.0.0.0/0)할 수 있도록 함
인스턴스 설정에 들어가 [연결] 클릭
EC2 인스턴스에 원격으로 접속
3. EC2에 Redis 설치
Redis 설치하기
sudo apt update
sudo apt install redis
Redis 잘 설치됐는지 확인
redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit
4. EC2에 Spring Boot 프로젝트 셋팅하기
JDK 설치하고 잘 설치됐는지 확인하기
- Spring Boot: 3.x.x / JDK: 17
sudo apt install openjdk-17-jdk
java -version
Spring Boot 프로젝트에서 application.yml 정보 수정하기
- Spring Boot 프로젝트 코드를 EC2로 옮겨올 때 GitHub를 사용함
- RDS 주소는 앤드 포인트를 복사해서 넣으면 됨
# local
spring:
profiles:
default: local
datasource:
url: jdbc:mysql://localhost:3306/springredis
username: root
password: mysql
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
data:
redis:
host: localhost
port: 6379
logging:
level:
org.springframework.cache: trace
---
# prod
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mysql://{rds 주소}:3306/mydb
username: admin
password: password
GitHub Repository에 올리기
- private repository 생성
- Spring Boot Terminal에 명령어 입력
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/hcg0127/spring-redis-project.git
git push -u origin main
- 참고: 실습에서는 편의를 위해 application.yml 정보를 .gitignore 처리하지 않았음 → 실제 프로젝트에서는 보안을 위해 application.yml 정보를 .gitignore 처리해서 버전 관리가 되지 않게 만들어야 함 (yml 파일은 따로 EC2에 전송)
EC2로부터 GitHub Clone 받기
- clone 입력 후 계정 이름과 발급받은 토큰 입력해야 실행됨
git clone {GitHub Repository 주소}
cd {프로젝트 경로}
서버 실행시키기
- JPA의 ddl 옵션으로 테이블도 생성됨
# 스프링 프로젝트 경로로 들어가서 아래 명령어 실행
./gradlew clean build -x test
cd build/libs
java -jar -Dspring.profiles.active=prod {빌드된 jar 파일명}
- 아래처럼 뜨며 빌드가 되지 않을 땐 [chmod +x gradlew] 명령어를 입력한 뒤 다시 명령어를 입력하면 빌드가 진행됨
-bash: ./gradlew: Permission denied
5. RDS에 더미데이터 넣기
DB GUI 툴로 RDS에 접속하기 (DataGrip 활용)
더미 데이터 넣기
-- 높은 재귀(반복) 횟수를 허용하도록 설정
-- (아래에서 생성할 더미 데이터의 개수와 맞춰서 작성하면 된다.)
SET SESSION cte_max_recursion_depth = 1000000;
-- boards 테이블에 더미 데이터 삽입
INSERT INTO boards (title, content, created_at)
WITH RECURSIVE cte (n) AS
(
SELECT 1
UNION ALL
SELECT n + 1 FROM cte WHERE n < 1000000 -- 생성하고 싶은 더미 데이터의 개수
)
SELECT
CONCAT('Title', LPAD(n, 7, '0')) AS title, -- 'Title' 다음에 7자리 숫자로 구성된 제목 생성
CONCAT('Content', LPAD(n, 7, '0')) AS content, -- 'Content' 다음에 7자리 숫자로 구성된 내용 생성
TIMESTAMP(DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 3650 + 1) DAY) + INTERVAL FLOOR(RAND() * 86400) SECOND) AS created_at -- 최근 10년 내의 임의의 날짜와 시간 생성
FROM cte;