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

ojw970725님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

플러시

Transactional

해결된 질문

22.01.03 13:48 작성

·

163

0

 

안녕하세요!

jpa 수업듣고 혼자 공부하다가 궁금한 점이 생겨서 질문 남깁니다.

 
@Repository
@Transactional
@RequiredArgsConstructor
public class ItemRepositoryImpl implements itemRepository{

private final EntityManager em;



@Override
public void delete(Long itemId){
// Item item=findOne(itemId);
// em.remove(item);
em.createQuery("delete from Item i where i.id = :id")
.setParameter("id",itemId).executeUpdate();
}
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class ItemRepositoryTest {

@Autowired ItemRepository itemRepository;
@Autowired private EntityManager em;
private User user;
private Item item;


@Test
public void delete(){
Long itemId= itemRepository.save(item);
System.out.println(itemId);

itemRepository.delete(itemId);
// 1)
System.out.println(itemRepository.findOne(itemId).getId());
Assertions.assertEquals(null,itemRepository.findOne(itemId));
}
 

테스트코드를 이렇게 작성하는 경우에는 delete가 다시 rollback되고 테스트 코드에서 1) 부분에서 rollback이 되고  itemRepository.findOne(itemId)가 itemId로 나오던데 @Transactional가 잘못 적용된 것인가요?

jpql을 사용하는 경우 flush가 일어나서 flush 과정에서 commit이 일어나고 테스트 코드에서는 이 commit때문에 rollback이 일어나는 것 같은데 제가 생각한 것이 맞나요?

만약 제가 생각한 것이 맞다면 테스트 코드 부분에 1)에서 롤백이 일어나서 테스크코드 delete 메소드에서 save(item)부분도 롤백이 되서 itemRepository.delete(itemId)를 한 이후에는 find해도 null이 나와야하는데 그대로 itemId가 나오는 이유가 뭘까요?

 

주석처리한 것처럼 em.remove를 사용하면 테스트에 성공하는데 그 이유는 뭘까요ㅜㅜ

 

 

 

 

 

답변 1

0

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

2022. 01. 04. 22:43

안녕하세요 ojw970725님

스프링을 통해서 테스트를 수행하는데, 테스트에 @Transactional이 있으면 마지막에 트랜잭션을 롤백해버립니다.

감사합니다.