You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Aspect Oriented Programming의 약자로 관점 지향 프로그래밍의 한 형태
애플리케이션의 핵심 기능과는 별개로 횡단 관심사(부가 기능)을 모듈화하여 코드의 재사용성, 유지보수성, 가독성을 향상시킬 수 있는 프로그래밍의 방법론 중 하나
횡단 관심사의 경우 보안, 로깅, 트랜잭션 관리 등 각각 모듈에서 반복적으로 발생하는 부가 기능을 뜻함
횡단 관심사 : 애플리케이션에서 코드가 중복되고, 강력하게 결합되어 있어 다른 로직과 분리할 수 없는 애플리케이션 로직
프록시를 통해 구현, 스프링에서는 CGLIB, JDK 프록시를 통해 생성된 프록시 객체를 통해 AOP를 구현
현재는 CGLIB를 주로 사용하고 있다.
AOP 동작원리
Spring IOC Container
Spring IOC는 Spring Framework의 핵심 개념 중 하나로 제어의 역전(Inversion of Control)이라고 함
객체의 생성과 생명주기 관리를 개발자가 직접 하는 것이 아닌, 프레임워크가 담당하도록 하여 애플리케이션의 결합도를 낮추고 유연성을 높임
빈 후 처리기란(BeanPostProcessor)
빈 후 처리기는 Spring 컨테이너가 bean을 생성하고 초기화한 후에 추가적인 처리를 할 수 있는 방법을 제공
빈 후 처리기를 사용하면 모든 bean의 초기화 전후에 원하는 로직을 삽입할 수 있음
스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶다면 빈 후처리기를 사용
Spring AOP 동작원리
스프링이 스프링 빈 대상이 되는 객체를 생성한다.
전달된 객체를 빈에 등록하기 전 빈 후 처리기에 전달한다.
AnnotationAwareAspectJAutoProxyCreator 같은 후 처리기가 빈이 AOP 대상 여부인지 확인한다.
프록시 적용 대상이면 프록시를 생성하고 반환해서 프록시를 스프링 빈으로 등록한다.
프록시는 원본 객체에 대한 참조를 유지하며, 메서드 호출을 가로채고 AOP 어드바이스(Advice)를 적용할 수 있도록 한다.
만약 프록 시 적용 대상이 아니라면 원본 객체를 반환해서 원본 객체를 스프링 빈으로 등록한다.
용어 정리
포인트컷(PointCut)
어드바이스가 실행될 지점을 지정하는데 사용
부가기능을 어디에 적용할지 & 적용 안할지를 필터링 하는 로직
어드바이스(Advice)
결합 지점(Join Point)에 적용되는 코드의 일부분
코드의 일부분이란 관심사를 구현하며 주로 부가 기능을 처리하기 위한 로직이 포함됨
프록시가 호출하는 부가 기능을 의미
어드바이저(Advisor)
어떤 결합 지점(Join Point)에 어떤 어드바이스(Advice)를 적용할지 결정하는 역할
하나의 포인트 컷과 하나의 어드바이스를 가지고 있는 것
이 둘을 결합하여 결합 지점에서 어드바이스가 실행될 조건을 정의
조인 포인트(Join point)
조인 포인트는 추상적인 개념으로, AOP를 적용할 수 있는 모든 지점을 의미한다.
스프링 AOP의 경우 프록시 방식으로 동작하기 때문에 조인 포인트는 항상 메소드 실행 지점으로 제한된다.
AssertJ의 경우 메소드 실행, 생성자 호출, 필드값 접근, static 메서드 접근 등과 같은 포인트에서도 사용 가능하다.
타겟(Target)
어드바이스를 받는 객체를 의미하며, 포인트 컷으로 결정된다.
부가 기능을 적용받는 객체, 애플리케이션에서 정의된 일반적인 객체
애스팩트(Aspect)
어드바이스 + 포인트컷을 모듈화한 것
@Aspect
여러 어드바이스와 포인트컷이 함께 존재할 수 있다.
- 스프링 AOP의 경우 스프링 빈에 등록해야 AOP가 적용된다.
- 애스펙트를 사용한 프로그래밍 방식을 관점 지향 프로그래밍 AOP(Aspect-Oriented Programming)이다.
- AOP를 통해 횡단 관심사를 깔끔하게 처리하여 실제 코드에서는 비즈니스 로직을 더 집중할 수 있게 만들어주었다.
빈 후처리기(BeanPostProcessor)
생성된 빈 객체를 스프링 컨테이너에 등록하기 전에 조작하는 객체
빈을 생성한 후에 추가적인 작업을 처리하는 용도로 사용
AOP를 구현하는데 빈 후처리기를 사용하여 해당 빈이 생성될 때 AOP를 적용시켜 횐단 관심사를 처리하는 용도로 사용 가능
AOP 적용 방식
컴파일 시점
클래스 로딩 시점
런타임 시점
런타임 시점
컴파일 후 자바가 실행되고 난 다음 시점을 말한다.
프록시를 통해 스프링 빈에 부가 기능을 적용하는 작업을 말한다. (프록시 방식의 AOP)
환경 설정을 위한 부가 작업 없이, 스프링만 있다면 AOP 사용이 가능하다.
주로 사용하는 방식이 런타임 시점에서의 프록시 방식의 AOP이다.
스프링은 AspectJ의 문법 기반의 프록시 방식의 AOP를 적용한다. (AspectJ를 직접 사용 X)