Aspect Oriented Programming (관점 지향 프로그래밍)
- 어플리케이션은 다양한 공통 기능을 필요로 한다.
- 어플리케이션에서 전반적으로 걸쳐 적용되는 공통 기능들 은 특정 모듈들에서만 적용 되는게 아니다.
- 이런 공통 기능들을 공통 관심 사항(cross-cutting concern) 으로 표현하고 공통 관심 사항을 제외한 핵심 로직을 핵심 관심 사항(core concern) 으로 표현한다.
- AOP는 이런 공통 관심 사항과 핵심 관심 사항을 관점적으로 분리해서 보자는 의미이다.
AOP의 장점
1. 중복 코드 제거 에 따른 코드의 간결성
2. 생산성 향상
3. 공통기능 빠진 클래스는 재사용성 증가
4. 유지보수성 향상
AOP 용어 정리
▶ Aspect : 여러 객체에 공통으로 적용되는 공통 관심사를 모듈화 한 것.
큰 개념은 Aspect = Advice(시점) + PointCut(구체적인 지점)
▶ Target : Aspect를 적용하는 곳 (클래스, 메서드 등)
▶ Advice : 언제 공통 관심 기능을 핵심 로직에 적용할지 정의하는 것.
실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체.
시점 (ex> 어떤method 호출전 트랜젝션을 시작한다.)
동작시점
- Before : 메서드 실행 전에 동작.
- After : 메서드 실행 후에 동작.
- After-returning : 메서드가 예외 없이 정상적으로 실행된 후에 동작.
- After-throwing : 예외가 발생한 후에 동작.
- Around : 모든 시점에서 동작.(범용)
▶ JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점,
필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능.
▶ PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이
더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음. (PointCut ⊂ JoinPoint)
-> AspectJ 문법(PointCut 표현식)
execution([접근자제어패턴], 리턴타입패턴 [패키지패턴] 메서드이름패턴(파라미터패턴))
간단하게 설명하면 [ * ]은 모든 것 [ .. ]은 0개 이상이라는 의미이다. 아래 예시를 통해 이해해보자.
<aop:pointcut id="publicMethod"
expression="execution(public * board..*(..))" />
- 접근자제어패턴 : public
- 리턴타입패턴 : *
- 패키지패턴 : board.. 및 하위 패키지 (board 패키지만 포함할 시 board. 사용)
- 메서드이름패턴 : *
- 파라미터패턴 : ..
▶ Weaving : Advice를 핵심 로직 코드에 적용하는 것. 행위