[과제] 프록시 패턴

yumyeonghan·2023년 6월 14일
0

프록시 패턴

프록시 패턴은 디자인 패턴 중 하나로, 다른 객체에 대한 대리자 역할을 수행하는 객체를 사용하여 간접적으로 접근하는 방식을 제공합니다.

특징

대리자 역할

  • 프록시 객체는 클라이언트와 원본 객체 사이에서 인터페이스를 제공하여 클라이언트가 원본 객체에 직접 접근하는 것을 방지합니다.

보안 및 접근 제어

  • 클라이언트는 프록시를 통해 원본 객체에 접근하게 되므로 접근 권한 검사 또는 인증 같은 보안 기능을 제공할 수 있습니다.

성능 향상

  • 프록시는 원본 객체에 대한 결과를 캐싱하여 반복적인 요청에 대한 성능을 향상시킬 수 있습니다.

장점

  • 보안과 접근 제어를 제공하여 시스템의 안정성을 향상시킵니다.
  • 클라이언트와 원본 객체 사이에 중간 계층을 두어 유연성과 확장성을 제공합니다.
  • 성능 향상을 위해 캐싱, 지연 로딩(실제 기능을 사용할 때 객체를 생성)등의 기능을 추가할 수 있습니다.

단점

  • 추가적인 코드 복잡성이 생길 수 있습니다.
  • 클라이언트와 원본 객체 사이에 또 다른 계층을 두어 성능 저하를 야기할 수 있습니다.

종류

가상 프록시

  • 가상 프록시는 객체 생성에 비용이 많이 드는 경우나 필요한 시점까지 객체를 생성하지 않고 대리 객체를 사용하여 접근하는 방식입니다.
  • 클라이언트가 실제 객체에 직접 접근하지 않고, 가상 프록시 객체를 통해 간접적으로 접근합니다.
  • 가상 프록시는 실제 객체를 생성하는 비용이 큰 경우나 객체 로딩 시간을 줄이기 위해 사용될 수 있습니다.

원격 프록시

  • 원격 프록시는 다른 주소 공간에 존재하거나 원격 서버에 있는 객체에 대한 접근을 관리하는 방식입니다.
  • 클라이언트가 프록시를 통해 원격 객체에 접근하고, 프록시는 해당 요청을 원격 서버로 전달하고 결과를 받아 클라이언트에게 반환합니다.
  • 원격 프록시는 웹 서비스, 분산 시스템 등에서 사용되어 네트워크 통신을 관리하고 원격 객체에 대한 접근을 추상화합니다.

보호 프록시

  • 보호 프록시는 객체에 접근할 때 보안 검사를 수행하여 접근 권한을 제어하는 방식입니다.
  • 클라이언트가 보호 프록시를 통해 객체에 접근하면, 프록시는 사전에 정의된 보안 규칙에 따라 클라이언트의 요청을 승인하거나 거부할 수 있습니다.
  • 보호 프록시는 객체의 접근 제어, 인증, 권한 검사 등의 보안 기능을 제공합니다.

스마트 프록시

  • 스마트 프록시는 객체에 대한 추가적인 기능을 제공하기 위해 사용되는 방식입니다.
  • 클라이언트가 스마트 프록시를 통해 객체에 접근하면, 프록시는 객체의 상태나 동작을 모니터링하거나 캐싱 등의 추가 기능을 수행할 수 있습니다.
  • 스마트 프록시는 객체의 접근을 투명하게 제공하면서 부가적인 기능을 제공하는데 활용됩니다.

예시

// 계산 인터페이스
public interface Calculator {
    int add(int a, int b);
}
// 실제 계산 클래스
public class RealCalculator implements Calculator {
    @Override
    public int add(int a, int b) {
        return a + b;
    }
}
// 프록시 클래스
public class ProxyCalculator implements Calculator {
    private RealCalculator realCalculator;

	@Override
    public int add(int a, int b) {
        // 전처리 작업 수행
        System.out.println("덧셈 작업을 시작합니다.");
        
        // 실제 객체가 필요한 시점에 생성
        if (realCalculator == null) {
       		this.realCalculator = new RealCalculator();
        }
        // 실제 계산 객체에 계산을 위임
        int result = realCalculator.add(a, b);
        
        // 후처리 작업 수행
        System.out.println("덧셈 작업을 완료했습니다.");

        return result;
    }
}
// 클라이언트 코드
public class Client {
    public static void main(String[] args) {
        // 프록시를 사용하여 계산 수행
        Calculator calculator = new ProxyCalculator();
        int sum = calculator.add(5, 3);
        System.out.println("결과: " + sum);
    }
}

위 예시와 같이 클라이언트는 마치 실제 계산 객체를 직접 사용하는 것처럼 프록시(ProxyCalculator)를 통해 계산을 수행할 수 있습니다.

  1. 클라이언트는 프록시 객체를 통해 add 메서드를 호출합니다.
  2. 프록시는 전처리 작업을 수행한 뒤 실제 계산 객체(RealCalculator)가 필요한 시점에 생성하고, 이 객체에 계산을 위임합니다.
  3. 계산 결과를 받은 후 후처리 작업을 수행하고 결과를 반환합니다.
profile
웹 개발에 관심 있습니다.

0개의 댓글