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

H K님의 프로필 이미지
H K

작성한 질문수

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

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

MemberServiceV3_3Test 코드중 질문

작성

·

348

0

MemberServiceV3_3Test 테스트중

@Transactional 어노테이션을 쓰기위해

@SpringBootTest 어노테이션을 추가 시키는것 까지 이해는 했는데

(06:30 참고)

그 이후 이전 코드의 @BeforeEach 코드를 지우셨습니다.
(직접 주입)

그이후에 @TestConfiguration 을 추가해주셨는데
왜 꼭이렇게 빈을 주입해야 하나요 ?


( [MemberRepositoryV3, MemberServiceV3_3] << 이 두 객체를 @Autowired하지않고 이전 @BeforeEach로 사용했지만 안됌) - DataSource, PlatformTransactionManager 두 객체는 @Bean 설정 그 이후 테스트 실패.

 

결론적으로 MemberRepositoryV3,MemberServiceV3_3 이 둘 클래스도 왜 @TestConfiguration로 빈으로 주입해야 정상작동 하나요 ??

 

실패한 코드

===================================

@BeforeEach
void before(){
    memberRepository = new MemberRepositoryV3(TestConfig.dataSource());
    memberService = new MemberServiceV3_3(memberRepository);
}

@TestConfiguration
static class TestConfig{
    @Bean
    static DataSource dataSource(){
        return new DriverManagerDataSource(URL, USERNAME, PASSWORD);
    }

    @Bean
    PlatformTransactionManager transactionManager(){
        return new DataSourceTransactionManager(dataSource());
    }
}

 

답변 1

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. H K님

스프링이 제공하는 트랜잭션 AOP를 사용하려면 스프링 컨테이너에 DataSource, TransactionManager 빈이 등록되어야 합니다.

그래서 이런 과정을 통해서 해당 빈들을 스프링 컨테이너에 등록하게 됩니다.

감사합니다.

H K님의 프로필 이미지
H K
질문자

 memberRepository,  memberService 도 빈으로 등록 되어 있어야 하는건가요 ?
위 코드처럼 DataSource, TranscationManager은 빈으로 등록하고 memberRepository,memberService은 @BeforeEach로 햇더니 실패해서 질문드립니다 !
김영한님의 프로필 이미지
김영한
지식공유자

네 맞습니다. 스프링 빈으로 등록해야 합니다.

@Transactional이 적용되려면 스프링 빈이어야 합니다.

감사합니다.

H K님의 프로필 이미지
H K
질문자

감사합니다

H K님의 프로필 이미지
H K

작성한 질문수

질문하기