본문 바로가기
Back-End/Spring Boot

@Transactional

by 코젼 2024. 7. 15.
728x90
반응형

목차

     

    스프링의 AOP 를 통해 @Transactional 어노테이션을 사용해서 트랜잭션을 걸 수 있다.

    조회용 메서드에 @Transactional(readOnly = true) 속성을 설정하면 성능상 이점을 얻을 수 있다.

     

    + Lazy Loading, Replication 과 같이 트랜잭션 범위 내에서 수행해야 되는 동작이 있는 경우에 적절하게 활용하는 것이 좋으며, 무분별하게 사용할 경우 Snapshot 유지, Flush 의 필요 등 관리적/메모리적 측면에서 좋지 않을 수 있고, 커넥션을 오래 가지고 있어서 커넥션 부족 등의 문제가 발생할 수 있음을 유의한다.

     

    readOnly = true

    JPA - Session Flush Mode Setting

    스프링 프레임워크가 JPA 의 세션 플러시 모드를 'MANUAL' 로 설정한다.

    MANUAL 모드는 트랜잭션 내에서 사용자가 수동으로 flush 를 호출하지 않으면 flush 가 자동으로 수행되지 않는 모드이다.

    -> 강제로 flush() 를 호출하지 않으면, 수정 내역에 대해 DB 에 적용되지 않는다.

     

    트랜잭션 commit 시 영속성 컨텍스트가 자동으로 flush 되지 않으므로, 조회용으로 가져온 entity 의 예상치 못한 수정을 방지할 수 있고, JPA 가 변경 감지를 위한 Snapshot 을 별도로 보관하지 않기 때문에 메모리가 절약되는 성능적 이점을 얻을 수 있다.

     

    가독성

    직관적으로 해당 메서드가 조회용 메서드임을 파악할 수 있다.

     

    Replication 부하 분산

    Replication: 데이터베이스의 장애를 빠르게 복구하고, 트래픽을 분산시키기 위해 실시간 복제본 데이터베이스를 운용하는 방식

    Master-Slave 구조로 설계되어 있고, 복제본 DB 를 운용한다.

    readOnly = true 로 설정되어 있는 경우 Slave DB 에서 데이터를 가져오도록 동작해서 트래픽 분산을 적용할 수 있다.

     

    조회용 메서드에 @Transactional 을 사용해야 하는 이유

    OSIV(Open Session In View): 영속성 컨텍스트를 View Layer 까지 유지하는 속성이다.

    -> 클라이언트의 요청 시점부터 영속성 컨텍스트를 생성하여 Filter / Interceptor - Controller 에서 부터 영속성 컨텍스트가 생성되어 View Layer 에서도 Entity 의 Lazy Loading 이 가능하다.

     

    별도의 설정을 하지 않으면 OSIV 가 true 로 설정되어 있다. true 인 상태에서 Lazy Loading 을 수행하는 코드의 동작은 Exception 없이 정상적으로 동작한다.

    false 로 설정한다면 영속성 컨텍스트는 트랜잭션 범위를 벗어나는 순간 Entity 가 준영속 상태(Lazy Loading 동작 불가 상태)가 되어 버린다. -> @Transactional 어노테이션이 없는 경우 LazyInitializationException 발생

    728x90
    반응형

    댓글