스프링 부트에서 기본 설정으로 서비스 레이어에서 트랜잭션이 관리된다.
OSIV(Open Session In View) 설정이 활성화되어 있다면 컨트롤러와 뷰 레이어에서도 DB 커넥션이 유지된다.
그러나 테스트 레이어에서는 @Transactional을 사용해야 DB 커넥션이 열려 있는 상태가 유지된다.
LazyInitializationException 문제를 해결하기 위해 사용된다. application.properties 또는 application.yml 파일에서 설정할 수 있다. spring.jpa.open-in-view=true # OSIV 활성화
spring.jpa.open-in-view=false # OSIV 비활성화
테스트 레이어에서는 OSIV 설정과 상관없이 @Transactional을 붙여야 DB 커넥션이 열려 있는 상태로 유지된다.
예를 들어, 아래와 같이 테스트 코드를 작성할 수 있다.
@SpringBootTest
class SbbApplicationTests {
@Autowired
private QuestionRepository questionRepository;
@Transactional
@Test
void testJpa() {
Optional<Question> oq = this.questionRepository.findById(2); // 트랜잭션이 열리고 닫힘
assertTrue(oq.isPresent());
Question q = oq.get();
List<Answer> answerList = q.getAnswerList(); // Lazy 로딩에 의해 동작
assertEquals(1, answerList.size());
assertEquals("네 자동으로 생성됩니다.", answerList.get(0).getContent());
}
}
@Transactional 없음:
OSIV 설정이 true일 때만 컨트롤러에서 Lazy 로딩이 가능하다.
OSIV가 false일 경우 LazyInitializationException 발생.
@Transactional 있음:
컨트롤러에서도 DB 커넥션이 열려 있으므로 Lazy 로딩 가능.
OSIV 와 상관없이 JPA를 사용할때는 @Transactional을 컨트롤러 액션메서드에 거는게 좋다.
@Transactional readOnly = true 옵션 사용 불가.@Transactional(readOnly = true) SET autocommit=0; # Auto-commit 끄기
SET autocommit=1; # Auto-commit 켜기
auto-commit 설정을 false로 설정. spring:
datasource:
hikari:
auto-commit: false