Aspect Oriented Programming
의 약자로 관점 지향 프로그래밍이라고 불린다.Aspect
를 이용해서 해결한다.💡 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지다!
관점(Aspect)
어드바이스(Advice)
조인 포인트(Join point)
Advice
가 적용될 위치, 끼어들 수 있는 지점.포인트컷(Pointcut)
Advice
가 실행될 지점을 정할 수 있음타겟(Target)
Aspect
를 적용하는 곳 (클래스, 메서드 .. )프록시(Proxy)
Advice
가 적용되었을 때 생성되는 객체 proxy object
)를 사용해 로직의 흐름을 제어하는 디자인 패턴.
// 출처:
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.thymeleaf.util.StringUtils;
@Slf4j
@Aspect
@Component
public class LoggerAspect {
@Around("execution(* com.study.domain..*Controller.*(..)) || execution(* com.study.domain..*Service.*(..)) || execution(* com.study.domain..*Mapper.*(..))")
public Object printLog(ProceedingJoinPoint joinPoint) throws Throwable {
String name = joinPoint.getSignature().getDeclaringTypeName();
String type =
StringUtils.contains(name, "Controller") ? "Controller ===> " :
StringUtils.contains(name, "Service") ? "Service ===> " :
StringUtils.contains(name, "Mapper") ? "Mapper ===> " :
"";
log.debug(type + name + "." + joinPoint.getSignature().getName() + "()");
return joinPoint.proceed();
}
}
출처:: https://congsong.tistory.com/25 [Let's develop:티스토리]
@Component
: 개발자가 직접 정의한 클래스를 빈(Bean)으로 등록할 때 사용
@Aspect
: AOP 기능을 하는 클래스의 클래스 레벨에 선언하는 어노테이션
어드바이스(Advice)
@Before
: Target 메서드 호출 이전에 적용할 어드바이스 정의
@AfterReturning
: Target 메서드가 성공적으로 실행되고, 결괏값을 반환한 뒤에 적용
@AfterThrowing
: Target 메서드에서 예외 발생 이후에 적용 (try/catch의 catch와 유사)
@After
: Target 메서드에서 예외 발생에 관계없이 적용 (try/catch의 finally와 유사)
@Around
: Target 메서드 호출 이전과 이후 모두 적용 (가장 광범위
하게 사용됨)
execution 포인트컷
* com.study.domain..*Controller.*(..)
* com.study.domain..*Service.*(..)
* com.study.domain..*Mapper.*(..)
출처
[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP
Spring - AOP 기본개념 및 주요 기능, 예제와 함께 이해하기
스프링 부트(Spring Boot) - AOP와 트랜잭션(Transaction)
스프링 - AOP
[스프링] AOP 와 프록시 패턴
[Spring] 프록시 패턴 & 스프링 AOP