항해99 77일차 TIL1 - @Transactional(readOnly = true)
무지했던 나 자신을 반성하며... 이 포스팅을 작성한다...ㅎ
예전에 팀원끼리 코드 리뷰를 할 때 굳이 조회 API에 @Transactional을 다는 이유가 있는지 물어본적이있다.
(read_only 옵션이 있었는지는 정확히 기억이 안난다.)
하여튼 중요한 것은 조회 API에서도 @Transactional을 다는것이 성능적으로 유리하다.
조회 API에서 @Transactional(readOnly = true)을 달아야 하는 이유
1. 쓰기, 삭제, 수정 작업이 허용되지 않기 때문에 데이터베이스 락을 걸지 않아도 됩니다. 이로 인해 동시에 다수의 클라이언트가 조회 API를 호출해도 데이터베이스 락 충돌을 방지하고 성능 향상을 이뤄낼 수 있습니다.
2. 쓰기 작업을 위한 로그 기록 처리를 하지 않아도 된다. 이 또한 트랜잭션 처리 시간을 단축시킬 수 있습니다.
3. 스냅샷 객체 생성 X
이건 JPA를 쓸 때 한정이긴하다. 영속성 컨텍스트에서는 엔티티를 조회할 때 해당 엔티티를 복제해서 스냅샷 객체를 생선한다. 그리고, 트랜잭션이 종료될 때, 영속성 컨텍스트는 엔티티 객체와 스냅샷 객체를 비교하여 변경된 객체를 찾아 데이터베이스에 반영하다.
@Transactional(readOnly=true)를 사용하면 트랜잭션 내에서 조회 작업만 수행하고, 변경 작업은 수행하지 않습니다. 따라서, 영속성 컨텍스트는 스냅샷 객체를 생성하지 않고, 조회한 엔티티 객체만을 반환합니다.
4. flush 호출 X
읽기 전용이기 때문에 커밋할 필요가 없다. 그래서 flush를 호출하지 않음
단, readOnly 옵션은 JDBC 드라이버나 DB에 따라 작동하지 않을 수 있으니 확인해보며 적용하자.