기록하기

Controller 테스트 시 인증 정보 주입(Spring Security + JWT) 본문

Server/Spring Boot

Controller 테스트 시 인증 정보 주입(Spring Security + JWT)

jjungdev 2022. 5. 8. 20:36

프로젝트를 수행하던 중 REST docs 설정을 한 뒤 간단한 ControllerTest 코드를 수행해보았으나 build 가 되지 않는 문제점을 발견했다.

오류의 주 내용은, 빈 주입이 잘 되지 않아서 security 설정에서 문제가 발생함을 알게 되었고 Spring Security + JWT 방식으로 인증, 인가 기능을 활용했던 프로젝트에서 인증된 정보를 제공받지 않고서는 단위테스트를 실행할 수 없음을 알게 되었다.

 

따라서 미리 설계해둔 custom 한 UserDetailsService 클래스(필자의 경우 UserService 라는 이름으로 설계를 했다.) 에서 인증 정보를 먼저 제공받은 뒤 테스트를 실행할 수 있도록 처리가 필요했다.

@Service
@RequiredArgsConstructor
public class UserService implements UserDetailsService {
	...
}

 

@WithUserDetails

spring.io  에서의 공식문서에 의하면, "custom UserDetailsService 로 UserDetails 와 커스텀 타입을 모두 구현한 객체를 반환한다. 이런 상황에선 custom UserDetailsService 로 테스트 사용자를 만들 수 있어야 한다." 라고 되어 있으며 이게 바로 @WithUserDetails 가 하는 일이라고 되어있다.

 

필자의 경우, @WithUserDetails(value = "custom 한 username", userDetailsServiceBeanName = "custom 한 UserDetailsService 를 빈으로 등록시 사용한 이름") 으로 설정을 해주었다.

@PostConstruct
@WithUserDetails(value = "01012341234", userDetailsServiceBeanName = "userService")
public void setUp() throws Exception {
    Optional<Member> member = memberMapper.findByHp("01012341234");
}

 

그리고 실행 시점에 대해서 고민하던 중 이 블로그를 참고하여 @PostConstruct 어노테이션을 추가하여 빌드를 했는데 Bean 의 순서 결정법에 대해 정리해 볼 필요성을 느꼈다.

 

@PostConstruct

먼저 PostConstruct 입니다.
이 어노테이션을 메소드 선언부에 붙여주게 되면, 빈이 생성되고 의존성 주입까지 완료된 이후에 실행되는 초기화 메소드임을 의미하게 된다.

 

@DependsOn

해당 클래스에 이 어노테이션과 함께 value = {빈 이름} 을 명시해주면 이 클래스가 value 에 적힌 빈에 의존하고 있다는 것을 알려주게 되는데 여러 곳에 작성을 하게 되면 헷갈릴 수도 있으며 순환 참조가 생길 수도 있다.

 

@Order

여러 Bean 들이 어느 한 객체로 주입될 때 순서를 정할 수 있다.

 

여기서 @PostConstruct 의 경우 빈 사이클에서 오직 한 번만 수행된다는 것을 보장할 수 있으며 빈이 초기화 됨과 동시에 의존성을 확인할 수 있다는 장점을 갖고 있다.

 

 

참고

https://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/test-method.html

 

11. Testing Method Security

This section demonstrates how to use Spring Security’s Test support to test method based security. We first introduce a MessageService that requires the user to be authenticated in order to access it. The result of getMessage is a String saying "Hello" t

docs.spring.io

https://shrewd.tistory.com/49

 

JWT Spring-Security-Test로 테스트시 인증정보 주입

스프링 시큐리티를 적용한 토이 프로젝트에서 JWT로 인증,인가 기능을 부여한 컨트롤러를 테스트하는 과정에서 간단하게 Spring-Security-Test에 @WithMockUser를 사용하면 테스트에 필요한 인증된 인증

shrewd.tistory.com