AOP란?
=> 여러 오브젝트에 나타나는 공통적인 부가 기능을 모듈화하여 재사용하는 기법
ex) 성능 검사, 트랜잭션 처리, 로깅 등
서비스에서는 비즈니스 로직(핵심 기능)만 수행되는 것이 좋다. 인프라 로직은 따로 빼서 AOP를 적용
AOP를 사용하지 않을 때 문제점
ex) 시간 측정을 하는 기능을 여러 메서드에 적용을 시켜야 할때 그 대상 메서드가 수 억개라면 수작업으로 하기에는 비효율적이다.
=> 해결방안으로 AOP 적용이 존재
Target : 부가 기능이 적용될 대상 ( 어떤 대상에 부가 기능을 적용할 것인가 )
Advice : 어떤 부가 기능을 언제 사용할지에 대한 정의
ex)
@Before : 메서드가 실행되기 전에 실행
@AfterReturning : 메서드가 정상적으로 실행되었을 때 실행
@AfterThrowing : 메서드가 예외를 발생시켰을 때 실행
@After : @AfterReturning + @AfterThrowing
@Around : 비즈니스 로직 전후로 실행
JoinPoint : 어드바이스가 적용될 수 있는 위치 ( 어디에 적용할 것인가)
ex) 메서드, 필드, 객체, 생성자 등
Spring AOP의 경우 메서드 호출 할때만 가능
=> 이유 : 프록시 기반의 AOP 이기 때문에
Point cut : Advice를 적용할 JoinPoint를 선별하는 작업
원하는 메서드를 선택해서 적용할 수 있음
컴파일 => J.java -> J.class
: J.java라는 클래스를 J.class 라는 파일로 컴파일 하는 시점에 AOP 적용
클래스 로드시 => J.class를 컴파일해서 클래스 로더가 메모리 상에 올릴 때 적용
프록시 패턴 => J라는 어떤 타겟 클래스를 프록시로 감싸서 부가 기능을 제공하는 프록시로 감싸서 실행을 하는 방식
(Spring에서 IoC와 DI를 기반으로 하기 때문에 가능함)
우아한Tech의 테코톡(제이,뚱이님의 Spring AOP)을 참조하였습니다.