트랜잭션 관리를 간편하게 하기 위해 사용된다.

사전 지식 - Reflection

구체적인 타입을 알지 못해도, 클래스의 정보(메서드, 메서드인자, 변수, 타입) 등에 접근할 수 있게 해주는 자바 기본 API이다. JVMClassLoader 에 의해 Method Area 에 저장되는 메서드 관련 정보들을 가져온다.


프록시 동작 방식

Bean 생성시 @Transactional 애너테이션이 있으면, Runtime 시점에 동적으로 프록시 객체를 만들어 스프링 Bean 으로 등록한다.

이 때 프록시 객체를 만드는 방법은 두가지가 존재한다.

JDK Dynamic proxy

java.lang.reflect.Proxy 클래스를 이용해 인터페이스를 구현한 프록시 객체를 생성한다.

인터페이스 기반을 프록시 객체를 생성하기 때문에 상속한 인터페이스를 구현한 경우에만 프록시를 생성할 수 있다

public interface Animal {
    void eat();
}

public interface Mammal extends Animal {
    void walk();
}

public class Dog implements Mammal {
    @Override
    public void eat() {
        System.out.println("Dog is eating");
    }

    @Override
    public void walk() {
        System.out.println("Dog is walking");
    }
}