GrowMe

[Spring]AOP를 코드 + a 로 쉽게 이해해보자 본문

About Spring

[Spring]AOP를 코드 + a 로 쉽게 이해해보자

오늘도 타는중 2022. 6. 21. 19:32
AOP(Aspect-Oriented Programming)
# AOP
# 부가기능
# AOP 사용법
# Advice
# PointCut

*AOP란?

  • 부가 기능(advice)을 동적(실행 중에)으로 추가해주는 기술
  • Spring의 경우 메서드의 시작 또는 끝에 자동으로 코드(advice)를 추가해주는 것!

*AOP의 사용법

1. 부가기능 Aspect1 클래스를 불러와서, 호출하는 original 메서드의 앞 or 뒤 or 앞뒤에

  • original 메서드 : orderService.orderItem()
  • @Import : 부가기능 Aspect1 모듈을 불러와 적용시킨다.
  • @Autowired : 빈에 등록되있는 객체를 주입한다.

  • 맨 위 AopTest 클래스에서 주입받은 OrderService

  • 맨 위 AopTest 클래스에서 주입받은 OrderRepository

2. @Aspect 어노테이션이 붙어 있는 모듈(Aspect1)의 메서드 logging()을 붙여서

  • Aspect1 : 부가기능을 모아놓은 모듈
  • @Aspect : Aspect임을 명시
  • original 메서드 실행 : joinPoint.proceed()
  • @Around : original 메서드의 앞뒤를 부가기능으로 감싼다. (해당 예제는 original 위에만 존재 -> 호출도 위에만 됨)
  • @execution : 해당 모듈이 적용될 경로를 지정한다. (이를 포인트컷 개념이라 함)
  • logging : Aspect1 클래스의 메서드로서, Aspect1 어스펙트의 어드바이스(Advice) == 부가기능

3. 최종 호출한다.


*메소드의 앞뒤 위치 지정 방법은?  : Advice의 종류 

종 류 애너테이션 설 명
around advice @Around 메서드 시작과 끝 부분에 추가되는 부가 기능
before advice @Before 메서드의 시작 부분에 추가되는 부가 기능
after advice @After 메서드의 끝 부분에 추가되는 부가 기능
after returning @AfterReturning 예외 발생 안했을 시, 실행되는 부가 기능
after throwing @AfterThrowing 예외가 발생했을 때, 실행되는 부가 기능

*어떤 메소드에 적용할지 정하는 법은?  : Pointcut 표현식

  • 경로를 지정하여 정한다.
  • 문법 : execution(반환타입  패키지명.클래스명.메서드명(매개변수 목록))
  • * :모든 ~ ~   (ex : execution(* com.xyz.service.*.*(..))
    -> com.xyz.service 패키지 내 모든 클래스들의 모든 메서드에 적용
종 류 설 명
execution 메서드 실행 조인트 포인트를 매칭한다.
스프링 AOP에서 가장 많이 사용하며, 기능도 복잡하다.
within 특정 타입 내의 조인 포인트를 매칭한다.
args 인자가 주어진 타입의 인스턴스인 조인 포인트
this 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트
target Target 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트
@target 실행 객체의 클래스에 주어진 타입의 애너테이션이 있는 조인 포인트
@within 주어진 애너테이션이 있는 타입 내 조인 포인트
@annotation 메서드가 주어니 애너테이션을 가지고 있는 조인 포인트를 매칭
@args 전달된 실제 인수의 런타임 타입이 주어진 타입의 애너테이션을 갖는 조인 포인트
bean 스프링 전용 포인트컷 지시자이고 빈의 이름으로 포인트컷을 지정한다.

 

Comments