해결된 질문
작성
·
162
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
아래 코드는 스프링 핵심 원리 기본 편에서 작성했던 코드입니다.
public class ApplicationContextExtendsFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
.
.
.
@Configuration
static class TestConfig {
@Bean
public DiscountPolicy rateDiscountPolicy() {
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy FixDiscountPolicy() {
return new FixDiscountPolicy();
}
}
}
여기선 @Configuration를 써도 문제가 없었는데
이번 강의에선 @TestConfiguration을 작성해야만 오류가 안 생기는 이유가 뭔지, 어떤 차이 때문인지 잘 이해가 안 갑니다. 검색해 봐도 잘 와닿지가 않는데 이번 강의의 코드에선 왜 @Configuration을 하면 테스트가 제대로 수행되지 않는 건가요?
답변 1
2
안녕하세요. 11 1님
@SpringBootTest를 사용하면서, 그 안에서 내부 클래스로 @Configuration을 사용하게 되면 스프링 부트의 다양한 설정들이 먹히지 않고, @Configuration 안에서만 적용한 설정이 먹히게 됩니다. 이 설정이 우선권을 가지고 가버리기 때문에 스프링 부트의 다른 설정이 적용되지 않습니다. 쉽게 이야기해서 테스트에서는 이 설정만 사용하게 됩니다.
스프링 부트가 제공하는 Transactional AOP 같은 기능들을 사용하려면 스프링 부트가 추가적인 빈들을 더 등록해야 합니다. 그래서 @Configuration만 사용하면 트랜잭션이 AOP가 적용되지 않아서 오류가 발생합니다.
이럴 때 사용하는 것이 @TestConfiguration입니다.
@SpringBootTest를 사용하면서 이 설정을 사용하면 스프링 부트가 제공하는 기능들이 다 적용되고, 추가로 내가 등록한 빈들도 등록됩니다.
다음 내용도 참고해보시면 도움이 되실거에요.
https://www.inflearn.com/community/questions/430218
감사합니다.
자세한 답변 감사합니다!