이지은님의 블로그
250321 - Java Spring 일정 과제 과정과 트러블 슈팅: AWS EC2, RDS를 Java Spring 프로젝트와 연결하기(테스트코드, 환경변수, 보안그룹 문제) 본문
250321 - Java Spring 일정 과제 과정과 트러블 슈팅: AWS EC2, RDS를 Java Spring 프로젝트와 연결하기(테스트코드, 환경변수, 보안그룹 문제)
queenriwon3 2025. 3. 21. 10:30▷ 오늘 배운 것
과제를 하면서 발생한 트러블에 대해 트러블 슈팅을 작성해보려고 한다.
<<목차>>
1. 무한로딩 문제로, 1️⃣ EC2 인스턴스 연결 👉 2️⃣ SSH 클라이언트
2. 테스트 코드의 문제로 빌드 실패
3. 프로젝트 실행시 환경변수 관련 문제 발생
4. RDS 연결 무한 로딩 문제
1. 무한로딩 문제로, 1️⃣ EC2 인스턴스 연결 👉 2️⃣ SSH 클라이언트
EC2과 RDS에 스프링 부트를 연결하는 방법은 두가지가 있다.
1️⃣ EC2 인스턴스 연결을 통해 AWS에서 프롬프트 창을 열어 ubuntu에 접속하는 방법
2️⃣ SSH 클라이언트로 로컬 프롬프트 창을 열어 ubuntu에 접속하는 방법
먼저 1️⃣을 택하여 AWS에서 프롬프트창을 열어서 다음과 같이 명령어를 작성한다. (AWS에서 창을 열어 서버에 빠르게 접속 가능하고 명령어를 작성할 수 있다는 장점이 있어 1️⃣을 먼저 선택했다.)
(java 파일을 실행하기 위한 jdk 17 설치)
sudo apt update && /
sudo apt install openjdk-17-jdk -y
(jdk 버전 확인)
java --version
(작성한 프로젝트를 깃허브에서 clone)
git clone [깃허브주소]
🚨 에러 발생
./gradlew clean build
다음 클린 + 빌드를 하려고 했더니 다음과 같이 에러가 발생한다.
Exception in thread "main" java.lang.RuntimeException: Wrapper properties file '/home/ubuntu/spring-plus/gradle/wrapper/gradle-wrapper.properties' does not exist.
at org.gradle.wrapper.GradleWrapperMain.main(SourceFile:74)
Exception in thread "main" java.lang.RuntimeException: Could not load wrapper properties from '/home/ubuntu/spring-plus/gradle/wrapper/gradle-wrapper.properties'.
at org.gradle.wrapper.WrapperExecutor.<init>(SourceFile)
at org.gradle.wrapper.GradleWrapperMain.main(SourceFile:39)
Caused by: java.lang.RuntimeException: No value with key 'distributionUrl' specified in wrapper properties file '/home/ubuntu/spring-plus/gradle/wrapper/gradle-wrapper.properties'.
at org.gradle.wrapper.WrapperExecutor.readDistroUrl(SourceFile:2)
... 2 more
이 에러는 Gradle을 실행할 때 필수 파일인 gradle-wrapper.properties가 없거나, 손상돼서 발생하는 오류이다. 따라서 gradle-wrapper.properties를 작성 해주었다.
—> 하지만 ./gradlew clean build
과정에서 Test코드에 대한 무한로딩이 걸려 연결에 실패하고 말았다.
(인스턴스 재생성을 해도 똑같이 무한로딩이 발생했다.)
💬 해결 과정
기존 방식의 무한 로딩부분이 예외없이 계속 발생해
2️⃣ SSH를 이용하여 연결을 하는 것으로 방법을 바꿔보았다.
(참고한 블로그)
https://bcp0109.tistory.com/356
AWS 1편: EC2 생성 후 Spring Boot 띄우기
Overview AWS EC2 인스턴스를 생성하고 Spring Boot 서버를 띄워보는 것까지 진행합니다. 주 목표는 서버를 외부에 제공하는 거라서 따로 배포 시스템을 구축하지 않고 단순히 빌드 파일을 복사해서 수
bcp0109.tistory.com
AWS에서 알려주는 연결방법은 로컬 터미널창에서 다음과 같은 명령어를 작성하는 것이다.
chmod 400 expert-keypair.pem
ssh -i "expert-keypair.pem" ec2-13-125-252-93.ap-northeast-2.compute.amazonaws.com
그럼 다음과 같이 ubuntu 서버에 접속이 가능하다.
로컬 터미널로 통한 접속 또한 자바 스프링을 실행하기 위한 jdk 설치가 필수다. 따라서 설치과정을 거친다.
sudo apt-get update
sudo apt-get install openjdk-17-jdk
이후 프로젝트를 빌드를 해보려고 빌드 명령어를 작성해보았는데, 다음과 같은 에러가 발생한다.(해결은 2번 이후에서 가능)
2. 테스트 코드의 문제로 빌드 실패
이런 빌드에러가 뜨는 것을 보아 아마 1에서 빌드가 안되었던 이유는 다음과 같은 테스트 에러였던 것으로 확인할 수 있다.
그래서 다시 테스트 코드로 돌아와서 테스트 코드의 에러를 해결해보려고 한다. 테스트 코드의 에러는 다음과 같다.
🚨 에러 발생
ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@23e2c1ca testClass = org.example.expert.domain.todo.controller.TodoControllerTest, locations = [], classes = [org.example.expert.ExpertApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@61e94def,
...
이 에러는 Spring Test 환경에서 ApplicationContext를 로드하는 데 실패했다는 뜻이다. @WebMvcTest를 쓴 상황에서 의존성이 제대로 주입되지 않으면 자주 발생한다.
테스트 실행 시 필요한 Bean 주입이 실패해서 Spring Context가 동작하지 않은 것이 문제다. 원인은 의존 클래스를 로드할 수 없었던 것으로 보인다.
💬 해결 과정
그래서 의존 클래스를 로드할 수 있도록 어노테이션을 사용해서 명시적으로 지정해보았다.(수동으로 빈 등록)
@Import({JwtUtil.class})
@WebMvcTest(TodoController.class)
class TodoControllerTest {
테스트 코드에 어노테이션을 붙이고 실행을 시키니 + 테스트에 환경변수 지정 후 테스트코드 오류를 해결할 수 있었고, 빌드 또한 진행되는걸 확인할 수 있었다.
3. 프로젝트 실행시 환경변수 관련 문제 발생
🚨 에러 발생
다음과 같이 실행권한을 부여한 후, 백그라운드 실행을 시켰는데, 환경 변수 관련문제가 발생했다.
sudo chmod 777 expert-0.0.1-SNAPSHOT.jar
sudo nohup java -jar expert-0.0.1-SNAPSHOT.jar &
sudo cat nohup.out
에러 내용의 핵심은 작성한 프로젝트 안에 작성된 환경변수가 적용되지 않은 것 같았다.
💬 해결 과정
이것때문에 환경변수를 모두 하드코딩 하는 방식으로 해결하려고 했지만, RDS를 연결해서 환경변수를 적용하는 게 좋을 것 같아 RDS를 연결했다.
-> RDS 연결후 환경변수를 하드코딩 하는 방법을 사용
4. RDS 연결 무한 로딩 문제
🚨 에러 발생
다음과 같이 RDS 생성후 엔드포인트를 설정하고 user와 비밀번호를 입력한다. 여기서 Test Connection을 하면 RDS와 연결이 되어야 하는게 맞는데 무한로딩 되는 문제가 있었다.
💬 해결 과정
이 문제는 보안그룹의 설정에 대한 문제로, mysql 포트(3306)를 연결해주는 방식으로 보안그룹을 따로 설정해 주었다. 보안그룹을 설정하면 접근 권한이 허용되어 무한 로딩되는 문제를 해결 할 수 있었다. (RDS 연결 완료)
🚨 에러 발생
RDS연결을 하고 데이터베이스 실행환경에 따른 환경변수를 하드코딩해준 다음 다시 EC2 연결을 위해 다시 명령어를 입력했다. 그러니 다음과 같은 에러가 발생했다.
💬 해결 과정
데이터베이스 엔진이 연결될 곳이 없는 것 같다는 생각을 하게 되었고, 다시 인텔리제이> 데이터베이스로 돌아와 스키마를 생성해 주는 방법으로 에러를 해결할 수 있었다.
이를 통해서 프로젝트와 RDS를 연결할 수 있었다. (+스키마 생성까지 할 것)
실행되는 화면
sudo java -jar expert-0.0.1-SNAPSHOT.jar
💡 느낀점
EC2를 연결하기까지 크게 4개의 문제점이 있었던 것 같다.
1️⃣ 테스트 코드 문제
2️⃣ 환경변수 문제
3️⃣ 보안 그룹 설정 문제
4️⃣ 데이터 베이스 연결 및 스키마 생성 문제
문제들이 하나씩 발생할때 천천히 해결하고, 어떤 문제로 발생했는지 알아가는 과정에서 많은 우여곡절이 있었지만 해결해내는데 큰 의미를 둘 수 있었다.