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)
4. 정상 동작 확인
curl http://localhost:8080/health
# 또는 외부에서
curl http://15.165.127.92:8080/health
5. 느낀점 & 팁
- JAR 교체 시 기존 프로세스 종료, 포트 충돌 주의
- 로그를 통한 원인 분석이 가장 빠른 해결책
- 배포 자동화/스크립트화 방법을 알아봐야겠다. 수정할 때마다 업로드를 하다보니 생산성이 매우 낮아짐을 느꼈다