본문 바로가기
Spring

[스프링의 정석] AOP의 개념과 용어

by 리잼 2023. 4. 21.
반응형

1. 공통 코드의 분리

위와 같이 공통된 부분이 있는 코드가 있다고 한다면

import java.lang.reflect.Method;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class AopMain {
    public static void main(String[] args) throws Exception {
        MyAdvide myAdvide = new MyAdvide();

        Class myClass = Class.forName("com.springmvcstudy.ch3.aop.MyClass");
        Object obj = myClass.newInstance();

        for (Method m : myClass.getDeclaredMethods()) {
            myAdvide.invoke(m, obj, null);
        }
    }

}

class MyAdvide {
    Pattern p = Pattern.compile("a.*");

    boolean matches(Method m) {
        Matcher matcher = p.matcher(m.getName());
        return matcher.matches();
    }

    void invoke(Method m, Object obj, Object... args) throws Exception {
        if(matches(m))
            System.out.println("[before] {");
        m.invoke(obj,args);  // aaa(), aaa2(), bbb() 호출 가능

        if(matches(m))
            System.out.println("}[after]");
    }
}

class MyClass {

    void aaa() {
        System.out.println("aaa() is called");
    }
    void aaa2() {
        System.out.println("aaa2() is called");
    }
    void bbb() {
        System.out.println("bbb() is called");
    }
}

실행 결과

동적으로 MyClass를 불러와서

코드에 Pattern을 사용하여 a로 시작하는 메서드만 [before] [after] 가 출력되도록 한다

이런식으로 어노테이션이 붙은 메서드만 호출하는것도 가능하다

 

2. 코드를 자동으로 추가한다면 어디에?

코드의 시작부분에 자동 추가하는 것을 Before Advice 라고 하고

끝 부분에 자동 추가 하는것을 After Advice

양 쪽에 다 넣는 것을 Around Advice 라고 한다 그러나 자동 추가를 중간에만 넣을 순 없다

 

3. AOP( Aspect Oriented Programming ) 란?

  • 관점 지향 프로그래밍? 횡단 관심사? cross-cutting concerns?
  • 부가 기능(advice)를 동적으로 추가해주는 기술
  • 메서드의 시작 또는 끝에 자동으로 코드를 추가

4. AOP 관련 용어

용어 설명
target advice가 추가될 객체
advice target에 동적으로 추가될 부가 기능 ( 코드 )
join point advice에 추가 ( join ) 될 대상 ( 메서드 )
pointcut join point들을 정의 한 패턴. ex) execution(*com.springstudy.*.*(..))
proxy target에 advice가 동적으로 추가되어 생성된 객체
weaving target에 advice를 추가해서 proxy를 생성하는 것

중복과 관심사가 분리되지 않아 하나로 뭉쳐있던 코드는 메서드를 수정할 일이 많기 때문에

변경에 유리한 코드로 만들기 위해 분리를 해야한다

5. Advice의 종류

  • Advice의 설정은 XML과 애너테이션, 두 가지 방법으로 가능하다
종류 애너테이션 설명
around Advice @Around 메서드의 시작과 끝 부분에 추가되는 부가 기능
before Advice @Before 메서드의 시작 부분에 추가되는 부가기능
after Advice @After 메서드의 끝 부분에 추가되는 부가기능
after retruning @AfterReturning 예외가 발생하지 않았을 때, 실행되는 부가 기능
after throwing @AtgerTrowing 예외가 발생했을 때, 실행되는 부가 기능

6. pointcut expression

  • advice가 추가될 메서드를 지정하기 위한 패턴

execution(반환타입 패키지명.클래스명.메서드명(매개변수 목록))

root-contexet_aop.xml

MyMath라는 메서드 클래스(target)를 작성 후 AopMain2에서 ApplicationContext를 사용하여 호출한다

@Around("execution(* com.springmvcstudy.ch3.aop.MyMath.*(..)") 로 타겟을 지정해 주면

지정해준 패턴에 맞는 메서드에 around advice가 적용이 된다.

실행결과

AOP는 아직 정확히 이해는 못했다.. 어려운듯 ㅠ

복습이 필요함

반응형