1. AOP란?
- Aspect-Oriented Programming의 약자
- 스프링 프레임워크에서 제공하는 모듈 중 하나
- 관점 지향 프로그래밍의 구현을 지원하는 기술
- 애플리케이션의 여러 모듈에서 공통적으로 발생하는 관심사를 분리하여 관리한다.
- 코드의 재사용성과 유지보수성을 향상시키기 위해 사용된다.
2. AOP의 주요 개념
- Aspect(관점) : AOP에서 관점은 애플리케이션의 특정관심사를 나타낸다.
- 예를들어 로깅, 트랜잭션 관리, 보안 등이 관점의 예시이다.
- Advice(조언) : 관점에서 수행할 행동을 나타낸다.
- 예를들어, 메소드 실행 전에 어떤 작업을 수행하는 advice가 있을 수 있다.
- Join Point(결합 지점) : 어드바이스가 실행되는 시점을 나타낸다.
- 예를 들어, 메소드 호출이나 필드 접근이 결합지점이 될 수 있다.
- PointCut(지점) : 어드바이스를 적용할 결합지점의 집합을 나타낸다. 정규 표현식이나 패턴을 사용하여 결합지점을 지정할 수 있다.
- Weaving(위빙) : Aspect를 적용하여 애플리케이션 코드에 Aspect의 행위를 삽입하는 과정
- Around : Advice의 유형 중 하나로, 타겟 메소드를 감싸서 호출 전후에 코드를 실행할 수 있게 해주는 어노테이션
3. AOP와 DynamicProxy
- Spring AOP에서 DynamicProxy란 AOP 구현 방식 중 하나로, 프록시 객체를 동적으로 생성하여 타겟 객체를 감싸는 방식을 의미한다.
- Spring AOP에서 DynamicProxy를 사용하는 방법은 주로 두 가지 이다.
- JDK DynamicProxy : JDK의 java.lang.reflect.Proxy 클래스를 이용하여 인터페이스 기반의 프록시를 생성한다. 이 방식은 인터페이스를 구현한 타겟 객체에 대한 프록시이다.
- CGLIB Proxy : CGLIB(Class Generation Library)을 사용하여 클래스 기반의 프록시를 생성한다. 이 방식은 인터페이스를 구현하지 않은 클래스에 대한 프록시를 생성할 수 있다.
4. AspectJ란
- Spring AOP보다 더 강력한 기능을 제공하는 관점 지향 프로그래밍 프레임워크
- 보다 복잡하고 정교한 관점 지향 프로그래밍을 가능하게 한다.
- 어노테이션, 포인트컷 표현식, 어드바이스 등을 사용하여 관점 지향 기능을 정의하고 적용 할 수 있다.
- Join Point 정보를 얻어와서 Advice에서 활용할 수 있다.
5. JPA에서의 프록시란
- JPA의 실제 엔티티를 필요할 때만 꺼내쓸 수 있도록 하는 가짜 객체
- 실제 클래스를 상속받아서 만들어지며 겉모양이 같아서 이론적으로는 사용자가 Proxy객체를 그대로 써도 문제가 없다.
- 예시사항
- Team 1 : Member N 관계의 엔티티가 있다고 가정했을 때 어떤 member 객체를 불러오면 JPA는 기본적으로 연관관계를 갖는 모든 엔티티를 조인해온다. 즉 member를 불렀을 때 team 엔티티까지 불러오게 된다.
- 그래서 find() 대신 getReference() 메서드를 사용하면 실제 필요한 순간 까지 관계를 갖는 엔티티를 Proxy 형태로만 불러온다. 다시 말해 특정 값을 요청하면 그제서야 쿼리문을 실행하게 되는 것이다.
- 따라서 과도하게 불러오는 효율적이지 못한 상황을 방지할 수 있다.
6. 참조
1) JPA에서의 프록시 : https://whitepro.tistory.com/414