230713 Spring AOP

보트·2023년 7월 13일
0

Spring

목록 보기
17/27

Spring AOP

AOP

  • Aspect Oriented Programming (관점 지향 프로그래밍)
    : 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 그 관점을 각각 모듈화

  • 코드 속 다른 부분에 반복적으로 사용되는 코드 존재 : Crosscutting Concerns
    -> 그 부분을 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리해 재사용하기 위해 AOP 사용

AOP 주요 개념

  • Aspect : Spring Bean 클래스에만 적용 가능 (@Component 등의 어노테이션 사용)
  • Target : Aspect를 적용하는 곳 (클래스, 메서드,,)
  • Advice : 실질적인 부가기능을 담은 구현체
@Around : 핵심기능 수행 전과 후(@Before + @After)
@Before : 핵심기능 호출 전(@Validation 처럼)
@After : 핵심기능 수행 성공/실패 여부와 상관없이 항상 동작(try,catch,finally의 finally처럼)
@AfterReturning : 핵심기능 호출 성공 시 함수의 return값 사용 가능
@AfterThrowing : 핵심기능 호출 실패 시(=예외 발생) 동작
  • JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {}
  • PointCut : JointPoint의 상세한 스펙 정의
@Pointcut("execution(* com.sparta.myselectshop.controller.ProductController.*(..))")
private void product() {}
@Pointcut("execution(* com.sparta.myselectshop.controller.FolderController.*(..))")
private void folder() {}
@Pointcut("execution(* com.sparta.myselectshop.naver.controller.NaverApiController.*(..))")
private void naver() {}

특징

  • 경로 지정방식 말고 특정 어노테이션이 붙은 포인트에 해당 Aspect를 실행할 수도 있음
@Around("@annotation(어노테이션 이름)")
  • @Around 가 아니라 @Before, @After를 사용할 경우 joinPoint.proceed() 할 필요 x
    (jointPoint.proceed() 는 aop의 목적 메서드(=핵심 기능) 수행)

  • @Transactional 도 아래와 비슷하게 가짜(proxy) 객체가 중간에 생기며 작업해줌
    업로드중..

(참고 : https://engkimbs.tistory.com/746)

profile
일주일에 한 번

0개의 댓글