@Transactional - 트랜잭션 관리를 동작시키는 애노테이션. 데이터가 변경되는 작업을 할 때에는 무조건 사용하여야 한다. readOnly = true 로 설정하게 된다면 해당 트랜잭션 안에서 데이터 변경이 불가능하다.
readOnly=true : 데이터의 변경이 없는 읽기 전용 메서드에 사용한다.
데이터가 변경되지 않는데 왜 @Transactional 을 사용해야 하는지 이해가 되지 않아서 찾아보았다.
어차피 조회만 하는 메서드에서는 그냥 트랜잭션 없이 쓰면 안되나?
@Transactional(readOnly=true) 의 장점이 있다.
성능 향상
readOnly=true 를 사용하면 영속성 컨텍스트를 플러시 하지 않으므로 성능이 향상된다. 또한 데이터베이스 드라이버가 지원하면 DB에서 성능이 향상된다
JPA 는 데이터의 변경이 생기면 dirty checking 으로 감지하여 데이터를 수정한다.
dirty checking 은 변경 감지를 위해 스냅샷을 유지한다. -> 리소스 소모
readOnly = true 로 설정하게 되면 변경감지가 비활성화 된다. -> 리소스 절약
DB에 불필요한 lock 을 걸지 않는다.
db는 쿼리가 읽기 전용인지 고려하기 때문에 SQL 쿼리 최적화 효과도 있다.
더티 체킹, 플러시 호출, 스냅샷 생성 및 유지 불필요한 lock 등 작업을 하지 않음으로써 성능적인 이점이 생긴다.
가독성 향상
읽기 작업만 수행한다는 것을 직관적으로 알려준다.
대놓고 '읽기만 함!' 이라 써져있으니 가독성이 좋아질수밖에 없다.
@Transactional
public void practice() {
}
@Transactional(readOnly = true)
public void practice2() {
}
그리고 그냥 눈에 잘 띔
주의점
@Transactional(readOnly=true) 옵션이 DB 벤더에 따라 데이터의 변경에 대해서 오류를 발생시키지 않을 수 있으니 주의해야 한다. Connection 구현체들은 setReadOnly 를 꼭 사용할 의무가 없다..
ex) H2의 경우 readOnly=true 를 무시한다.
'JPA' 카테고리의 다른 글
(간략)엔티티의 임베디드 타입도 DTO로 변환시켜야 하는가 (0) | 2024.07.11 |
---|