ACID : 원자성, 일관성, 격리성, 지속성
원자성
일관성
격리성
지속성
원자성과 격리성은 한 트랜잭션 내에서 여러 번의 쓰기를 하면 데이터베이스가 어떻게 해야 하는지를 서술한다.
팩토리 빈이란 스프링을 대신해서 오브젝트 생성로직을 담당하도록 만들어진 특별한 빈을 말한다.
FactoryBean 인터페이스를 구현하고 getObject()
내부에서 Proxy.newProxyInstance()
로 프록시 객체를 생성한다.
FactoryBean 을 구현한 클래스를 스프링 빈으로 등록하면 팩토리 빈으로 동작한다.
프록시 팩토리 빈의 한계
타깃의 부가기능 제공은 메서드 단위로 일어난다.
→ 여러 개의 클래스에 공통적인 부가기능 제공이 불가능하다.
프록시 팩토리 빈에서 생성되는 InvocationHandler, InvocationHandler 의 속성으로 가지는 타깃 객체
→ 팩토리 빈 개수만큼 부가기능을 담은 Handler 인스턴스가 생성된다.
→ InvocationHandler 가 속성으로 타깃 오브젝트를 갖으므로 타깃 오브젝트가 변경되려면 InvocationHandler를 새로 만들어야 한다.
스프링의 프록시 팩토리 빈은 순수하게 프록시 생성만 담당한다. 부가기능을 담당하는 객체는 별도의 빈으로 등록이 가능하다
부가기능은 MethodInterceptor
인터페이스를 구현한다.
/**
* Intercepts calls on an interface on its way to the target. These
* are nested "on top" of the target.
*
*** <p>The user should implement the {@link #invoke(MethodInvocation)}
* method to modify the original behavior.**
*/
@FunctionalInterface
public interface MethodInterceptor extends Interceptor {
/**
* Implement this method to perform extra treatments before and
* after the invocation. Polite implementations would certainly
* like to invoke {@link Joinpoint#proceed()}.
* @param invocation the method invocation joinpoint
* @return the result of the call to {@link Joinpoint#proceed()};
* might be intercepted by the interceptor
* @throws Throwable if the interceptors or the target object
* throws an exception
*/
@Nullable
Object invoke(@Nonnull MethodInvocation invocation) throws Throwable;
}
MethodInterceptor
의 invoke()
메서드와 InvocationHandler
의 invoke()
메서드 차이점을 보면, InvocationHandler
에서는 타깃 오브젝트를 파라리터로 전달 받았다. 이는 타깃 오브젝트와 결합도가 높아진다.
MethodInterceptor
의 invoke()
는 MethodInvocation
만을 파라미터로 전달 받는데, 이 인스턴스 안에 호출할 메서드 정보와 타깃 오브젝트 정보가 같이 들어 있다.
이 덕분에 타깃 오브젝트와 상관없이 여러 프록시에서 함께 사용될 수 있고, 싱글톤 빈으로 등록이 가능하다.