인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

11 1님의 프로필 이미지
11 1

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

트랜잭션 문제 해결 - 트랜잭션 AOP 적용

@Configuration vs @TestConfiguration

해결된 질문

작성

·

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

감사합니다.

11 1님의 프로필 이미지
11 1
질문자

자세한 답변 감사합니다!

11 1님의 프로필 이미지
11 1

작성한 질문수

질문하기