이전에 step2에서 포인트컷 표현식과 트랜잭션 속성을 이용해 트랜잭션을 일괄적으로 적용하는 방식은 복잡한 트랜잭션 속성이 요구되지 않는 한 대부분의 상황에 적용가능하지만 클래스나 메소드에 다라 제각각 속성이 다른, 세밀하게 튜닝된 트랜잭션 속성을 적용해야 하는 경우 일괄적으로 속성을 부여하는 것 대신에 직접 타깃에 트랜잭션 속성정보를 가진 애노테이션을 이용하는 방법이 있다. @Transactional을 정의한 코드는 직관적이라 이전에 설명한 속성을 모두 포함하고 있다. pacakage org.springframwork.transaction.annotation; ... @Target({ElementType.METHOD, ElementType.TYPE}) @Retension(RetentionPolicy.R..
이전에 step1에서 코드로 만든 어드바이스를 제외한 자동 프록시 생성기(DefaultAdvisorAutoproxyCreator), 포인트 컷(AspectJExpressionPointcut), 어드바이저(DefaultPointcutAdvisor)는 모두 스프링이 직접 제공하는 클래스를 빈으로 등록하고 프로퍼티를 설정해줬다. 이 세가지 클래스를 이용해 선언하는 빈은 AOP를 적용하면 반복적으로 등장하게 된다. 스프링에서는 AOP를 위해 기계적으로 적용하는 빈들을 간편한 방법으로 등록할 수 있다. AOP와 관련된 태그를 정의해둔 aop 스키마를 제공한다. 더보기 네임스페이스(Namespace)는 XML 문서에서 요소, 속성 등을 구분하기 위한 식별자(identifier)이다. XML 문서에서는 각 요소나 속..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bzDcnz/btsdsQXQuM9/spVmAGBw9LJ6HNnyqtHpk0/img.png)
이전 step4에서 고민한 자동 프록시 생성을 빈 후처리기를 이용한다. BeanPostProcessor 인터페이스를 구현해서 만든 빈 후처리기를 이용하면 스프링 빈 오브젝트로 만들어지고 난 후에 빈 오브젝트를 다시 가공할 수 있게 해준다. 빈 후처리기 중의 하나인 DefaultAdvisorAutoProxyCreator를 사용하여 문제를 해결한다. 빈 후처리기를 스프링에 적용하는 방법은 빈 후처리기 자체를 빈으로 등록하면 빈 오브젝트가 생설될 때마다 빈 후처리기에 보내서 후처리 작업을 요청한다. 이를 잘 이용한다면 타깃 빈 오브젝트의 일부를 프록시로 포장하고 프록시를 빈으로 대신 등록하는 작업이 가능하다. 이것이 자동 프록시 생성 빈 후처리기다. 1, 2. DefaultAdvisorAutoProxyCrea..
이전에 Transactio을 어떻게 로직을 분리하는지 메소드 분리부터, 프록시와 데코레이터패턴, 다이내믹 프록시, 프록시 팩토리 빈, 자동 프록시 생성 순서로 알아보았고 이것은 부가기능의 모듈화가 목적인 것을 파악했다. 결론적으로 AOP를 입문하게 되었다. https://sh970901.tistory.com/category/Spring/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EA%B3%BC%20AOP 'Spring/트랜잭션과 AOP' 카테고리의 글 목록 sh970901.tistory.com 토비의 스프링 3.1을 읽고 해석해서 풀어 쓴 글이다. 아직 이 책이 없다면 필자는 꼭 사서 두고두고 보는 것을 추천한다. AOP : 애스펙트 지향 프로그래밍 애스펙트란 그 자체로 애플리케이..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/csvKEa/btsdgTtL08i/3isBFRd4u0wVpq1oPr8ddK/img.png)
JDK 다이내믹 프록시 생성 예제와 스프링에서 제공하는 ProxyFactoryBean의 차이를 살펴보자. //JDK 다이내믹 프록시 생성 public void simpleProxyTest{ Hello proxiedHello = (Hello)Proxy.newProxyInstance( getClass().getClassLoader(), -> 동적으로 생성되는 다이내믹 프록시 클래스의 로딩에 사용될 클래스 로더 new Class[]{ Hello.class }, -> 구현할 인터페이스 new UppercaseHandler(new HelloTarget()) -> 부가 기능과 위임 코드를 담은 InvocationHandler); ... } //스프링의 ProxyFactoryBean 사용 public void pro..
이전 step2 에서 비즈니스 로직과 트랜잭션 로직을 분리하기 위해 UserService(인터페이스) -> UserServiceTx(트랜잭션 로직) -> UserServiceImpl(비즈니스 로직)을 구현했다. 이 구성에는 번거러운 코드 작성과 중복 코드 작성 등의 문제가 있었다. 이를 자바의 리플렉션 API 기능을 이용해 다이내믹 프록시를 만들어 해결할 수 있다. 리플렉션이란 런타임 시점에 객체의 클래스 타입, 필드, 메서드 등의 정보를 동적으로 가져올 수 있는 기능이다. 예를 들어 String name = "LEE_SEUNGHUN" 일 때 이 문자열의 길이를 알고 싶다면 length()라는 메소드를 호출할 것이다. 자바의 모든 클래스는 그 클래스 자체의 구성정보를 담은 Class 타입으 오브젝트를 하..