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

tiemo0708님의 프로필 이미지

작성한 질문수

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

회원 기능 테스트

테스트 코드에서 플러시 관련 질문

작성

·

120

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
여기에 질문 내용을 남겨주세요.
package jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; import static org.junit.jupiter.api.Assertions.*; @ExtendWith(SpringExtension.class) @SpringBootTest @Transactional class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //given Member member = new Member(); member.setName("kim"); //when Long savedId = memberService.join(member); //then assertEquals(member,memberRepository.findOne(savedId)); } @Test public void 중복_회원_에외() throws Exception { //given //when //then } }
해당 코드에서 @Transactional 어노테이션으로 롤백이 일어나는 것은 이해했으나 이것이 Flush 자체가 일어나지 않는 다는 것이 이해 되지 않습니다. 회원가입시 em.persist()가 호출이 되면 자동으로 Flush발생했다가 다시롤백되는게 아니지 궁금해서 질문 남깁니다.

답변 1

0

안녕하세요. tiemo0708님, 공식 서포터즈 David입니다.

persist 과정에서 데이터 등록 쿼리가 쓰기지연 저장소에 저장됩니다.

image

이후 트랜잭션이 커밋되면 쓰기 지연 저장소에 있는 쿼리를 쭉 DB로 반영(flush)합니다.

image

그런데, 트랜잭션을 롤백한다는 것은 DB에 반영된 것을 다시 되돌리는 행위입니다.

다만, JPA에서는 persist 할 때 바로 DB에 반영하지 않고 트랜잭션이 끝나기 전까지 모아두었던 걸 트랜잭션이 끝나는 시점에 DB에 반영하게 됩니다.

그런데 롤백을 하게 되면 굳이 반영(flush)할 필요가 없기 때문에 flush가 동작하지 않는 것입니다.

감사합니다.