작성
·
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 과정에서 데이터 등록 쿼리가 쓰기지연 저장소에 저장됩니다.
이후 트랜잭션이 커밋되면 쓰기 지연 저장소에 있는 쿼리를 쭉 DB로 반영(flush)합니다.
그런데, 트랜잭션을 롤백한다는 것은 DB에 반영된 것을 다시 되돌리는 행위입니다.
다만, JPA에서는 persist 할 때 바로 DB에 반영하지 않고 트랜잭션이 끝나기 전까지 모아두었던 걸 트랜잭션이 끝나는 시점에 DB에 반영하게 됩니다.
그런데 롤백을 하게 되면 굳이 반영(flush)할 필요가 없기 때문에 flush가 동작하지 않는 것입니다.
감사합니다.