AOP - Aspect 작성과 동작

박준서·2024년 10월 17일
4

Web

목록 보기
10/16
post-thumbnail

@Aspect를 이용한 aspect 작성

@Component // 하나의 빈으로 관리 됨
@Aspect // aspect 선언 : 하나 이상의 advice + pointcut으로 구성
@Slf4j
public class TestAspect {
	
	@Before("execution(* com.pratice.aop.beans.*.*(..))")
	public void argumentLogging(JoinPoint jp) {
		log.trace("text");
	}
}
  • TestAspect는 aspect를 담고 있는 Bean으로 구성하기 위해 @Component 와 @Aspect를 선언
  • 일반적으로 Aspect 안에 있는 메서드 하나가 advice를 의미한다.
  • advice는 advice 타입advice 코드로 구성된다.
    • @Before은 advice의 타입으로 advice의 실행 시점을 의미한다. 여기선 타겟의 메서드가 실행되기 전을 의미한다
    • 메서드 바디에는 실행할 advice 코드를 작성한다. 즉 횡단 관심사를 작성하는 것이다. 위 코드에서는 JoinPoint를 이용해서 AOP가 적용되는 메서드가 호출 될 때 메세지를 출력할 것이다
    • advice 타입을 나타내는 @Before의 value 속성으로는 pointcut을 설정한다.
      • pointcut은 대상 메서드를 필터링

AOP : Proxy

proxy

  • 대리 / 대신 이라는 뜻을 가지고 있다.
  • 겉에서 봤을 때는 원본과 똑같이 생겨서 구분할 수 없고, run time에 target 메서드 호출 전/후 등에 끼어들어서 무언가 부가적인 작업을 하는 객체를 의미한다.
  • 이 proxy는 Bean이 interface 기반인지 또는 class 기반인지에 따라서 생성 방식이 다르다.

인터페이스 기반 Bean에 대한 Proxy

  • Interface 기반 Bean에 대한 Proxy
    • 종류 : JDK의 동적 프록시
    • 장/ 단점 : 생성시간이 빠르지만 인터페이스가 반드시 필요하다.

Class 기반 Bean에 대한 Proxy

  • CGLIB (Code Generator Library)의 프록시
  • 장/단점 : 클래스 바이트 코드를 조작하므로 생성 시간이 길지만 언제나 적용 가능

결과적으로 어떤 방식으로 Proxy를 만들던지 동작은 동일하다.

Proxy 클래스는 target Bean의 메서드를 재정의 하기 때문에, 외부에서는 proxy의 메서드를 부르는지 target bean의 메서드를 부르는지 알지 못한다.

Proxy의 동작 방식

  • 스프링은 Bean 생성 후 pointcut에 기반해서 AOP 적용 대상인지 검토하고, 대상이라면 proxy 클래스를 생성한 후 기존의 Bean (타겟) 대신에 proxy를 노출한다.
  • 따라서 ApplicationContext에 Bean을 요청하면 proxy가 반환된다. 이제 Bean의 메서드를 호출하면 proxy가 target으로 가는 요청을 가로챈 후 @Before @After 등 호출 시점에 맞춰 target의 메서드 호출 전/후에 advice 코드를 실행한다.
profile
Back-End Developer

0개의 댓글

관련 채용 정보