TIL(Today I Learned)

[Today I Learned - 5] @Transactional의 readOnly 속성

lazy man 2024. 1. 8. 17:55

@Transactional ?

@Transactional 어노테이션은 스프링에서 AOP를 통해 트랜잭션을 관리하기 위한 어노테이션이다. 트랜잭션이란 데이터를 변경하기 위한 작업의 단위인데 왜 해당 어노테이션에 readOnly 속성을 사용하는 걸까? 몇 가지 이유에 대해서 알아보자.

 

1. JPA에서 조회 성능 향상

JPA에서는 데이터를 조회할 때 영속성 컨텍스트 내 1차 캐시 영역을 이용하여 검색 성능을 향상시킬 수 있는데 영속성 컨텍스트를 이용하기 위해서는 트랜잭션이 필요하다. 즉 JPA의 1차 캐시 기능을 이용하여 검색 속도를 개선하기 위해 @Transactional 어노테이션을 사용할 수 있다. 

 

하지만 트랜잭션 내에서 엔티티를 조회한 후 엔티티를 update 한다면 JPA의 변경감지 기능에 의해 의도하지 않은 UPDATE 쿼리가 실행될 수 있다. 이와 같은 실수를 방지하기 위해 readOnly 속성은 변경감지 기능을 메뉴얼로(=flush 직접 호출) 처리하도록 하고 있다.

 

2. 코드 가독성

두 번째 이유는 "읽기 전용" 메서드를 효과적으로 표현하는 방법과 연관이 있다. 개발자가 읽기전용 메소드를 개발했는데 때 메소드 명으로 읽기 전용인지 표시하는 방법과 어노테이션을 통해 명시하는 방법 중 어느 것이 더 다른 개발자들에게   "읽기 전용" 메서드 임을 어필할 수 있는지 고민해보면 당연히 어노테이션을 선택할 것이다.