AOP(Aspect Oriented Programming) 이해
AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍을 의미한다. 부가 기능(advice)을 동적(프로그램이 실행되면서 자동 추가)으로 추가해주는 기술이고, 좀 더 구체적으로 보자면 메서드의 시작 또는 끝에 자동으로 코드(advice)를 추가해주는 것이다.
※ 횡단 관심사? 서로 다른 계층, 모듈 등에도 공통적으로 쓰이는 것을 표현한 것(Logging, Transaction, Security 등)
다음은 AOP를 이용한 공통 코드의 분리에 대한 예제 코드이다.
void aaa() {
System.out.println("[before]{");
System.out.println("aaa() is called.");
System.out.println("}[after]");
}
void aaa2() {
System.out.println("[before]{");
System.out.println("aaa2() is called.");
System.out.println("}[after]");
}
void bbb() {
System.out.println("[before]{");
System.out.println("bbb() is called.");
System.out.println("}[after]");
}
class MyAdvice {
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(m.getAnnotation(Transactional.class)!=null)
System.out.println("[before]{");
m.invoke(obj, args); // aaa(), aaa2(), bbb() 호출가능
if(m.getAnnotation(Transactional.class)!=null)
System.out.println("}[after]");
}
}
class MyClass {
@Transactional
void aaa() {
System.out.println("aaa() is called.");
}
void aaa2() {
System.out.println("aaa2() is called.");
}
void bbb() {
System.out.println("bbb() is called.");
}
}
위 코드 블럭을 먼저 살펴보면 [before]와 [after]를 출력해주는 코드가 앞뒤로 계속 반복되고 있음을 볼 수 있다. 따라서 핵심 기능을 수행해줄 클래스와 부가 기능을 수행해줄 클래스로 나누고 이를 동적으로 추가해줄 수 있도록 아래 코드 블럭과 같이 작성한다. 그러면 invoke 메서드를 이용해 동적으로 핵심 기능을 수행하는 각 aaa(), aaa2(), bbb() 메서드가 호출되면서 앞뒤로 부가 기능 코드(advice)가 붙게 된다.
이때 패턴을 통해서 특정 메서드만 호출시켜줄 수도 있다. 위 코드에서는 @Transactional 어노테이션이 붙은 메서드만 호출하도록 패턴을 지정해주었다.
부가 기능 코드(advice)를 자동으로 추가할 때 코드 중간에는 추가해주는 것이 불가능한데, 그 이유는 메서드마다 코드 라인 수가 다르고 메서드의 내용이 바뀔 수 있기 때문이다. 따라서 맨 앞과 맨 끝(return문이 있을 경우에는 return문 바로 위)에 추각해줄 수 있도록 한다.
AOP 관련 용어와 Advice의 종류
AOP 관련 용어
용어 | 설명 |
target | advice가 추가 될 객체 |
advice | target에 동적으로 추가 될 부가 기능(코드) |
proxy | target에 advice가 동적으로 추가되어 생성된 객체 |
weaving | target에 advice를 추가해서 proxy를 생성하는 것 |
join point | advice가 추가(join) 될 대상(메서드) |
pointcut | join point들을 정의한 패턴 |
※ pointcut expression => advice가 추가될 메서드를 지정하기 위한 패턴
execution(반환타입 패키지명.클래스명.메서드명(매개변수 목록))
Advice의 종류 => Advice의 설정은 XML과 어노테이션, 두 가지 방법으로 가능(다음의 표는 어노테이션의 종류)
종류 | 어노테이션 | 설명 |
around advice | @Around | 메서드의 시작과 끝 부분에 추가되는 부가 기능 |
before advice | @Before | 메서드의 시작 부분에 추가되는 부가 기능 |
after advice | @After | 메서드의 끝 부분에 추가되는 부가 기능 |
after returning | @AfterReturning | 예외가 발생하지 않았을 때, 실행되는 부가 기능(try 블럭 내의 끝) |
after throwing | @AfterThrowing | 예외가 발생했을 때, 실행되는 부가 기능(catch 블럭 내의 끝) |
'[패스트캠퍼스] 스프링의정석 정리 > Spring' 카테고리의 다른 글
서비스 계층 분리 & @Transactional (0) | 2023.05.19 |
---|---|
DAO & 트랜잭션(Transaction) & 커밋(Commit) & 롤백(Rollback) (0) | 2023.05.19 |
스프링으로 DB 연결 및 다루기 & TDD (0) | 2023.05.19 |
스프링 DI 이론 - 스프링 어노테이션 (0) | 2023.05.18 |
스프링 DI 이론 - IoC와 DI (0) | 2023.05.18 |