반응형
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(반환타입 패키지명.클래스명.메서드명(매개변수 목록))
MyMath라는 메서드 클래스(target)를 작성 후 AopMain2에서 ApplicationContext를 사용하여 호출한다
@Around("execution(* com.springmvcstudy.ch3.aop.MyMath.*(..)") 로 타겟을 지정해 주면
지정해준 패턴에 맞는 메서드에 around advice가 적용이 된다.
AOP는 아직 정확히 이해는 못했다.. 어려운듯 ㅠ
복습이 필요함
반응형
'Spring' 카테고리의 다른 글
[스프링의 정석] MyBatis, DAO작성 (0) | 2023.04.24 |
---|---|
[스프링의 정석] Transactional (0) | 2023.04.24 |
[스프링의 정석] Transaction, Commit, Rollback (0) | 2023.04.21 |
[스프링의 정석] Spring DI 활용하기 / @annotation (0) | 2023.04.19 |
[스프링의 정석] Spring DI 흉내내기 (0) | 2023.04.18 |