AOP
1. AOP 개요와 용어
1) 핵심기능과 부가기능
- 업무(Biz) 로직을 포함하는 기능 : 핵심 기능(Core Concerns)
- 핵심기능을 도와주는 부가적인 기능(로깅, 보안 등) : 보안기능 (Cross-cutting Concerns)
2) AOP (Aspect Oriented Programming)
- 분리한 부가기능을 애스펙트라는 모듈형태로 만들어서 설계,개발하는 방법
- AOP는 부가기능을 애스팩트로 정의하여 핵심기능에서 부가기능을 분리함.
- 관점 지향 프로그래밍(AOP)을 이용해서 주기능과 보조기능을 분리해서 메서드에 적용
2. AOP 용어
1) 애스펙트(Aspect)
- 부가기능을 정의한 코드인 어드바이스(Advice)와 어드바이스를 어디에
적용할지를 결정하는 포인트 컷(PointCut)
- Aspect = Advice + PointCut
2) 타켓(Target)
- 핵심기능을 담고 있는 모듈
- 타겟은 부가기능을 부여할 대상이 됨.
3) 어드바이스(Advice)
4) 포인트 컷(PointCut)
- 어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식임.
- 포인트컷 표현식은 execution으로 시작함.
5) 위빙(Weaving)
- 포인트컷에 의해서 결정된 타겟의 조인 포인트에 부가기능(어드바이스)을 삽입하는
과정을 뜻함
- 핵심기능(타겟)의 코드에 영향을 주지 않으면서 필요한 부가기능(어드바이스)을 추가
할수 있도록 해주는 핵심적인 처리과정
6) 조인 포인트(Join Point)
- 어드바이스가 적용될 수 있는 위치
- 타겟 객체가 구현한 인터페이스의 모든 메서드는 조인 포인트가 됨.
- AOP가 적용되는 지점
3. AOP 기능을 구현하는 방법
1) 제공하는 API을 이용하는 방법
2) @Aspect 애너테이션을 이용한 AOP 구현 방법
- 부가기능 제공하는 Aspect 클래스를 작성함
- Aspect 클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함함
- XML 설정 파일에
<aop:aspectj-autoproxy />
를 설정함.
4. Spring AOP 특징
- Spring은 타겟(Target) 객체에 대한 프록시를 만들어 제공함
- 타겟을 감싸는 프록시는 실행시간(Runtime)에 생성됨
- 프록시(Proxy)는 어드바이스를 타겟 객체에 적용하면서 생성되는 객체임.
- 프록시가 호출을 가로챔 (Intercept)
- Spring AOP는 메서드 조인 포인트만 지원함
5. 포인트컷 관련 용어
1) 지시자 (exection, within, bean)
1-1 execution
2) 어드바이스 동작 시점
1-1 Before 어드바이스
- 타겟의 메서드가 실행되기 이전(before) 시점에 처리해야 할 필요가 있는 부가기능을 정의함
- JoinPoint 앞에서 실행되는 Advice
1-2 After 어드바이스
1-3 After-returning 어드바이스
1-4 After-throwing 어드바이스
1-5 Around 어드바이스
- 타겟의 메서드가 호출되기 이전(before) 시점과 이후(after) 시점에 모두 처리해야 할
필요가 있는 부가기능을 정의함.
- JoinPoint 앞과 뒤에서 실행되는 Advice
6. JoinPoint Interface
- AspectJ에서 AOP가 적용되는 지점을 뜻함
- getArgs() : 메서드 아규먼트를 반환함
- toString() : 어드바이즈 되는 메서드의 설명 출력함.
- getSignature() : 어드바이즈 되는 메서드의 설명 출력함.
- Around 어드바이스는 ProceedingJoinPoint 타입의 파라미터를 필수적으로 선언해야 함.
7. PointCut 표현식
- AspectJ 포인트컷 표현식은 포인트컷 지시자를 이용해 작성함.
- 포인트컷 지시자 중에서 가장 대표적으로 사용되는 것은 execution()임.
1) 문법 구조
[] = 생략가능 (패키지와 클래스 이름에 대한 패턴)
------
execution([접근제한자] 타입패턴 타입패턴 이름패턴(타입패턴) [throws 예외패턴])
------
파라미터의 타입 패턴을 순서대로 넣음
와일드카드를 이용해 파라미터 개수에 상관없는
패턴 작성
ex)
(package) (class)
----------- - -- (any type and number of arguments)
"execution(* kr.co.tiles.*.*(..))"
-- -
(any return type) (method)
- hello라는 이름을 가진 메서드를 선정하는 것
- 파라미터는 모든 종류를 다 허용함.
- 파라미터 패턴이 ()로 되어 있으니 hello 메서드 중 파라미터가 없는 것만 선택함.
"execution(* kr.co.tiles.member.controller.MemberControllerImpl.*(..)"
- kr.co.tiles.member.controller.MemberControllerImpl 클래스를 직접 지정하여
이 클래스가 가진 모든 메서드를 선택함.
"execution(* kr.co.tiles.member.*.*(..))"
- kr.co.tiles.member 패키지의 모든 클래스에 적용됨
- 하지만 서브패키지의 클래스는 포함되지 않음.
"execution(* kr.co.tiles.member..*.*(..))"
- kr.co.tiles.member 패키지의 도든 클래스가 적용됨
- ..를 사용해서 서브패키지의 모든 클래스까지 포함됨.
댓글남기기