Spring AOP
: 관점 지향 프로그래밍의 약자
중복되는 공통 코드를 별도의 영역으로 분리해내고 필요한 시점에 해당 코드를 가져다 쓸 수 있게 객체화하는 기술
Spring AOP의 구조
공통되는 코드를 따로 빼내어 작성하는 class를 Advice라고 하고, 해당 시점을 Joinpoint, 그 시점에 공통 코드를 끼워 넣는 작업을 Weaving이라고 함.
Spring AOP의 용어
Introduction
: 정적인 방식의 AOP 기술
Weaving
: 작성한 Advice를 핵심 로직 코트에 삽입
1) 컴파일 시 위빙 : 컴파일 시 AOP가 적용된 클래스 파일이 새로 생성(AspectJ)
2) 클래스 로딩시 위빙 : JVM에서 로딩한 클래스의 바이트 코드를 AOP가 변경하여 사용
3) 런타임 시 위빙 : 클래스 정보 자체를 변경하지 않고, 중간에 프록시를 생성하여 경유(스프링)
Proxy
: 대상 객체를 직접 접근하지 못하게 '대리인'으로써 요청을 대신 받는 기술 (서버 Runtime 시 생성)
대상 객체에 대한 호출을 가로 챈 다음 Advice을 수행하고 난 후에 타켓의 메소드를 호출하거나(BeforeAdvice)
타겟의 메소드가 실행된 후에 Advice을 수행(AfterAdvice)
Target Object
: Advice를 삽입할 대상 객체
JoinPoint
: 포인트 컷으로 패치한 실행 지점을 조인 포인트라 함.
모든 Advice는 org.aspectj.lang.JoinPoint 타입으로 파라미터를 AdviceMethod에 첫 번째 매개변수로 선언해야 함.
단, Around 어드바이스는 JoinPoint의 하위 클래스인 ProceedingJoinPoint 타입의 파라미터로 선언해야 함.
- JoinPoint - Pointcut
: 여러 조인 포인트를 매치하기 위해 지정한 표현식
포인트 컷으로 매치 된 조인 포인트에서 해야 할 일이 어드바이스
ex) 포인트 컷의 가장 일반적인 모습은 시그니처를 기준으로 여러 메서드를 매치하는 것으로
맨 앞의 와일드 카드는 접근제한자와 반환형이 상관 없다는 의미이고 *은 모든 것을 뜻 함.
(..)은 매개변수의 타입과 갯수에 상관없이 매치하겠다는 뜻
@After또는Before("execution(* com.greedy.section01.advice.annotation..*(..))")
public void afterAttending(JoinPoint joinPoint) {}
@Around("execution(* com.greedy.section01.advice.annotation..*(..))")
public Object aroundAttending(ProceedingJoinPoint joinPoint) {}
- JoinPoint - @Pointcut
: @Pointcut 어노테이션을 사용하면 포인트 컷만 따로 정의하여 여러 어드바이스에서 재사용할 수 있음
ex)
(1) 같은 클래스에서 사용
void 형 메소드로 작성
@Pointcut("execution(* com.greedy.section01.advice.annotation..*(..))")
private void studentAroundPointcut() {}
메소드 이름으로 포인트 컷 사용
@Around("studentAroundPointcut()")
(2) 다른 클래스에서 가져올 경우
포인트 컷이 정의 된 클래스 이름을 기재해야 함.
다른 패기지라면 패키지를 포함한 클래스명 작성
@Before("StudentPointcut.studyPointcut()")
- JoinPoint Interface 메소드
메소드 | 기능 |
getArhs() | 메소드의 매개 변수를 반환 |
getThis() | 현재 사용 중인 프록시 객체를 반환 |
getTarget() | 대상 객체를 반환 |
getSignature() | 대상 객체 메소드의 설명(메소드 명, 리턴 타입 등)을 반환 |
toString() | 대상 객체 메소드의 정보를 출력 |
Advice
: JoinPoint에 사입되어 동작 될 코드, 메소드
1) Before Advice
: Joinpoint 앞에서 실행
2) After Advice
: Joinpoint 호출이 리턴되기 직전에 실행(오류무시)
3) After Returning Advice
: Joinpoint 메소드 호출이 정상적으로 종료된 후에 실행
리턴값을 참조할 때는 returning 속성에 리턴값을 저장할 변수 이름을 지정
4) After Throwing Advice
: 예외가 발생했을 때 실행
발생된 예외를 참조할 때는 throwing 속성에 발생한 예외를 저장할 변수 이름을 지정
5) Around Advice
: Joinpoint 앞과 뒤에서 실행
Aspect
: 부가기능을 정의한 코드인 Advice와 어드바이스를 어디에 적용할지를 결정하는 PointCut을 합친 개념
'프로그래밍 > Spring & Spring boot' 카테고리의 다른 글
15 Spring : @Aspect , @Before , @AfterAdvice, @AfterReturning, @AfterThrowing, @Around 사용하기 (0) | 2022.09.02 |
---|---|
14 Spring : @Pointcut 어노테이션 표현식 (0) | 2022.09.02 |
12 Spring : bean 초기화, 소멸 설정하기(init-method , ditory-method) (0) | 2022.09.02 |
11 Spring : MessageSource를 통한 다국어 처리하는 방법 (1) | 2022.09.02 |
10 Spring : properties 사용 (1) | 2022.09.02 |