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에 접근하는 방법을 제어할 때 사용된다.) |
Weaving | Advice를 핵심 기능(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: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.javapublic class LogAop {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 실행 |
참고 자료
Spring 4 입문(한빛미디어)
인프런 강좌(신입 프로그래머를 위한 자바 스프링 프레임워크 강좌)
'Framework > Spring' 카테고리의 다른 글
eclipse를 이용한 spring MVC project 생성하기(동작방식과 구조) (0) | 2018.01.02 |
---|---|
Bean의 Scope 지정 (0) | 2017.12.28 |
Environment를 이용한 bean 설정 (0) | 2017.12.27 |
Bean 파일을 이용한 DI (0) | 2017.12.27 |