@Transactional의 동작 방식에 대해 설명해 주세요.
@Transactional은 트랜잭션 AOP 라고도 하며, 프록시로 동작한다.메서드나 클래스에 이 어노테이션을 적용할 수 있는데, 클래스에 적용하면 public 메서드가 AOP 적용 대상이 된다.
public 메서드만 적용되는 이유는 프록시가 오버라이딩 개념이기 때문에 public으로 열려 있지 않은 경우는 적용할 수 없다.
트랜잭션 AOP를 적용하면 프록시 객체가 빈으로 등록되고, 이 프록시 객체에서 커넥션을 획득하고 트랜잭션을 시작하는 등 트랜잭션 관련 코드들을 모두 처리해준다.
트랜잭션 AOP 주의점
@Transactional을 사용할 때는 내부 호출 문제를 조심해야 한다.AOP를 적용하면 실제 대상 객체 대신에 프록시를 스프링 빈으로 등록한다.
@Transactional을 적용하면 프록시 객체가 요청을 먼저 받아서 트랜잭션을 적용하고 이후에 대상 객체(target)를 호출한다.프록시 -> 실제 객체는 문제가 안 되지만, 실제 객체에서 내부 메서드를 호출할 때는 프록시를 거치지 않고 직접 호출하는 것이기 때문에 트랜잭션이 적용되지 않는다.
Last updated