CODING/스파르타 내일배움캠프 TIL

55_Spring 플러스 주차 개인 과제 트러블슈팅_25.3.19(수)

codingTrip 2025. 3. 20. 23:06

2025.03.19(수)

Spring 플러스 주차 개인 과제 트러블슈팅

도전

Lv 3-12. AWS 활용

로컬에서 ./gradlew clean build을 했으나 아래와 같은 문제가 발생했다.

Error creating bean with name 'jwtAuthenticationFilter' defined in file [/Users/mac/Desktop/spring-plus/spring-plus/build/classes/java/main/org/example/expert/config/JwtAuthenticationFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'org.example.expert.config.JwtUtil' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

 

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.example.expert.config.JwtUtil' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

mac@macs-MacBook-Pro spring-plus % ./gradlew clean build

> Task :test

ExpertApplicationTests > contextLoads() FAILED
    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180
        Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1806
            Caused by: jakarta.persistence.PersistenceException at AbstractEntityManagerFactoryBean.java:421
                Caused by: org.hibernate.exception.GenericJDBCException at StandardSQLExceptionConverter.java:63
                    Caused by: java.sql.SQLException at SQLError.java:130

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

> Task :test FAILED

TodoControllerTest > todo_단건_조회에_성공한다() FAILED
    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180
        Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:795
            Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException at DefaultListableBeanFactory.java:1880

TodoControllerTest > todo_단건_조회_시_todo가_존재하지_않아_예외가_발생한다() FAILED
    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:145

3 tests completed, 3 failed

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///Users/mac/Desktop/spring-plus/spring-plus/build/reports/tests/test/index.html

* Try:
> Run with --scan to get full insights.

BUILD FAILED in 7s
8 actionable tasks: 8 executed

 

테스트 코드에서 문제가 발생했다.

 

❌ 환경설정문제

처음에는 아래와 같은 설정 문제인 줄 알았으나 직접적인 원인은 아니었다.

  1. build.gradle
  2. application.properties

전에 문제 발생 시에는 jwt.secret.key 등

환경변수 설정만 잘해주면 다시 실행이 잘 되었어서

시도했으나 실패했다.

 

✅ @MockBean 설정하기

TodoControllerTest 파일에 JWTUtil을 설정해주었다.

 @MockBean
    private JwtUtil jwtUtil;

이전에는 따로 설정 없이도 잘 되었으나

Spring Security 도입 후, JWT 인증이 추가되었기 때문에 문제가 발생한 것으로 보인다.

 

💢 수정 후 추가 오류 발생

mac@macs-MacBook-Pro spring-plus % ./gradlew clean build
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
2025-03-19T17:01:44.191+09:00  INFO 13409 --- [expert] [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2025-03-19T17:01:44.196+09:00  INFO 13409 --- [expert] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...

> Task :test

TodoControllerTest > todo_단건_조회에_성공한다() FAILED
    java.lang.AssertionError at TodoControllerTest.java:60

TodoControllerTest > todo_단건_조회_시_todo가_존재하지_않아_예외가_발생한다() FAILED
    java.lang.AssertionError at TodoControllerTest.java:76

2025-03-19T17:01:44.229+09:00  INFO 13409 --- [expert] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

> Task :test FAILED

3 tests completed, 2 failed

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///Users/mac/Desktop/spring-plus/spring-plus/build/reports/tests/test/index.html

* Try:
> Run with --scan to get full insights.

BUILD FAILED in 27s
9 actionable tasks: 9 executed

HTTP 상태 코드가 예상했던 200(OK)이 아닌 401(Unauthorized)로 반환되었기 때문에 테스트가 실패했다.

 

✅  SecurityMockMvcRequestPostProcessors.user 생성

import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors;
...

mockMvc.perform(get("/todos/{todoId}", todoId)
        .with(SecurityMockMvcRequestPostProcessors.user("user")))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.id").value(todoId))
        .andExpect(jsonPath("$.title").value(title));

security Mock user 객체를 만들어주니 아래와 같이 해결이 되었다.

mac@macs-MacBook-Pro spring-plus % ./gradlew clean build
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
2025-03-19T17:19:35.777+09:00  INFO 13713 --- [expert] [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2025-03-19T17:19:35.782+09:00  INFO 13713 --- [expert] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2025-03-19T17:19:35.807+09:00  INFO 13713 --- [expert] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

BUILD SUCCESSFUL in 28s
9 actionable tasks: 9 executed

 


파일 전송 문제

scp -i /Users/mac/Downloads/spring-plus-server-key-pair.pem build/libs/expert-0.0.1-SNAPSHOT.jar ec2-user@52.79.139.63:/home/ec2-user/

위의 형식으로 로컬에 있는 snapshot.jar 파일을 aws PC에 전송하고자 했다.

그러나 작동하지 않았다.

 

  절대경로, 상대경로

결론은 상대경로가 아닌 절대경로로 해야 한다는 것이었다.

 scp -i ~/Downloads/spring-plus-server-key-pair.pem ~/Desktop/spring-plus/spring-plus/build/libs/expert-0.0.1-SNAPSHOT.jar ubuntu@52.79.139.63:/home/ubuntu

또한 aws pc의 위치도 pwd를 통해 제대로 설정해주어야 한다.