[F-Lab 챌린지 39일차 TIL]

성수데브리·2023년 8월 5일
0

f-lab_java

목록 보기
31/73

공부

트랜잭션

트랜잭션이 보장하는 안전성

  • ACID : 원자성, 일관성, 격리성, 지속성

  • 원자성

    • 원자성이란 더이상 나눌 수 없는 논리적 작업 단위를 뜻하는 것으로서 여러 작업이 하나의 원자적인 트랜잭션으로 묶여있다면 전체가 커밋되거나 롤백되어야 한다.
    • 트랜잭션이 성공하면 커밋하거나 중간에 실패하면 이전 완료된 작업을 모두 롤백해야 한다.
    • 원자성 덕분에 어플리케이션은 트랜잭션이 어떤 것도 변경하지 않았음을 보장하므로 안전하게 재시도할 수 있다.
  • 일관성

    • 일관성이란 데이터에 관한 어떤 불변식이다. ex) 회계 시스템에서 모든 계좌의 대변, 차변은 항상 맞아 떨어져야 한다.
    • 애플리케이션의 속성이다. 데이터의 불변식을 지키도록 애플리케이션에서 트랜잭션을 올바르게 정의해야 한다.
  • 격리성

    • 격리성이란 동시에 실행되는 트랜잭션은 서로 격리된다는 것을 의미한다.
    • 격리성은 직렬성이라는 용어로 공식화 하는데 각 트랜잭션이 전체 데이터베이스에서 실행되는 유일한 트랜잭션인 것처럼 동작할 수 있다는 것을 의미한다.
    • 직렬성 격리는 성능 손해를 동반하므로 거의 사용되지 않는다.
  • 지속성

    • 트랜잭션이 성공적으로 커밋됐다면 하드웨어 결함이 발생하거나 데이터베이스가 죽더라도 트랜잭션에서 기록한 모든 데이터는 손실되지 않는다는 보장이다.
  • 원자성과 격리성은 한 트랜잭션 내에서 여러 번의 쓰기를 하면 데이터베이스가 어떻게 해야 하는지를 서술한다.

팩토리 빈

  • 팩토리 빈이란 스프링을 대신해서 오브젝트 생성로직을 담당하도록 만들어진 특별한 빈을 말한다.
    FactoryBean 인터페이스를 구현하고 getObject() 내부에서 Proxy.newProxyInstance() 로 프록시 객체를 생성한다.

  • FactoryBean 을 구현한 클래스를 스프링 빈으로 등록하면 팩토리 빈으로 동작한다.

  • 프록시 팩토리 빈의 한계

    1. 타깃의 부가기능 제공은 메서드 단위로 일어난다.
      → 여러 개의 클래스에 공통적인 부가기능 제공이 불가능하다.

    2. 프록시 팩토리 빈에서 생성되는 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;
    
    }

    MethodInterceptorinvoke() 메서드와 InvocationHandlerinvoke() 메서드 차이점을 보면, InvocationHandler 에서는 타깃 오브젝트를 파라리터로 전달 받았다. 이는 타깃 오브젝트와 결합도가 높아진다.

    MethodInterceptorinvoke()MethodInvocation 만을 파라미터로 전달 받는데, 이 인스턴스 안에 호출할 메서드 정보와 타깃 오브젝트 정보가 같이 들어 있다.
    이 덕분에 타깃 오브젝트와 상관없이 여러 프록시에서 함께 사용될 수 있고, 싱글톤 빈으로 등록이 가능하다.


스프링의 프록시 구성 요소들 용어 정의

  • 어드바이스 : 타깃 오브젝트에 적용할 부가기능을 담은 오브젝트. 중요한 점은 타깃 오브젝트에 종속되지 않는 순수한 부가기능을 담은 오브젝트다.
  • 포인트컷 : 부가기능 적용 대상 메서드 선정 방법

0개의 댓글