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를 포함한 모든 네트워크 인터페이스에서 접속 허용
'Project > Boilerplate' 카테고리의 다른 글
AWS EC2에서 OAuth2.0 로그인 및 쿠키 저장 문제 (2) | 2025.04.21 |
---|---|
AWS EC2 Next.js 배포 (1) | 2025.04.15 |
이미지 저장용 EC2 + S3 버킷 연동 (1) | 2025.04.14 |
Prometheus + Grafana 연동 (0) | 2025.04.12 |
로컬 개발에서 배포, 개발 환경 분리하기 (0) | 2025.04.10 |