티스토리 뷰

나는 이번 프로젝트에서 JWT(AccessToken+RefreshToken)을 활용하여 로그인 기능을 만들었다. 그래서 JWT 생성에 필요한 Issuer와 SecretKey를 .properties 설정파일에 입력한 뒤에 @ConfigurationProperties 어노테이션을 사용하여 하나의 클래스로서 관리하고자 하였다. 또한 이 클래스를 Bean 객체로 만들어 의존주입하여 편하게 사용하려고 클래스레벨에 @Component 어노테이션까지 붙여주었다.

오류상황

TokenProvider와 통합테스트 코드를 작성하고 있었다. JWT의 SecretKey는 노출되면안되기 때문에 .gitignore에 등록해놓았다. 그럼 나중에 CI/CD 파이프라인 구축할 때 당연히 JWT관련 properties파일이 없기에 테스트코드에 오류가 발생할 것이 보였다. 그래서 테스트코드전용 TestJwtProperties 클래스를 만들고 실제 JwtProperties에 의존하고 있는 클래스들에 한해 @MockBean을 주입하고 스텁을 설정하였다.

 하지만 여기서 아래와 같은 오류가 발생하였다.

더보기

Caused by: java.lang.IllegalStateException: Unable to register mock bean com.developer.smallRoom.application.auth.jwt.JwtProperties expected a single matching bean to replace but found [jwt-com.developer.smallRoom.application.auth.jwt.JwtProperties, jwtProperties]

위의 오류를 해석해보면 mock bean을 등록할 수가 없다고하는데 그 이유가 싱글톤의 빈 객체를 기대했지만 두개의 빈객체가 발견되었다는 것이다.

 

오류이유 및 해결

@ConfigurationProperties가 붙은 클래스를 Bean객체로 등록하는 방법은 두 가지가 있다고 한다.

 

첫째 .  컴포넌트 스캔이 가능하도록 @Component 어노테이션을 붙여 Bean으로 등록하는 방법

둘째 .  @EnableConfigurationProperties 어노테이션 value 속성에 해당 클래스를 지정하는 방법

 

이렇게 두가지가 존재하는데 나같은 경우 두 방법을 모두 사용하는 실수를 해버려서 동일한 클래스에 대한 Bean 객체가 두개 등록되어버려서 MockBean이 주입되지 않는것이였다. 

 

그래서 @EnableComfigurationProperties에 설정을 지우니 @MockBean이 주입되고 테스트 코드가 성공하였다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함