본문 바로가기

Spring|Spring-boot/Spring AOP10

Spring AOP 한계(2) Spring은 프록시 기반의 AOP만을 지원하고 있다. 프록시 객체를 생성하는 방법은 크게 두 가지로 나뉜다. JDK 동적 프록시 CGLIB JDK 동적 프록시인 경우에는 인터페이스가 필수이며, 인터페이스 기반으로 프록시 객체를 생성한다. CGLIB는 구체 클래스를 기반으로 생성한다. 하지만 인터페이스가 있는 경우에는 JDK 동적프록시, CGLIB 둘 중 하나를 선택할 수 있다. 이는 spring 옵션 중 proxyTargetClass을 활용하여 선택할 수 있으며 false인 경우 JDK, true인 경우 CGLIB를 사용한다. 테스트 준비 Example은 구체 클래스 ExampleImpl은 ExampleInterface를 사용해 만든 구현체 ExampleInterface는 인터페이스이다. JDK 동적 .. 2022. 10. 14.
Spring AOP 한계 스프링에서 제공하는 AOP를 사용하면서 기억해야 할 것들 스프링 AOP는 프록시프락시 방식의 AOP만을 사용한다. 따라서 AOP를 적용하기 위해서는 프록시를 통해 실제 Target에 접근해야 하는데, 이 과정에서 프록시에서 Advice를 실행한 후 대상 객체를 호출하게 된다. 만약 대상 객체가 포인트 컷을 통해 매칭될 시 스프링 빈으로 프록시 객체가 등록된다. 따라서 스프링은 해당 객체의 의존관계 주입 시 프록시 객체를 주입해주기 때문에 대부분 대상 객체 직접 호출 문제는 발생하지 않는다. 하지만 대상 객체 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 있다. 간단한 테스트를 진행하자 @Slf4j @Service public class InternalCallSer.. 2022. 1. 31.
Spring AOP 매개변수 활용 this. target, args, @target, @within, @annotation, @args의 지시자들은 표현식을 사용해 어드바이스에 매개변수를 전달할 수 있다. 1. 포인트 컷의 이름과 매개변수의 이름을 맞추어야 한다. 2. 타입이 메서드에 지정한 타입으로 제한된다. @Test void success() { log.info("memberService Proxy= {}", memberService.getClass()); memberService.hello("helloA"); } @Slf4j @Aspect static class ParameterAspect { @Pointcut("execution( * hello.aop.member..*.*(..))") public void allMember(){.. 2022. 1. 30.
Spring AOP @target, @within @target : 실행 객체의 클래스에 주어진 타입의 애노테이션이 있는 조인 포인트 @within : 주어진 애노테이션이 있는 타입 내 조인 포인트 이 둘은 사용자 정의 애노테이션으로 AOP 적용 여부를 판단한다. Class, Method에 붙일 애노테이션을 준비하자. @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface ClassAOP { } @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface ClassAOP { } @target과 @within의 차이 - @target은 인스턴스의 모든 메서드를 조인 포인트로 적용한다. -.. 2022. 1. 29.
Pointcut - within, args within within 지시자는 특정 타입 내의 조인 포인트에 대한 매칭을 제한한다. 해당 타입이 매칭 되면 그 안의 메서드들이 자동적으로 매칭 된다. 즉 execution에서 타입 부분만 사용한다. AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); pointcut.setExpression("within(hello.aop.example.Example)"); Method exampleMethod = Example.class.getMethod("test", String.class); assertThat(pointcut.matches(exampleMethod, Example.class)).isTrue(); AspectJExpressi.. 2022. 1. 29.
Pointcut - execution AspectJ는 Pointcut을 편리하게 표현하기 위한 표현식을 별도로 제공한다. AspectJ pointcut expression이라고 부르며 간단하게 포인트 컷 표현식이라고 부른다. 이러한 포인트 컷 표현식에는 Pointcut Designator라는 포인트 컷 지시자가 존재하며 예를 들어 execution, within.. 등등이 존재한다. 포인트 컷 지시자의 종류 종류 execution : 메서드 실행 조인 포인트를 매칭 한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다. within : 특정 타입 내의 조인 포인트를 매칭 한다. args : 인자가 주어진 타입의 인스턴스인 조인 포인트 this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 target : T.. 2022. 1. 29.
Spring AOP (2) 설정 사항 - org.aspectj 패키지 관련 기능은 aspectjweaver.jar 라이브러리가 제공하는 기능이다. 따라서 해당 라이브러리 의존관계의 추가가 필요하며 spring-boot인 경우 spring-boot-starter-aop를 포함하면 스프링 AOP 기능 + asppecthweaver.jar도 함께 사용할 수 있도록 의존관계에 포함된다. 구성요소 포인트 컷을 별도의 클래스로 관리하여 public으로 사용할 수 있도록 구성할 것이다. import org.aspectj.lang.annotation.Pointcut; public class Pointcuts { @Pointcut("execution(* hello.aop.example..*(..))") public void allExample().. 2022. 1. 29.
Spring AOP 사전 지식 빈 후처리기 @Aspect Aspect 기억 되살리기 @Aspect를 어드바이저로 변환해서 저장하는 과정 1. 스프링 애플리케이션 로딩 시점에 자동 프락시 생성기(AnnotationAwareAspectJAutoProxyCreator) 호출 2. 자동 프록시 생성기는 스프링 컨테이너에서 @Aspect 애노테이션이 붙은 스프링 빈 모두 조회 3. @Aspect Advisor Builder를 통해 어드바이저 생성 4. 생성한 어드바이저를 빌더 내부에 저장. 자동 프록시 생성기 작동 과정 1. 스프링 빈 대상 객체 생성 2. 컨테이너에 저장하기 전 빈 후처리기 전달 3. 스프링 컨테이너에서 Advisor 빈, @Aspect 어드바이저 빌드에 저장된 Advisor빈 모두 조회 4. 프록시 적용 대상을 .. 2022. 1. 27.
[Spring boot] AOP 활용예제 2022.01.27 - [Spring|Spring-boot/Spring AOP] - Spring AOP Spring AOP 사전 지식 빈 후처리기 @Aspect Aspect 기억 되살리기 @Aspect를 어드바이저로 변환해서 저장하는 과정 1. 스프링 애플리케이션 로딩 시점에 자동 프락시 생성기(AnnotationAwareAspectJAutoProxyCreator) 호출 2. chinggin.tistory.com 2022.01.29 - [Spring|Spring-boot/Spring AOP] - Spring AOP (2) Spring AOP (2) 설정 사항 - org.aspectj 패키지 관련 기능은 aspectjweaver.jar 라이브러리가 제공하는 기능이다. 따라서 해당 라이브러리 의존관계의 추가.. 2021. 6. 9.
[Spring] AOP(Aspect Oriented Programming) 방법론 AOP란 관점에 따라서 프로그램을 만드는 방식입니다. 우리는 보통 사용자의 관점에서만 프로그램을 만들었습니다. 객체지향보다 더 큰 단위인 AOP는 개발자, 운영자들의 관점에 대해 프로그램을 만들 것인가? 하는 이야기입니다. 로그 처리 (성능 테스트) , 보안 처리 , 트랜잭션 처리 등등 을 위해 Croos-cutting Concern이 되며 주 업무 로직 사용자가 요청한 서비스를 Primary Concern으로 표현됩니다. 우리는 주 업무 로직과 크로스커팅을 합칠 일이 많았습니다. 과거에는 이러한 Core Concern와 Cross-cutting Concern을 합칠 때 크로스커팅을 주석 처리했다가 풀었다가 하는 일이 많았습니다. 관점이 다른 코드를 을 쉽게 뺏다 꽂았다 하는 방법을 생각하다 보니 나온 .. 2020. 6. 22.