순간을 성실히, 화려함보단 꾸준함을

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

나의 개발 메모장

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

폭발토끼 2021. 12. 11. 20:03

@Transactional 어노테이션은 스프링 프래임워크를 사용할때 굉장히 편리함을 제공해 줍니다.
비지니스 로직 동작에 따라서 데이터베이스에 이를 반영해 줄때, 트랜잭션 처리를 자동으로 수행해 줍니다.

  • begin 과 commit 을 자동적으로 수행해줍니다.
  • 예외 발생시,rollback을 자동적으로 수행해줍니다.

@Transactional 어노테이션을 사용할때 주의할 점이 있는데, 바로 junit 환경에서는 @Transactional 을 사용하면 테스트가 끝날때 자동으로 Rollback 이 됩니다. 그래서 쿼리 로그가 보이지 않게 되는 것 입니다.

보통 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 쿼리가 정상적으로 작동하는 것을 확인 할 수 있습니다.