Design Pattern

[디자인 패턴] 프록시 패턴 (Proxy Pattern)

꾸준함. 2024. 6. 29. 17:53

프록시 패턴

  • 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴
    • 원래 객체에 대한 대리자 역할을 수행하는 프록시 객체를 생성하여 원래 객체에 대한 접근을 제어하거나 추가적인 기능을 제공
    • 프록시를 거치게 하여 초기화 지연, 접근 제어, 로깅, 캐싱 등 다양하게 응용해 사용 가능

 

https://www.geeksforgeeks.org/proxy-design-pattern/

 

주요 구성 요소

 

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

 

[SpringBoot] JPA 쿼리 성능 감시 가이드

개요팀 내 JPA 쿼리 성능 감시 가이드를 작성하는 업무를 맡은 김에 간단하게 다음 항목을 정리해 보겠습니다.JPA slow 쿼리 검출JPA N + 1 문제가 의심되는 api 검출 JPA N + 1 문제가 의심되는 api의 경

jaimemin.tistory.com

 

비고

 

1. CGLIB Proxy

  • Spring CGLIB Proxy는 Spring AOP에서 사용되는 두 가지 주요 프록시 메커니즘 중 하나이며 다른 하나는 JDK 동적 프록시
  • CGLIB (Code Generation Library)는 런타임에 클래스의 서브클래스를 생성하여 프록시 객체를 만드는 라이브러리
  • Spring은 인터페이스가 없는 클래스나, 인터페이스가 있지만 CGLIB 프록시가 더 적합한 경우에 CGLIB 프록시를 사용
  • CGLIB는 바이트코드 생성 라이브러리로, 런타임에 클래스의 서브클래스를 생성하여 프록시 객체를 생성하며 해당 프록시 객체는 원래 객체의 메소드 호출을 가로채어 부가 기능을 추가하거나 제어
  • CGLIB Proxy와 JDK 동적 프록시 관련 게시글은 다음 링크 참고

 

참고

코딩으로 학습하는 GoF의 디자인 패턴 - 백기선 강사님

반응형