프록시 패턴
- 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴
- 원래 객체에 대한 대리자 역할을 수행하는 프록시 객체를 생성하여 원래 객체에 대한 접근을 제어하거나 추가적인 기능을 제공
- 프록시를 거치게 하여 초기화 지연, 접근 제어, 로깅, 캐싱 등 다양하게 응용해 사용 가능
주요 구성 요소
1. Subject
- 프록시와 실제 객체가 공통으로 구현하는 인터페이스 혹은 추상 클래스
2. Real Subject
- 프록시 객체가 대리하는 실제 작업을 수행하는 객체
3. Proxy
- 프록시와 실제 객체가 공통으로 구현하는 인터페이스 혹은 추상 클래스
프록시 패턴 구현 예시
- 이 예제에서는 가상 프록시를 사용하여 실제 객체의 생성을 지연시킴
1. Image 인터페이스 (Subject)
2.RealImage (Real Subject)
3. ProxyImage (Proxy)
4. 클라이언트 코드
프록시 패턴 장단점
장점
- 기존 코드를 변경하지 않고 새로운 기능 추가 가능
- 기존 코드가 해야 하는 일만 유지할 수 있음 (SOLID의 SPR 원칙)
- 기능 추가 및 초기화 지연 등으로 다양하게 활용 가능
단점
- 프록시 객체를 추가함으로써 코드가 복잡해질 수 있음
- 프록시 객체와 실제 객체를 별도로 관리해야 하기 때문에 관리 비용 증가
실무에서 쓰이는 프록시 패턴
1. 자바의 다이나믹 프록시
- java.lang.reflect 패키지에 있는 Proxy 클래스와 InvocationHandler 인터페이스를 사용하여 구현
- 다이나믹 프록시는 주어진 인터페이스를 구현하는 모든 메서드 호출을 가로채어 InvocationHandler를 통해 처리
2. Spring AOP
- Spring AOP(Aspect-Oriented Programming)는 프록시 패턴을 사용하여 런타임에 객체의 동작을 동적으로 변경할 수 있게 해주는 강력한 기능
- AOP는 핵심 비즈니스 로직과 공통 관심사를 분리하여 코드의 모듈성과 유지보수성을 높임
AOP의 기본 개념
- 어드바이스(Advice): 실제 동작을 구현한 코드로, 특정 시점에 실행
- 조인포인트(Joinpoint): 어드바이스가 적용될 수 있는 위치를 의미
- 포인트컷(Pointcut): 어드바이스가 적용될 실제 조인포인트를 정의하는 표현식
- 애스펙트(Aspect): 어드바이스와 포인트컷의 결합이며 주로 하나의 관심사(로깅, 트랜잭션 등)를 구현.
- 프록시(Proxy): 타겟 객체를 감싸서 어드바이스를 적용하는 데 사용
AOP 작동 원리
- 프록시 생성: Spring AOP는 기본적으로 JDK 동적 프록시 또는 CGLIB 프록시를 사용하여 타겟 객체를 감싸는 프록시 객체를 생성
- JDK 동적 프록시는 인터페이스를 구현한 프록시 객체를 생성
- CGLIB 프록시는 타겟 객체의 서브클래스를 생성하여 프록시 객체를 생성
- 프록시 적용: 프록시 객체는 타겟 객체의 메소드 호출을 가로채어 어드바이스를 적용
- 어드바이스 실행: 프록시 객체는 메소드 호출 전후 또는 예외 발생 시 어드바이스를 실행
* JPA 쿼리 성능 감시 참고: https://jaimemin.tistory.com/2419
비고
1. CGLIB Proxy
- Spring CGLIB Proxy는 Spring AOP에서 사용되는 두 가지 주요 프록시 메커니즘 중 하나이며 다른 하나는 JDK 동적 프록시
- CGLIB (Code Generation Library)는 런타임에 클래스의 서브클래스를 생성하여 프록시 객체를 만드는 라이브러리
- Spring은 인터페이스가 없는 클래스나, 인터페이스가 있지만 CGLIB 프록시가 더 적합한 경우에 CGLIB 프록시를 사용
- CGLIB는 바이트코드 생성 라이브러리로, 런타임에 클래스의 서브클래스를 생성하여 프록시 객체를 생성하며 해당 프록시 객체는 원래 객체의 메소드 호출을 가로채어 부가 기능을 추가하거나 제어
- CGLIB Proxy와 JDK 동적 프록시 관련 게시글은 다음 링크 참고
참고
코딩으로 학습하는 GoF의 디자인 패턴 - 백기선 강사님
반응형
'Design Pattern' 카테고리의 다른 글
[디자인 패턴] 중재자 패턴 (Mediator Pattern) (0) | 2024.06.30 |
---|---|
[디자인 패턴] 책임 연쇄 패턴 (Chain-of-Responsibility Pattern) (0) | 2024.06.29 |
[디자인 패턴] 플라이웨이트 패턴 (Flyweight Pattern) (0) | 2024.06.29 |
[디자인 패턴] 퍼사드 패턴 (Facade Pattern) (0) | 2024.06.29 |
[디자인 패턴] 데코레이터 패턴 (Decorator Pattern) (0) | 2024.06.29 |