프로그래밍/Spring & Spring boot

13 Spring : AOP 개념 정리

pupu91 2022. 9. 2. 17:47
반응형

 

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을 합친 개념

반응형