T_era

Spring Boot EC2 배포 & 테스트 과정에서 문제 해결 본문

Programing/Spring

Spring Boot EC2 배포 & 테스트 과정에서 문제 해결

블스뜸 2025. 6. 30. 18:29

1. 목표

  • Spring Boot 애플리케이션을 AWS EC2에 배포
  • /health 엔드포인트가 인증 없이 정상적으로 동작하도록 구현
  • 실시간 배포/운영 환경에서 발생한 문제와 해결 과정 기록

2. 배포 및 실행 과정

2-1. JAR 빌드 및 업로드

./gradlew clean build -x test
scp -i "/Users/ljy/Library/KeyPairs/tera199810-KeyPair.pem" build/libs/expert-0.0.2-SNAPSHOT.jar ec2-user@15.165.127.92:~/

2-2. EC2 접속 및 기존 프로세스 종료

ssh -i "/Users/ljy/Library/KeyPairs/tera199810-KeyPair.pem" ec2-user@15.165.127.92

# 실행 중인 프로세스 확인 및 종료
ps -ef | grep expert-0.0.2-SNAPSHOT.jar
kill -9 <PID>

2-3. 서버 실행

nohup java \
-Dspring.profiles.active=aws \
-Dspring.datasource.url="jdbc:mysql://<RDS-ENDPOINT>:3306/<DB_NAME>?allowPublicKeyRetrieval=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC" \
-Dspring.jpa.hibernate.ddl-auto=update \
-DDB_SCHEME=<DB_NAME> \
-DDB_USERNAME=<DB_USER> \
-DDB_PASSWORD='<DB_PASSWORD>' \
-DSECRET_KEY='<SECRET_KEY>' \
-DAWS_ACCESS_KEY='<AWS_ACCESS_KEY>' \
-DAWS_SECRET_KEY='<AWS_SECRET_KEY>' \
-jar expert-0.0.2-SNAPSHOT.jar > ~/app.log 2>&1 &

3. 트러블슈팅 과정

3-1. /health 400 Bad Request 문제

  • 증상: /health 호출 시 400 Bad Request 발생
  • 원인:
    • JwtFilter에서 /auth만 토큰 검사 예외, /health는 예외 처리 안 됨
    • Authorization 헤더 없으면 400 반환

🔧 해결

// JwtFilter.java
String url = httpRequest.getRequestURI();
if (url.startsWith("/auth") || url.startsWith("/health")) {
    chain.doFilter(request, response);
    return;
}
  • /health도 JWT 검사 없이 통과하도록 코드 수정

3-2. JAR 파일 교체 및 반영

  • 기존 JAR 삭제 후 새 JAR 업로드
  • 서버 재실행

3-3. 포트 충돌(8080 already in use)

  • 증상: 서버 실행 시 "Port 8080 was already in use" 에러
  • 원인: 이전 프로세스가 정상 종료되지 않아 8080 포트 점유
  • 해결:
    sudo lsof -i :8080
    kill -9 <PID>

4. 정상 동작 확인

curl http://localhost:8080/health
# 또는 외부에서
curl http://15.165.127.92:8080/health
  • 결과:
    ok

5. 느낀점 & 팁

  • JAR 교체 시 기존 프로세스 종료, 포트 충돌 주의
  • 로그를 통한 원인 분석이 가장 빠른 해결책
  • 배포 자동화/스크립트화 방법을 알아봐야겠다. 수정할 때마다 업로드를 하다보니 생산성이 매우 낮아짐을 느꼈다