Project/Boilerplate

AWS EC2+RDS SpringBoot+MySQL 배포

조용우 2025. 4. 15. 02:48

1. ./gradlew build 로 스프링부트 빌드해서 jar 파일 생성
2. scp -i <비밀키>.pem <파일경로> ubuntu@<ec2 IP>:/home/ubuntu

-> ec2 :/home/ubuntu에 jar 파일 저장

3. ssh -i <비밀키>.pem ubuntu@<ec2 IP> 로 ec2 접속

4. .env 파일 생성 (환경 변수 설정)

5. 환경변수 설정 및 기존 프로세스 종료 자동화 스크립트

deploy.sh

#!/bin/bash

# 1. 환경 변수 로딩
export $(grep -v '^#' .env | xargs)

# 2. 기존 프로세스 종료 (포트 8080 기준)
PID=$(lsof -ti:8080)
if [ -n "$PID" ]; then
  echo "🔄 기존 Spring Boot 프로세스 종료 중 (PID: $PID)..."
  kill -9 $PID
fi

# 3. 새 JAR 실행 (백그라운드 + 로그 저장)
echo "🚀 Spring Boot 애플리케이션 실행 중..."
nohup java -jar boilerplate-0.0.1-SNAPSHOT.jar > app.log 2>&1 &

# 4. 완료 메시지
echo "✅ 배포 완료. 로그는 app.log 에 저장됨"

 

6. /deploy.sh로 어플리케이션 실행

 

ps aux | grep java
결과에 java -jar ...boilerplate... 같은 항목이 보이면 정상 실행 중입니다.

tail -f app.log
Tomcat started on port(s): 8080
Started BoilerplateApplication in 5.678 seconds

-> 어플리케이션 로그가 전부 app.log에 찍히는데, 실시간으로 그걸 확인하게 해줄 수 있는 명령어. Ctrl + C 로 나감 

 

 

 

 

트러블슈팅

1.

2025-04-14 10:16:25.652 [main] WARN  o.h.e.j.e.i.JdbcEnvironmentInitiator - HHH000342: Could not obtain connection to query metadata
java.lang.RuntimeException: Driver com.mysql.cj.jdbc.Driver claims to not accept jdbcUrl, boilerplate-database.c1mm2iqginkj.ap-southeast-2.rds.amazonaws.com?rewriteBatchedStatements=true
        at com.zaxxer.hikari.util.DriverDataSource.

➡️ JDBC URL 앞에 jdbc:mysql://... 접두사 없어서 발생
jdbc:mysql://${DB_URL}/boilerplate
이런식으로 들어와야 함 

 

2.

ernate.type.BasicTypeReference@5c5c784c
2025-04-14 10:18:41.026 [main] DEBUG o.hibernate.type.BasicTypeRegistry - Adding type registration imm_serializable -> org.hibernate.type.BasicTypeReference@6a299b9d
2025-04-14 10:18:41.733 [main] INFO  o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer
2025-04-14 10:18:41.824 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2025-04-14 10:19:13.273 [main] WARN  o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 0, SQLState: 08S01
2025-04-14 10:19:13.275 [main] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Communications link failure

 

 

RDS -> 데이터베이스 -> boilerplate -> 보안그룹 규칙 -> EC2 Security Group - Inbound 있는거 클릭 -> 보안 그룹 ID 클릭 -> 
MYSQL/Aurora
TCP
3306
EC2가 속한 보안 그룹으로 인바운드 규칙 추가

 

 

3.

프론트에서  백엔드로 요청 보내면 실패함

ubuntu@ip-IP:~$ curl http://URL:8080/api/posts/list
curl: (56) Recv failure: Connection reset by peer


🔍 이 에러의 의미
✅ 요청은 백엔드 서버(172.31.5.18:8080)까지 도달했지만,
❗ 백엔드가 응답을 주는 과정에서 강제로 연결을 끊었다는 의미입니다.
즉, CORS나 보안 그룹 문제가 아니라, Spring Boot 앱이 연결을 거부한 것.

 

해결 방법:
가장 가능성 높은 원인
✅ Spring Boot가 127.0.0.1에서만 실행 중
server.address=127.0.0.1 또는 기본 설정인 경우
이럴 땐 EC2 내부에서는 통신되지만, 다른 EC2에서 접근 시 "접속은 됐지만 reset"됨

✅ 해결 방법
Spring Boot를 0.0.0.0에 바인딩해야 합니다:

옵션 A: application.properties에 명시
# application-prod.properties 또는 .yml에 추가
server.address=0.0.0.0

옵션 B: 실행 명령어에 명시
java -jar boilerplate.jar --server.address=0.0.0.0
→ 이렇게 하면 EC2의 프라이빗 IP를 포함한 모든 네트워크 인터페이스에서 접속 허용