Spring/Spring AOP
-
Spring AOP - 프록시 기반 AOPSpring/Spring AOP 2020. 3. 30. 22:08
스프링 AOP 특징 프록시 기반의 AOP 구현체 스프링 빈에서만 AOP 적용 모든 AOP 기능을 제공하는 것이 목적이 아니라, 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제에 대한 애결책을 제공하는 것이 목적 프록시 패턴 기존 코드 변경없이 접근 제어 또는 부가 기능 추가 2020/02/17 - [Java/패턴] - 프록시 패턴 프록시 패턴 프록시 패턴이란? 프록시를 사용하는 방법중에서 타깃에 대한 접근 방법을 제어하려는 목적을 가진 경우 타깃의 기능을 확장하거나 추가하지 않고, 클라이언트가 타깃에 접근하는 방식을 변경해준다. public inte.. rlawls1991.tistory.com 프록시 패턴의 문제점 매번 프록시 클래스를 작성 여러 클래스 여러 메소드에 적용하면 코드의..
-
스프링 AOP - 토비의 스프링 3.1 6장 끝Spring/Spring AOP 2020. 3. 8. 16:45
스프링 AOP 자동 프록시 생성 중복 문제의 접근 방법 JDK의 다이내믹 프록시는 특정 인터페이스를 구현한 오브젝트에 대해서 프록시 역할을 해주는 클래스를 런타임 시 내부적으로 만들어 준다. 런타임 시에 만들어져 사용되기 때문에 클래스 소스가 따로 남지 않을 뿐이지 타깃 인터페이스의 모든 메소드를 구현하는 클래스가 분명히 만들어진다. 변하지 않는 타깃으로의 위임과 부가기능 적용 여부 판단이라는 부분은 코드 생성기법을 이용하는 다이내믹 프록시 기술에 맡기고, 변하는 부가기능 코드는 별도로 만들어서 다이내믹 프록시 생성 팩토리에 DI로 제공하는 방법을 사용한 것이다. 좀 독특하긴 하지만 변하는 로직과 변하지 않는 기계적인 코드를 잘 분리했다. 의미 있는 부가기능 로직인 트랜잭션 경계설정은 코드로 만들게 하고..
-
스프링의 프록시 팩토리 빈Spring/Spring AOP 2020. 3. 4. 21:53
ProxyFactoryBean 자바에는 JDK에서 제공하는 다이내믹 프록시 외에도 편리하게 프록시를 만들 수 있도록 지원해주는 다양한 기술이 존재한다. 따라서 스프링은 일관된 방법으로 프록시를 만들 수 있게 도와주는 추상 레이어를 제공한다. 생성된 프록시는 스프링의 빈으로 등록돼야 한다. 스프링은 프록시 오브젝트를 생성해주는 기술을 추상화한 팩토리 빈을 제공해준다. 스프링의 ProxyFactoryBean은 프록시를 생성해서 빈 오브젝트로 등록하게 해주는 팩토리 빈이다. ProxyFactoryBean은 순수하게 프록시를 생성하는 작업만을 담당하고 프록시를 통해 제공해줄 부가기능은 별도의 빈에 둘 수 있다. ProxyFactortyyBean이 생성하는 프록시에서 사용할 부가기능은 MethodIntercept..
-
다이나믹 프록시 (4)Spring/Spring AOP 2020. 3. 2. 20:36
다이나믹 프록시를 위한 팩토리 빈 위의 글까지 일게 되면 이제 RansactionHandler와 다이내믹 프록시를 스프링의 DI를 통해 사용하 ㄹ수 있도록 만들어야 할 차례이다. 스프링의 빈은 기본적으로 클래스 이름과 프로퍼티로 정의된다. 스프링은 지정되는 클래스의 이름을 가지고 리플랙션을 이용해서 해당 클래스의 오브젝트를 만든다. 클래스의 이름을 갖고 있다면 다음과 같은 방법으로 새로운 오브젝트를 생성할 수 있다. Class의 newInstance()메소드는 해당 클래스의 파라미터가 없는 생성자를 호출하고, 그 결과 생성되는 오브젝트를 돌려주는 리프렉션 API다. Date now = (Date) Class.forName("java.util.Date").newInstance(); 스프링은 내부적으로 리플..
-
다이나믹 프록시 (3)Spring/Spring AOP 2020. 2. 26. 23:16
다이내믹 프록시를 이용한 트랜잭션 부가기능 public class TransactionHandler implements InvocationHandler { private Object target; // 부가기능을 제공할 타깃오브젝트, 어떤타입의 오브젝트에도 적용가능 private PlatformTransactionManager transactionManager; //트랜잭션 기능을 제공하는데 필요한 트랜잭션 매니저 private String pattern;//트랜잭션을 적용할 메소드 이름 패턴 public void setTarget(Object target) { this.target = target; } public void setTransactionManager(PlatformTransactionMan..
-
다이나믹 프록시 (2)Spring/Spring AOP 2020. 2. 19. 21:12
다이내믹 프록시 적용 AOP - 다이나믹 프록시 (1)에 포함되어있는 HelloUppercase의 동작방식은 위와 같다. 다이나믹 프록시는 프록시 팩토리에 의해 런타임 시 다이내믹하게 만들어지는 오브젝트다. 다이내믹 프록시 오브젝트는 타깃의 인터페이스와 같은 타입으로 만들어진다. 클라이언트는 다이내믹 프록시 오브젝트를 타깃 인터페이스를 통해 사용할 수 있다. 이렇게 됨으로써 프록시 적용 문제점 중 하나인 인터페이스의 모든 메소드를 구현해 위임하는 단점을 제고해 준다. 즉 프록시 팩토리에게 인터페이스 정보만 제공해주면 해당 인터페이스 구현한 클래스의 오브젝트를 자동으로 만들어 주기 때문이다. 다이내믹 프록시가 인터페이스 구현클래스의 오브젝트는 만들어주지만 프록시로서 필요한 부가기능 제공 코드는 직접 작성해..
-
다이나믹 프록시 (1)Spring/Spring AOP 2020. 2. 18. 21:30
이거 보기 전 패턴 메뉴에 있는 프록시 패턴과 데코레이터 패턴 보기! 2020/02/17 - [Java/패턴] - 데코레이터 패턴 2020/02/17 - [Java/패턴] - 프록시 패턴 다이나믹 프록시 프록시는 기존 코드에 영향을 주지 않으면서 타깃의 기능을 확장하거나 접근 방법을 제어할 수 있는 유용한 방법이다. 하지만 프록시를 만드는 거는 번거롭다. 매번 새로운 클래스를 정의해야 하고, 인터페이스의 구현해야 할 메소드는 많으면 모든 메소드를 일일이 구현해서 위임하는 코드를 작성해야 되기 때문이다. 비슷한 사호아으로는 단위 테스트를 위해 목이나 스텁을 일일이 클래스로 정의하고 인터페이스의 모의 메소드를 구현하는 일이 불편했던 것이기 때문이다. 그러나 목 프레임워크를 사용해 편리하게 바꿨던 것처럼 프록..
-
AOP - 트랜잭션Spring/Spring AOP 2020. 2. 12. 20:07
1. 메소드 분리 위 코드의 특징은 트랜잭션 경계설정의 코드와 비지니스 로직 코드 간에 서로 주고받는 정보가 없는 완벽하게 독립적인 코드 순수하게 사용자 레벨 업그레이드를 담당하는 비지니스 로직코드만 독립적인 메소드에 담겨있기 때문에 이해도 쉽고 수정도 부담이 없다.실수로 트랜잭션 코드를 건드릴 염려도 없어졌다. 위와같이 책에 적혀있는 메소드를 분리하는 로직을 직접 이해하고 사용해보니 회사에서 분리시켜야되는 메소드들이 생각나기 시작했다.... 내일 점심시간에 이 부분좀 수정해야겠다. 2. DI를 이용한 클래스의 분리 그림 1-2 구조는 2-1 그림과 같이 강한 결합도로 고정되어 있다. 그래서 위의 결합도를 약하게 만들기 위하여 UserSerice를 인터페이스로 만들고 기존 코드는 UserService인터..