Spring AOP는 핵심 비즈니스 로직과 여러 기능에서 공통으로 사용되는 부가 기능을 분리하는 기술입니다.
AOP는 관점 지향 프로그래밍을 의미하며, 로깅, 트랜잭션, 권한 검사처럼 여러 메서드에 반복되는 횡단 관심사를 별도의 Aspect로 모듈화합니다. 이후 특정 조건을 만족하는 메서드의 실행 전후나 예외 발생 시점에 해당 기능을 적용합니다.
Spring AOP는 프록시 기반으로 동작합니다. Spring Bean을 대상으로 프록시 객체를 생성하고, 외부에서 메서드를 호출하면 프록시가 요청을 가로채 부가 기능을 수행한 뒤 실제 객체의 메서드를 호출합니다. 대표적인 예가 @Transactional입니다.
주로 다음과 같은 상황에서 사용합니다.
- 여러 서비스에 반복되는 로깅이나 실행 시간 측정
- 트랜잭션 처리
- 권한 검사 및 감사 로그
- 예외 처리나 모니터링과 같은 공통 기능
다만 AOP는 비즈니스 로직 자체를 분리하는 용도보다는, 여러 계층이나 기능에 공통으로 적용되는 부가 기능을 분리할 때 사용하는 것이 적절합니다.
Filter는 서블릿 컨테이너 영역에서 HTTP 요청과 응답을 대상으로 동작
Interceptor는 Spring MVC 영역에서 컨트롤러 호출 전후에 동작
AOP는 Spring Bean의 메서드 실행을 대상으로 동작
프록시 패턴이란 무엇인가요?
프록시 패턴은 실제 객체를 직접 호출하는 대신, 실제 객체를 대신하는 대리 객체를 통해 접근하는 디자인 패턴입니다.
프록시는 실제 객체의 메서드를 호출하기 전후에 권한 검사, 로깅, 트랜잭션 처리와 같은 부가 기능을 수행할 수 있습니다. Spring AOP에서는 프록시가 메서드 호출을 가로채 Advice를 실행한 뒤 실제 객체를 호출합니다.
Spring AOP에서 프록시를 사용하는 이유는 무엇인가요?
기존 비즈니스 로직을 직접 수정하지 않고도 공통 부가 기능을 적용하기 위해 사용합니다.
프록시가 메서드 호출을 가로채기 때문에 다음과 같은 횡단 관심사를 핵심 로직과 분리할 수 있습니다.
프록시가 실제 객체의 메서드를 호출하는 과정
- 클라이언트가 프록시 객체의 메서드를 호출
- 프록시가 호출을 가로챔
- 적용할 Advice와 인터셉터 체인을 확인
- 메서드 실행 전 Advice를 수행
- 실제 대상 객체의 메서드를 호출
- 반환 또는 예외 발생 이후 Advice를 수행
- 결과를 클라이언트에게 반환
JDK Dynamic Proxy와 CGLIB 방식은 무엇이 다른가요?
JDK Dynamic Proxy는 인터페이스를 기반으로 프록시를 생성하고, CGLIB은 클래스를 상속하여 프록시를 생성한다는 차이가 있습니다. JDK Dynamic Proxy는 JDK에서 기본 제공하는
java.lang.reflect.Proxy를 사용하며, 대상 객체가 구현한 인터페이스의 메서드 호출을 가로챕니다. 반면 CGLIB은 런타임에 대상 클래스를 상속한 서브클래스를 만들어 메서드를 오버라이딩하는 방식으로 프록시를 생성합니다. 따라서 CGLIB은 인터페이스가 없어도 사용할 수 있지만, 상속과 오버라이딩이 필요하기 때문에final class,final method,private method에는 제약이 있습니다.
JDK Proxy와 CGLIB 중 어떤 게 성능이 더 좋나요? ⭐
CGIB는 타겟에 대한 정보를 직접적으로 제공 받고, 타겟 클래스에 대한 바이트 코드를 조작하여 프록시를 생성하므로 리플렉션을 사용하는 JDK Dynamic Proxy에 비해 성능이 좋다. 또한 CGLIB는 메소드가 처음 호출되었을 때 동적으로 타겟 클래스의 바이트 코드를 조작하고, 이후 호출 시엔 조작된 바이트 코드를 재사용한다.
https://ree2ta.tistory.com/41 https://steady-coding.tistory.com/608
self-invocation 문제에 대해 설명해주세요