[Spring]@Transactional 어노테이션을 사용하면 왜 쿼리 로그가 안보일까?

[Spring]@Transactional 어노테이션을 사용하면 왜 쿼리 로그가 안보일까?

728x90

@Transactional 어노테이션은 스프링 프래임워크를 사용할때 굉장히 편리함을 제공해 줍니다.

비지니스 로직 동작에 따라서 데이터베이스에 이를 반영해 줄때, 트랜잭션 처리를 자동으로 수행해 줍니다.

begin 과 commit 을 자동적으로 수행해줍니다.

rollback을 자동적으로 수행해줍니다.

@Transactional 어노테이션을 사용할때 주의할 점이 있는데, 바로 Rollback 이 자동적으로 수행된다는 점인데 이 때문에 JPA 를 사용할때 로그로 쿼리를 확인을 못하는 경우가 생깁니다.

보통 application.yml 에 분명히 format_sql: true 로 설정해주었음에도 불구하고 쿼리가 안보이는 현상이 발생할 수 있을텐데 @Transactional 어노테이션이 자동으로 Rollback 을 시켜주기 때문입니다.

package jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; 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.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import static org.junit.jupiter.api.Assertions.*; @RunWith(SpringRunner.class) @SpringBootTest @Transactional class MemberServiceTest { @Autowired public MemberService memberService; @Autowired public MemberRepository memberRepository; @Test //@Rollback(false) public void 회원가입() throws Exception{ //Given Member member=new Member(); member.setName("Kim"); //When Long id = memberService.join(member); //Then assertEquals(member,memberRepository.findOne(id)); } }

이런 테스트 코드가 있다고 가정해보겠습니다.(김영한님 JPA 자료입니다)

그리고 MemberRepository 에 회원정보를 저장하는 소스가 존재합니다.

public void save(Member member){ em.persist(member); //em.flush(); }

@Rollback 을 주석처리하고 테스트코드를 돌려보면 insert 쿼리가 로그에 찍히지 않을 것 입니다.

그러나 @Rollback 의 주석을 해제하면

2021-12-11 20:02:41.093 DEBUG 19636 --- [ main] org.hibernate.SQL : insert into member (city, street, zipcode, name, member_id) values (?, ?, ?, ?, ?)

insert 쿼리가 정상적으로 작동하는 것을 확인 할 수 있습니다.

728x90

from http://boomrabbit.tistory.com/202 by ccl(A) rewrite - 2021-12-11 20:27:48