AOP란?

AOP는 관점 지향 프로그래밍이다. 이 관점이라는 것에 대해 설명해보겠다.

OOP는 핵심단위를 클래스로 보아 객체로써 모듈화를 시키지만, AOP는 다양한 타입 혹은 객체에 걸친 트랜젝션을 모아서 관심으로 모듈화 시킨다.

AOP를 이용하면 공통 기능과 핵심 기능을 분리하여 공통된 처리를 제거할 수 있다.

즉, AOP란 핵심 코드를 바라본다라는 패러다임으로 이해하면 될 것 같다.

AOP는 언제 사용하는가?

우선 실제 업무 처리에는 사용하는 것은 좋지 않다. 가동적이 현저히 떨어지기 때문이다.

AOP로 분리해도 되는 처리는 로그 출력이나 트랜잭션 처리 등 공통화 할 수 있는 처리에 사용된다.

AOP의 용어 정리

이름설명
관점(Aspect)여러 클래스에 걸친 관심사의 모듈이다. 즉 공통 기능으로 볼 수 있다.
조인 포인트(Join Point)프로그램이 실행되는 중의 특정 지점이다.(특정 지점은 메서드의 실행 혹은 예외처리 부분이라 생각하면 된다. 즉, 핵심 기능 하나하나를 의미한다.)
어드바이스(Advice)Aspect의 기능으로(공통 기능) 특정 조인포인트에서 관점이 취하는 행동을 나타낸다.
포인트컷(Point cut)Join Point의 부분으로 실제 Advice가 적용되는 부분이다. (Advice는 point cut의 expression과 매칭되고, point cut이 매칭한 join point에서 실행된다.)
AOP Proxy클라이언트의 요청을 받아주어 처리한다.(target에 접근하는 방법을 제어할 때 사용된다.)
WeavingAdvice를 핵심 기능(point cut)에 적용하는 행위이다.

AOP 적용 방법

AOP 적용 방법에는 Bean 파일을 이용한 방법과 어토네이션을 이용한 방법이 있다. 이번 포스팅에서는 Bean 파일을 이용한 방법을 다루겠다.

아래 예제는 LogAop라는 클래스에서 로깅을 다룬다. 우선 bean 파일에 LogAop 클래스의 객체를 생성해준다.

// applicationCTX.xml
 
<bean id="logAop" class="com.bbo.ex.LogAop" />

다음 부분은 aop를 적용한다.

pointcut 을 적용하기 위해 expression을 지정해준다. 아래 예제는 com.bbo.ex 에 있는 모든 클래스의 함수 호출에 적용하겠다라는 것을 의미한다.

만약 특정 클래스로 한정 짓고 싶다면 expression의 범위를 수정하면 된다.

// applicationCTX.xml
 
<aop:config>
    <aop:aspect id="logger" ref="logAop">
        <aop:pointcut id="publicM" expression="within(com.bbo.ex.*)"  />
 
      <!-- advice 설정 부분 -->
        <aop:around pointcut-ref="publicM" method="loggerAop" />
    </aop:aspect>
</aop:config>

위의 코드중 다음 코드는 advice와 pointcut을 연결하는 과정이다.

pointcut-ref를 이용해 pointcut으로 설정한 id를 참조하고 method 속성을 이용해 advice의 메소드를 LogAop의 loggerAop라는 함수로 지정한다.

<!-- advice 설정 부분 -->
<aop:around pointcut-ref="publicM" method="loggerAop" />

마지막으로 AOP를 적용할 클래스를 생성한다.

중요한 부분은 Advice method의 첫 파라미터는 반드시 ProceedingJoinPoint 타입이어야 한다. ProceedingJoinPoint의 proceed()를 호출하면 기반하는 메소드를 호출한다.

//LogAop.java
 
public class LogAop {
 
    public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
 
        try {
            Object obj = joinpoint.proceed();
            return obj;
        }
 
    }
 
}

정리

bean 파일을 이용한 AOP의 적용방법에 대해 알아보았다. 실제 적용할 때는 LogAop 클래스에 Log를 찍어볼 수 있다. 예를 들어 Person이라는 클래스를 만들고 내부적으로 멤버 함수를 호출할 때 pointcut의 expression 의 범위에 해당하는 클래스라면 AOP가 적용되어 loggerAop라는 함수를 거치게 될 것이다.

그리고 proceed() 함수 호출을 통해 기반하는 메소드가 호출될 것이다.

추가적으로 advice 타입에 대해 간략히 정리한다. 자세한 내용은 검색을 통해 알아보면 좋을 것 같다.

속성내용
aop:before메소드 실행 전(Join point 이전) advice를 실행
aop:after메소드 실행 중 exception이 발생 하여도 advice를 실행
aop:after-returning메소드가 정상적으로 실행 된 후에 advice를 실행
aop:around메서드 실행 전, 후, 예외 발생 등 모든 시점에서 advice를 실행
aop:after-throwing메소드가 실행 중 exception이 발생 시 advice 실행

참고 자료

I's Story

Outsider's Dev Story

Spring 4 입문(한빛미디어)

인프런 강좌(신입 프로그래머를 위한 자바 스프링 프레임워크 강좌)

+ Recent posts