250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 백준#BOJ#2615#오목
- 백준#BOJ#8012#한동이는영업사원
- 백준#BOJ#14501#퇴사#브루트포스
- 백준#boj#16932#모양만들기
- 백준#BOJ#12865#평범한배낭
- 백준#BOJ#1939#중량제한
- 백준#boj#12755
Archives
- Today
- Total
순간을 성실히, 화려함보단 꾸준함을
[Spring]@Transactional 어노테이션을 사용하면 왜 쿼리 로그가 안보일까? 본문
@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
쿼리가 정상적으로 작동하는 것을 확인 할 수 있습니다.
'나의 개발 메모장' 카테고리의 다른 글
@RequiredArgsConstructor 를 사용할때 주의점 (1) | 2021.12.24 |
---|---|
[JPA]Should have [public, protected] no-arg constructor?? (0) | 2021.12.22 |
[eclipse 오류] Starting Tomcat Server at localhost 에러 (0) | 2021.02.02 |
왜 알고리즘(ps)이 힘들까?? (4) | 2021.01.17 |
[JavaScript] getter 와 setter 무한루프 문제 ( javascript getter,setter infinite loop problem) (0) | 2021.01.15 |