AOP란 Aspect-Oriented Programming 으로 "관점 지향 프로그래밍"으로 번역된다.
핵심 로직과 부가기능을 분리하고, 부가기능을 모듈화 하여 재사용할 수 있도록 하는 프로그래밍 패러다임.
핵심은 Cross-Cutting 으로, 객체지향 관점에선 하나의 객체가 각자 할 일을 하도록 역할을 정의하는 것이라면, AOP는 공통적으로 사용될 만한 부가기능들을 파악하여 모듈화 하는 것이 핵심이다. - 횡단 관심사 라고도 함!
@Transactional 어노테이션에서 이미 사용되고 있었던 것으로, Entity manager에서 Transaction을 가져와 begin() 과 commit() 을 메서드 전후에 실행해주고 있었다.
AOP 의 주요 개념
Spring APO 와 AspectJ Weaving 방법이 다른 두 프레임 워크
AspectJ : Compile-time Weaving or Load-time Weaving
-> 속도는 빠르지만 별도의 컴파일러나 weaver 가 필요하기 때문에 복잡함.
Spring AOP : Run-time Weaving( 객체에 직접 접근하지 않고 중간 프록시를 통해 접근 )
-> 프록시 패턴을 사용하기 때문에 항상 프록시 sub class 를 만들어야 함.
-> final class 에는 적용되지 않음. ( open class 에만 )
AOP 적용 방법
1. build.gradle.kts 에 aop 패키지 설정
implementation("org.springframework.boot:spring-boot-starter-aop")
main Application 상단에 어노테이션 추가
@EnableAspectJAutoProxy // AspectJ 기반이라 어노테이션 같이 사용
infra 하위에 aop 패키지를 생성한 후 어노테이션 정의
aop 구현. ( 프록시 역할 클래스 )
메서드에 어노테이션 설정
위와 같이 설정을 해두면 로그를 확인할 수 있다!