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

김민종님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

테스트에서 @Transactional 을 붙히지 않으면 왜 일차캐시가 작동하지 않을까요?

23.11.08 08:10 작성

·

160

0

@Service
@RequiredArgsConstructor
public class MemberService {
    private final MemberRepository memberRepository;

    @Transactional
    public void signUp(Member member){
        memberRepository.save(member);
    }

    public Member findOne(Long id){
        return memberRepository.findById(id).orElseThrow();
    }

}

 

@Test
void signUp() {
    Member member1 = Member.builder()
            .userId("user1")
            .birthDay(LocalDate.now())
            .password("pass")
            .email("aa@bb.cc")
            .build();

    memberService.signUp(member1);

    Member member2 = memberService.findOne(member1.getId());

    assertThat(member1).isEqualTo(member2);
}

 

트랙잰션이 Memberservice에서 signUp을 완료 하고 트랜잭션이 끝난다고 영속성 컨텍스트가 비워지지 않다고 이해 했는데 왜 같은 id 값으로 다시 찾을 때 동일성을 보장하지 않는걸까요?

 

답변 1

1

codesweaver님의 프로필 이미지

2023. 11. 08. 19:30

안녕하세요. 김민종님, 공식 서포터즈 코즈위버입니다.

테스트 클래스에 트랜잭션을 사용하지 않을 경우 signUp 메소드를 수행하며 새로운 트랜잭션을 시작하고, 영속성 컨텍스트를 생성합니다. 그리고 이렇게 생성한 영속성 컨텍스트는 signUp() 메소드가 끝나는 순간 모두 소멸합니다. 그래서 member1과 member2 가 같음을 보장하지 않습니다.

감사합니다.

김민종님의 프로필 이미지
김민종
질문자

2023. 11. 11. 10:48

감사합니다. 덕분에 궁금증 해결했습니다.