관리 메뉴

ballqs 님의 블로그

[Java] Proxy 패턴이란? 본문

코딩 공부/Java

[Java] Proxy 패턴이란?

ballqs 2024. 9. 24. 10:29

Proxy 패턴이란?

프록시 패턴은 실제 객체에 대한 접근을 제어하고, 추가적인 기능을 제공하기 위해 사용되는 디자인 패턴이다.

마치 대리인처럼 실제 객체를 대신하여 동작하며, 다양한 상황에서 유용하게 활용될 수 있다.


Proxy 패턴 장점

접근 제어

  • 실제 객체에 대한 직접적인 접근을 제한하고, 프록시를 통해서만 접근하도록 함으로써 보안을 강화할 수 있다.
  • 특정 조건에 따라 접근을 허용하거나 거부할 수 있다.

 

추가 기능 제공

  • 실제 객체의 기능을 확장하여 새로운 기능을 추가할 수 있다.
  • 예를 들어, 캐싱, 로그 기록, 권한 검사 등을 프록시에서 처리할 수 있다.

 

지연 로딩

  • 실제 객체를 필요한 시점까지 생성하지 않고, 프록시 객체를 통해 미리 참조할 수 있다.
  • 이는 큰 객체를 로딩하는 데 드는 시간을 절약하고 시스템 성능을 향상시킬 수 있다.

 

원격 프록시

  • 네트워크를 통해 다른 시스템에 있는 객체에 접근할 때, 프록시를 사용하여 네트워크 통신을 처리하고 데이터를 변환할 수 있다.

 

가상 프록시

  • 아직 구현되지 않은 기능을 미리 정의하고, 프록시를 통해 가상 객체처럼 사용할 수 있다.

Proxy 패턴 단점

복잡성 증가

 

  • 프록시 객체를 추가하면 시스템의 복잡성이 증가할 수 있다.
  • 프록시와 실제 객체 간의 관계를 관리해야 하는 부담이 생긴다.

 

 

성능 저하

 

  • 프록시를 거쳐 객체에 접근하기 때문에, 실제 객체에 직접 접근하는 것보다 성능이 저하될 수 있다.
  • 특히, 빈번한 메서드 호출이 발생하는 경우 성능 저하가 더욱 두드러질 수 있다.

 

 

코드량 증가

  • 프록시 클래스를 별도로 구현해야 하므로 코드량이 증가한다.

코드 예시

Subject.java 작성

public interface Subject {
    void request();
}

 

RealSubject.java 작성

public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("Proxy request");
    }
}

 

Proxy.java 작성

public class Proxy implements Subject {
    private Subject subject;

    @Override
    public void request() {
        if (this.subject == null) {
            this.subject = new RealSubject();
        }
        subject.request();
    }
}

 

Main.java

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
        Subject subject = new Proxy();
        subject.request();
    }
}

 

 


프록시 패턴의 적용 사례

  • 파일 시스템: 파일 시스템에서 파일을 열기 전에 파일의 존재 유무를 확인하고, 필요한 권한이 있는지 검사하는 프록시를 사용할 수 있습니다.
  • 데이터베이스: 데이터베이스에 접근하기 전에 연결을 확인하고, 쿼리 결과를 캐싱하는 프록시를 사용할 수 있습니다.
  • 네트워크: 원격 서버에 있는 객체에 접근할 때, 네트워크 통신을 처리하고 데이터를 변환하는 프록시를 사용할 수 있습니다.