- Spring Configuration 기능을 학습하기 위한 테스트 프로젝트
- xmlConfig: xml 기반 설정 학습 테스트
- javaConfig: java 기반 설정 학습 테스트
- environment: 외부 설정 학습 테스트
- 클론 받기
git clone https://github.com/next-step/spring-learning-test.git - 체크아웃 브랜치
git checkout config - 뼈대 코드로 제공된 프로젝트에서 테스트를 성공 시키기 위해 테스트 코드의 주석을 참고하여 프로덕션 코드를 구현하기
- 테스트는 config 디렉토리 하위에 위치
- 학습 테스트 활용 방법를 참고하여 학습 및 기능 구현
- 완성 브랜치 config-sample를 참고해서 진행해도 좋음
git checkout config-sample
- 테스트 메서드의 주석을 확인하여 프로덕션 코드에 추가할 내용을 인지하기
/**
* AnnotationConfigApplicationContext을 통해 AuthenticationPrincipalConfig에 설정된 빈들을 이용한 테스트
* <p>
* AuthenticationPrincipalConfig을 이용하여
* AuthService 빈 등록하기
*/
class JavaConfigTest {
@Test
void main() {
ApplicationContext context = new AnnotationConfigApplicationContext(HelloApplication.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
AuthService authService = context.getBean(AuthService.class);
assertThat(authService).isNotNull();
}
}AuthenticationPrincipalConfig에서AuthService을 빈으로 등록
// TODO: Java-based Configuration을 하기 위한 클래스로 지정하기
public class AuthenticationPrincipalConfig {
// TODO: AuthService 빈을 등록하기
public AuthService authService() {
return null;
}
...
}- 테스트 메서드의 주석을 확인하여 프로덕션 코드에 추가할 내용을 인지하기
/**
* HelloApplication에 설정된 @SpringBootApplication을 통해 애플리케이션의 모든 빈들을 이용한 테스트
* <p>
* AuthenticationPrincipalConfig을 이용하여
* AuthenticationPrincipalArgumentResolver를 빈 등록하고
* AuthService에 대한 의존성을 주입하기
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
class JavaConfigSpringTest {
@Autowired
private AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver;
@Test
void main() {
assertThat(authenticationPrincipalArgumentResolver.findMemberName()).isEqualTo("사용자");
}
}AuthenticationPrincipalConfig에서AuthenticationPrincipalArgumentResolver을 빈으로 등록AuthenticationPrincipalArgumentResolver에AuthService에 대한 의존성 주입
// TODO: Java-based Configuration을 하기 위한 클래스로 지정하기
public class AuthenticationPrincipalConfig {
...
// TODO: AuthenticationPrincipalArgumentResolver를 빈 등록하고 authService에 대한 의존성을 주입하기
@Bean
public AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver() {
return null;
}
}- PropertySourceConfig 설정을 통해 ApplicationContext를 생성하고 JwtTokenKeyProvider를 조회하여 secret key 주입을 검증하는 테스트
- PropertySourceConfig 클래스에서 테스트를 성공시키기 위한 설정을 해야함
@Test
void key() {
ApplicationContext context = new AnnotationConfigApplicationContext(PropertySourceConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
JwtTokenKeyProvider jwtTokenKeyProvider = context.getBean(JwtTokenKeyProvider.class);
assertThat(jwtTokenKeyProvider.getSecretKey()).isEqualTo("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE1MTYyMzkwMjJ9.ih1aovtQShabQ7l0cINw4k1fagApg3qLWiB8Kt59Lno");
}- TODO를 따라서 설정을 완료하기
- JwtTokenKeyProvider에 대한 추가 수정은 필요 없음
// TODO: Java-based Configuration을 하기 위한 클래스로 지정하기
// TODO: application.properties 파일을 활용하기 위한 설정 추가하기
public class PropertySourceConfig {
private final Environment env;
public PropertySourceConfig(Environment env) {
this.env = env;
}
// TODO: application.properties의 security.jwt.token.secret-key 값을 활용하여 JwtTokenKeyProvider를 빈으로 등록하기
public JwtTokenKeyProvider jwtTokenKeyProvider() {
return new JwtTokenKeyProvider("");
}
}- ValueConfig 설정을 통해 ApplicationContext를 생성하고 JwtTokenExpireProvider 조회하여 validityInMilliseconds 주입을 검증하는 테스트
- ValueConfig, JwtTokenExpireProvider 클래스에서 테스트를 성공시키기 위한 설정을 해야함
@Test
void expire() {
ApplicationContext context = new AnnotationConfigApplicationContext(ValueConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
JwtTokenExpireProvider jwtTokenExpireProvider = context.getBean(JwtTokenExpireProvider.class);
assertThat(jwtTokenExpireProvider.getValidityInMilliseconds()).isEqualTo(3600000);
}- TODO를 따라서 설정을 완료하기
- JwtTokenExpireProvider 대한 추가 수정이 필요함
// TODO: Java-based Configuration을 하기 위한 클래스로 지정하기
// TODO: application.properties 파일을 활용하기 위한 설정 추가하기
// TODO: nextstep.helloworld.core.environment 내에 있는 스프링 빈을 스캔하기
public class ValueConfig {
}- validityInMilliseconds에 값을 주입하기 위한 수정하기
@Component
public class JwtTokenExpireProvider {
// TODO: application.properties의 security.jwt.token.expire-length 값을 활용하여 validityInMilliseconds값 초기화 하기
private long validityInMilliseconds;
public JwtTokenExpireProvider(long validityInMilliseconds) {
this.validityInMilliseconds = validityInMilliseconds;
}
public long getValidityInMilliseconds() {
return validityInMilliseconds;
}
}