Aspect Oriented Programming (관점 지향 프로그래밍)
: 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 그 관점을 각각 모듈화
코드 속 다른 부분에 반복적으로 사용되는 코드 존재 : Crosscutting Concerns
-> 그 부분을 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리해 재사용하기 위해 AOP 사용
@Around : 핵심기능 수행 전과 후(@Before + @After)
@Before : 핵심기능 호출 전(@Validation 처럼)
@After : 핵심기능 수행 성공/실패 여부와 상관없이 항상 동작(try,catch,finally의 finally처럼)
@AfterReturning : 핵심기능 호출 성공 시 함수의 return값 사용 가능
@AfterThrowing : 핵심기능 호출 실패 시(=예외 발생) 동작
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {}
@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() {}
@Around("@annotation(어노테이션 이름)")
@Around 가 아니라 @Before, @After를 사용할 경우 joinPoint.proceed() 할 필요 x
(jointPoint.proceed() 는 aop의 목적 메서드(=핵심 기능) 수행)
@Transactional 도 아래와 비슷하게 가짜(proxy) 객체가 중간에 생기며 작업해줌