2. 프록시 패턴(Proxy Pattern)

서주홍's avatar
Aug 14, 2024
2. 프록시 패턴(Proxy Pattern)
💡
프록시 패턴(Proxy Pattern)은 "대리인"이라는 의미에서, 특정 객체에 접근하는 방식을 제어하기 위해 사용되는 디자인 패턴입니다. 주로 실제 객체의 기능을 추가하거나, 접근을 제어하는 목적으로 사용됩니다.
 

■ 1. 프록시 패턴

  • 포워드 프록시(Forward Proxy): 클라이언트가 프록시 서버를 통해 다른 서버에 요청을 보내도록 하는 프록시. 클라이언트의 IP 주소를 숨기고, 요청을 대리하는 역할을 합니다.
  • 리버스 프록시(Reverse Proxy): 서버 앞단에 위치하여 클라이언트의 요청을 받아 다른 서버에 전달합니다. 주로 로드 밸런싱, 보안 등의 목적으로 사용됩니다.
 
 

■ 2. 예제 코드

package ex02; public class DoormanProxy { private Doorman doorman; // 기존 Doorman 클래스를 컴퍼지션으로 포함 public DoormanProxy(Doorman doorman) { this.doorman = doorman; } public void 쫓아내(Animal a) { System.out.println("안녕~~~"); // 새로운 기능 추가 doorman.쫒아내(a); // 기존 Doorman 클래스의 기능 호출 } }
  • 위 코드에서 DoormanProxyDoorman의 기능을 확장하면서도, 기존 코드에 직접적인 수정을 가하지 않았습니다. 이는 OCP(개방-폐쇄 원칙), 즉 "코드는 확장에는 열려 있고, 수정에는 닫혀 있어야 한다"는 객체 지향 설계 원칙을 잘 따르고 있습니다.
 
 
 

■ 3. 프록시 패턴을 사용하는 이유

  • 기존 코드 수정 최소화: 기존 클래스에 대한 변경 없이 기능을 추가하거나 접근을 제어할 수 있다
  • 확장성: 새로운 기능을 추가할 때, 기존 코드를 수정하지 않고 확장할 수 있습니다.
  • 캡슐화: 객체의 내부 구현을 감추고, 접근 제어를 가능하게 합니다.
 
 

■ 4. 스프링 AOP와 프록시 패턴

💡
스프링 프레임워크에서는 AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)를 통해, 핵심 로직 이외의 횡단 관심사(로깅, 보안, 트랜잭션 관리 등)를 프록시 패턴을 사용하여 구현합니다.
  • 프록시 객체 생성: 실제 객체를 프록시 객체로 감싸서, 실제 객체에 접근하기 전에 필요한 부가 기능(예: 로깅, 트랜잭션 관리)을 처리합니다.
  • 핵심 로직과 부가 기능의 분리: 개발자는 핵심 로직에만 집중할 수 있고, 부가적인 기능은 AOP 프레임워크가 자동으로 처리합니다.
  • 예시
    • 메서드 호출 전에 특정 조건을 체크합니다.
    • 메서드 호출 후 결과를 로깅하는 기능을 추가할 수 있습니다.
    • 이는 코드의 유지보수성을 높이고, 중복 코드를 줄여줍니다.
 
 

■ 5. 내용 정리

  • 프록시 패턴은 기존 코드를 변경하지 않고 기능을 확장할 수 있는 강력한 도구입니다.
  • 특히 스프링의 AOP(Aspect-Oriented Programming)에서 이 패턴을 활용하여,
  • 코드의 유지보수성을 높이고, 핵심 로직에 집중할 수 있는 환경을 제공합니다.
  • 프록시 패턴을 이해하고 활용하는 것은 객체 지향 설계 원칙을 따르는 코드 작성에 매우 유용합니다.
  • 만들어져 있는 프록시 패턴을 보면, 기존에 있는 클래스에 부가 기능이 추가될 수 있음을 쉽게 예측할 수 있습니다.
 
 
💡
정리 사이트 참고
 
Share article

maestrojava