JPA/Hibernate 쓸 때 readOnly=true로 설정하면 영속성 컨텍스트가 변경 감지(dirty checking) 안 해서 성능이 좋아져요. 영속성 컨텍스트가 스냅샷 안 만들어서 메모리도 덜 먹고요.
읽기 전용으로 설정해놓으면 실수로 데이터 바꾸는 일 없어요. 특히 여러 DB 쓰는 환경에서 의도치 않게 데이터 바뀌는 거 막을 수 있어요.
readOnly 속성 쓰면 이 메서드가 읽기만 한다는 걸 확실히 알 수 있어요. 여러 DB 쓰는 환경에서 특정 트랜잭션 매니저 지정할 때 유용해요.
@Transactional(readOnly = true, transactionManager = "mssqlTransactionManager")
public void 읽기전용메서드() {
// 읽기만 하는 로직
}
일부 DB에서는 읽기 전용 트랜잭션에 대해 특별한 최적화를 해줘요. 예를 들어, 테이블 잠금을 안 하거나 읽기 전용 복제본을 사용할 수 있어요.
읽기랑 쓰기 작업 확실히 구분해서 트랜잭션 관리할 수 있어요. 로그 저장 같은 부수적인 작업을 따로 트랜잭션으로 분리할 때 좋아요.
@Transactional(readOnly = true)
public void 데이터읽기() {
// 데이터 읽는 로직
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void 로그저장() {
// 로그 저장하는 로직
}
이 메서드가 데이터 안 바꾸고 읽기만 한다는 걸 한눈에 알 수 있어요. 다른 개발자들이 코드 이해하고 유지보수하기 좋아져요.
이렇게 @Transactional(readOnly = true) 쓰면 성능도 좋아지고, 데이터 일관성도 지키고, 코드도 읽기 쉬워져요. 특히 여러 DB 쓰는 복잡한 환경에서 트랜잭션 관리하기 좋당.