AOP란?
AOP (Aspect oriented programming)의 약자이며, Spring framework 의 핵심 기능이다.
AOP는 프로그램 로직을 concern이라는 작은 단위로 분리한다. 이러한 concern은 프로그램의 여러 위치에서 동작하며 이를 cross-cutting concern이라고한다.
AOP를 이용하면 좋은점 :
예를 들어 햄버거 만드는 과정을 하나의 서비스라고 해보자.
이때 우리는 하나의 햄버거가 만들어 지는 시간을 측정해야할 필요가 생겼다고 하자.
기존의 방법대로 프로그래밍을 해야한다고 한다면 우리는 햄버거 만드는 과정에 대한 서비스 자체를 수정해야한다.
햄버거를 만들기 시작할때 스톱워치를 켜야하고, 햄버거를 만들고, 햄버거를 포장까지 하고난뒤 스톱워치를 정지하여 시간을 측정하는 기록지에 적어야 한다.
스톱워치를 시작하는 행위나 정지하는 행위 그리고 측정내역을 기록하는 행위는 햄버거를 만드는 핵심 서비스 과장과는 완젼히 상관이 없는 행위이다.
이러한 작업을 수행하기 위해서 우리는 시간을 측정하는 기능을 AOP를 이용하여 기록하게 할 수 있고, 햄버거를 만드는 서비스는 수정할 필요 없다.
즉, 이러한 핵심작업은 신경쓰지 않고 필요한 작업을 할 수 있고, 신뢰성이 있는 서비스를 제공해 줄 수 있으며, 나아가 햄버거 만드는 작업이 변경이 되더라도 시간을 기록하는 행위 자체를 또다시 분석하거나 손대지 않아도 된다.
AOP는 핵심 기능에 충실하게 프로그래밍 할 수 있도록 하여, 더 견고하고, 확장성 있는 프로그램을 개발 할 수 있도록 해준다.
AOP의 용어 :
1. Aspect :
- cross-cutting에 필요한 제공되는 API의 셋을 가지는 모듈이다.
- 예를 들어 로깅에 필요한 로깅모듈을 AOP의 aspect라고 부른다.
2. Join point :
- AOP aspect 플러그인이 되는 프로그램의 위치를 의미한다. Spring AOP 프레임워크에서 사용되는 위치이다.
3. Advice :
- 메소드가 실행되기 전이나 후에 실제 액션을 의미한다. 이것은 실제 프로그램이 수행되는 코드의 특정 조각이다.
4. Pointcut :
- 이것은 하나 이상의 join point의 셋이다. 이는 표현식이나 패턴을 이용하여 AOP를 수행될 수 있도록 지정한다.
5. Introduction :
- introduction은 존재하는 클래스에 새로운 메소드나 속성들을 추가하도록 허용한다.
6. Target object :
- 하나 혹은 여러개의 aspect에 의해서 advice 받는 객체를 말한다. 이것은 항상 proxy된 객체이다.
7. Weaving :
- Weaving은 aspect를 객체에 연결해주는 과정을 이야기한다. 이것은 컴파일타임에 완료되거나, 로드타임, 혹은 실행시점에 연결이 될 수 있다.
AOP에서 Advice의 타입
AOP에서는 5가지 advice 를 가진다.
1. Before :
- 메소드가 실행되기 이전에 실행되는 advice이다.
2. After :
- 메소드가 실행되고 나올때 수행되는 adivce이다.
3. After-Returning :
- 메소드가 완젼히 수행된 이후에 수행되는 advice이다.
4. After-throwing :
- exception이 throw되는 경우에 수행되는 advice이다.
5. Around :
- 메소드가 호출되었을때 시작과 종료시점에 수행된다.
적용 방식 :
- Spring framework는 2가지 적용 방식을 제공하고 있다.
1. XML Schema based : Sample Source Download
- Aspects를 일반적인 XML 방식의 설정으로 구현할 수 있도록 한다.
2. @AspectJ based : Sample Source Download for Annotation
- @AspectJ 는 일반적인 자바5 이후의 annotation 을 이용한 선언적인 방식을 사용한다.