Study/Spring

@Transactional(readOnly = true) 이거 왜함..? 그냥 안쓰면 되는거 아님?

dev_kong 2023. 5. 22. 23:54
728x90
728x90

@Transactional

다른 크루들은 이미 많이 사용해본 듯 하지만, 나는 이번 미션(지하철)을 하면서 처음으로 @Transactional 어노테이션을 사용해봤다.
@Transactional 주석을 통해 트랜잭션의 범위를 지정하는 사용한다.

 

트랜잭션

데이터 베이스의 상태를 변환 시키는 프로그램의 단위작업.

무슨 말이냐 하면, @Transactional 어노테이션을 사용하면, Spring은 해당 메서드에 대한 트랜잭션 관리를 자동으로 처리한다.

메서드가 호출 될 때 트랜잭션이 시작되고, 메서드가 정상적으로 완료되면 트랜잭션이 커밋되며, 예외가 발생하는 트랜잭션은 롤백된다.

 

만약, @Transactional 어노테이션을 클래스레벨에서 사용한다면, 해당 클래스의 모든 메서드에 대해 트랜잭션 관리를 하게된다.

readOnly 옵션

@Transactional 주석은 여러 속성을 제공하는데 그 중 하나가 readOnly이다.해당 속성의 기본값은 false 로 설정 되어있고, 이는 트랜잭션 내에서 데이트의 변경이 가능하다는 것을 나타낸다.
즉, 이 트랜잭션은 읽기와 쓰기 모두를 처리할 수 있다.

 

근데.. 조금 이게 이해가 안된다.


트랜잭션에서 readOnly = true를 쓰는 이유가 뭐지?
위에서 말했듯 @Transactional 주석은 메서드가 정상적으로 실행되면 커밋을, 그렇지 않다면 롤백을 해주는 친구인데,
readOnly = true 옵션 같은 경우는 조회 즉 SELECT 작업에만 해당되는 내용이다.


해당 작업에 굳이 @Transactional(readOnly = true) 를 달아줄 이유가 있을까?
그냥 어노테이션 사용안하면 되는 거 아닌가??

readOnly = true 사용 이유

해당 내용을 찾아보니 쉽게 내용을 확인 할 수 있었다.

데이터 무결성 보장

해당 속성을 true로 설정함을 통해 트랜잭션이 데이터 베이스에 대한 변경을 수행하지 않도록 함으로써

데이터의 무결성을 보장하느데 도움이 된다.

특히나 복잡한 비즈니스 로직을 가진 애플리케이션에서 유용하며,

의도치 않은 데이터 변경을 방지 할 수 있다고 한다.

성능최적화

대부분의 내용이 JPA와 관련된 내용이었다.
JPA 같은 경우 변경을 감지하여, 데이터를 수정하는데, readOnly = true 설정을 해놓으면

이런 변경 감지를 비활성화 하여 리소스를 절약할 수 있다고 한다.

흠.. 일단 지금 내가 사용하는 JdbcTemplate은 변경감지 같은거 원래 못하는 애니까, 상관 없는 거 아닌가 싶어서,

해당 속성을 통해 얻을 수 있는 성능상 이점에 대해 조금 더 자세히 알아봤다.

쓰기 잠금

DB에서 동시성을 해결하기 위해 사용되는 방법 중 하나인데, 이거랑 읽기잠금 뭐 블로킹 등등 다 설명을 해야되니 이 글에선 간단하게, readOnly = true를 설정하면 쓰기 잠금을 걸 필요가 없기때문에 쓰기 작업으로 인한 잠금 대기시간이 없어진다. 정도로 간단하게 짚고 넘어가려 한다.

쿼리 계획 최적화

해당 속성은 SQL 쿼리 최적화에도 이점을 줄 수 있다. 데이터 베이스는 쿼리계획을 작성할 때 해당 쿼리가 읽기 전용인지 여부를 고려하여 쿼리계획을 최적화 할 수 있다.

가독성

음.. 이건 뭐 너무 당연한 소리 같기도 하고, 쓸데없는 소리같기도 해서 넘어간다. 근데 분명이 장점이긴 한거 같다.. 하핳

728x90
728x90