@Transactional

이재연·2021년 4월 19일
0

@Transactional이란?

스프링에서 제공하는 트랜잭션 처리 중 하나이다. 애노테이션으로 트랜잭션 처리를 지원한다. 선언적 트랜잭션이라고도 부른다.

@Transactional의 동작 원리

@TransactionalSpring AOP를 기반으로 동작한다. 프록시 객체를 통해 기능을 수행하고 이상이 없으면 Commit을, 예외가 발생하면 Rollback을 수행한다.

대상 객체를 감싸는 프록시 객체를 생성하고 결과에 따라 Commit/Rollback을 수행한다.

  • AOP
    AOP(Aspect Oriented Programming) 관점 지향 프로그래밍이라는 의미이다. 기능에서 핵심 기능과 부가 기능을 분리하여 따로 관리하는 개발 패러다임이다.
    Spring에서는 프록시 기반으로 AOP를 구현한다. 인터페이스를 구현한 객체는 Dynamic Proxy, 그렇지 않은 경우에는 CGLib 방식을 사용한다.

  • 프록시 패턴
    대상 객체의 기능을 대신 수행하는 대리 객체를 사용하는 개발 패턴이다.

  • Dynamic Proxy
    리플렉션 방식으로 프록시 객체 구현한다. Spring의 기본 AOP전략이다.
    대상 객체의 인터페이스를 구현한 프록시 객체를 사용한다.

  • CGLib
    CGLib은 클래스의 바이트 코드를 조작하여 프록시 객체를 만들어주는 라이브러리이다. Extends 방식으로 프록시 객체를 구현한다.

CGLib 방식은 바이트 코드를 조작하기 때문에 리플렉션 방식의 Dynamic Proxy보다 성능이 좋지만 몇가지 문제가 있어 Spring에서는 잘 사용하지 않았다. 하지만 문제가 개선되어 Spring Boot의 기본 AOP 전략으로 사용하고 있다.

@Transactional 사용시 주의점

  • private 메소드에는 사용 불가.
    인터페이스를 상속받아 프록시 객체를 생성해야 하기 때문에 상속받을 수 없는 private 메소드는 트랜잭션 관리가 되지 않는다.

  • 내부의 메소드 호출시 트랜잭션 관리가 되지 않는다.
    트랜잭션이 아닌 메소드에서 트랜잭션이 선언된 내부의 메소드를 호출하면 프록시 객체가 아닌 대상 객체의 메소드를 호출하기 때문에 트랜잭션이 적용되지 않는다.

참조

https://gmoon92.github.io/spring/aop/2019/04/20/jdk-dynamic-proxy-and-cglib.html
https://mommoo.tistory.com/92

0개의 댓글