AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.
각각의 색들은 Concern이라고 보면된다. 여기서 Concern이란 여러 클래스, 메서드에 걸쳐서 나타나는 비슷한 코드들을 의미한다.
각 클래스에 있는 Crosscutting Concerns, 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지이다.
프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서임
스프링 빈에만 AOP를 적용 가능
모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 ...)에 대한 해결책을 지원하는 것이 목적입니다.
▶ Aspect
흩어진 관심사(Crosscutting Concerns)를 묶어서 모듈화 한 것. 하나의 모듈. Advice와 Point Cut이 들어간다.
▶ Target
Aspect가 가지고 있는 Advice가 적용되는 대상(클래스, 메서드 등등)을 말한다.
▶ Advice
어떤 일을 해야할 지에 대한 것. 해야할 일들에 대한 정보를 가지고 있다.
▶ Join Point
가장 흔한 Join Point는 메서드 실행 시점이다. Advice가 적용될 위치, 끼어들 수 있는 지점. 생성자 호출 직전, 생성자 호출 시, 필드에 접근하기 전, 필드에서 값을 가져갔을 때 등등.
▶ Point Cut
Join Point의 상세한 스펙을 정의한 것. 어디에 적용해야 하는지에 대한 정보를 가지고 있다. “A 클래스에 B 메서드를 적용할 때 호출을 해라.”와 같은 구체적인 정보를 준다.
<!-- AOP -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
</dependency>
공통기능의 클래스 제작 - Advice 역할 클래스
// proxy
public class LogAop {
// 경과시간 체크하는 공통기능 메소드
public Object loggerAop(ProceedingJoinPoint joinPoint) throws Throwable {
//
}
}
XML설정 파일에 Aspect 설정
<bean id="logAop" class="com.edu.ex.LogAop"></bean>
<aop:config>
<aop:aspect id="logger" ref="logAop">
<aop:pointcut expression="within(com.edu.ex.*)" id="publicMethod"/>
<aop:around pointcut-ref="publicMethod" method="loggerAop"/>
</aop:aspect>
</aop:config>
public class HelloAop {
public static void main(String[] args){
new HelloAop().sayHello("test");
}
private void sayHello(String msg){
System.out.println(msg);
}
}
public aspect HelloMessage {
poing cut helloCall(): call(* HelloAop.sayHello(..));
before(): helloCall(){
System.out.println("around");
}
}
before
test
around