예제는 깃허브에 있다.
AOP는 스프링의 핵심 구성요소중 하나이다.
관점지향 프로그래밍은 프로그램 구조에 대한 또 다른 사고방식을 제공하며
객체 지향 프로그래밍을 보완해준다.
AOP는 횡단 관심사의 분리를 허용해주어 모듈성을 높이는 것을 목표로 하는 패러다임이다.
코드 자체를 수정하지 않고 기존 코드에 추가 동작을 추가해서 수행한다.
Aspect
Spring AOP
에서는 @Aspect
를 사용한다.JoinPoint
JoinPoint
는 항상 메소드 실행을 나타냄.Advice
around
, before
, after
등이 있음.PointCut
Advice
가 이 포인트컷 표현식과 연관되고, 일치하는 모든 조인 포인트에서 실행되게 한다.AspectJ
의 pointcut 표현식을 사용한다.Advisor
PointCut
과 Advice
를 하나씩 가지고 있는 오브젝트스프링 AOP의 특징
프록시 패턴 기반의 AOP 구현체, 프록시 객체를 사용하는 이유는 여러개의 부가 기능들을 추가하기 위해서 사용한다.
스프링 빈에만 AOP를 적용할 수 있다.
스프링 IoC와 연동해서 중복 코드, 프록시 패턴 구현의 번거로움, 객체간 복잡도 해결을 진행한다.
결국 프록시 패턴, 데코레이터 패턴에 대한 중복도도 제거하려고 나온것이 스프링 AOP라고 생각한다.
스프링 프록시 방식의 AOP 적용
프록시 방식의 AOP를 적용하려면 최소 아래의 네가지 빈을 등록해야 한다.
일반 스프링 프레임워크에서는 설정을 해주려면 xml에 여러가지 설정들을 해주어야 하지만,
부트에서는 build.gradle
에 의존성 하나만 추가해주면 자동으로 설정이 된다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-aop
}
추가적으로 PointCut을 정의할 때에는 위에서 설명했던 것 처럼
AspectJ 표현식을 통해 정의해준다. 자세한건 여기를 통해서 확인할 수 있다.
모든 어노테이션 뒤에는 AspectJ
표현식을 사용해서 적용할 부분을 정의해준다.
@Pointcut
@Before
@AfterReturning
@Around
ProceedingJoinPoint
로 받아준다.setProxyTargetClass(true);