CS_Step15 - 프록시 패턴(Proxy Pattern)

장선웅·2022년 7월 29일
1

1. 프록시(Proxy)란?

프록시란, '대리'라는 의미로 어떤 일을 대신 시키는 것이다. 예를 들어, 보안상의 이유로 서버를 외부에 노출시키지 않기 위해 서버와 클라이언트의 중간에서 접점을 담당하는 서버를 보고 프록시 서버라고 한다.


2. 프록시 패턴이란?

인터페이스를 사용하고 실행시킬 클래스에 대해 객체가 들어갈 자리에 대리자 객체를 대신 투입하여, 클라이언트는 실제 실행시킬 클래스에 대한 메서드를 호출하여 반환값을 받는지 대리 객체의 메서드를 호출하여 반환값을 받는지 반환값을 어느 클래스에서 받는지 모르게 하는 패턴이다.


3. 프록시 패턴 예제

예를 들어 어떤 이미지 파일을 보여주는 코드를 작성한다고 하자.

  1. 이미지 인터페이스 구현
interface Image {
	//Image를 보여주는 추상 메서드
    public void displayImage();
}
  1. 실제로 이미지를 담는 클래스
class Image_Real implements Image {
	//이미지 파일의 이름을 담을 변수
    private String fileName;
    //생성자
    public Image_Real(String fileName) {
    	this.fileName = fileName;
        loadingImage(fileName);
    }
    //Image를 로딩하는 메서드
    public void loadingImage(String fileName){
    	System.out.println("Loading : " + fileName);
    }
    //Image 인터페이스의 추상 메서드 오버라이딩
    @Override
    public void displayImage() {
    	System.out.println("Displaying : " + fileName);
    }
}
  1. 이미지를 대신 보여줄 프록시 클래스 구현
class Image_Proxy implements Image {
	//진짜 이미지 변수 설정
    private Image_Real image_Real;
    private String fileName;
    //생성자
    public Image_Proxy(String fileName) { 
    	this.fileName = fileName;
    }
    //Image인터페이스 추상 메서드 오버라이딩
    @Override
    public void displayImage() {
    	//만약 보여줄 진짜 이미지가 비어있다면
        if (image_Real == null) {
        	//새로운 객체 생성
        	image_Real = new Image_Real(fileName);
        }
        //이미지를 보여줄 메서드 실행
        image_Real.displayImage();
    }
}
  1. Client클래스 구현(main)
public class Client {
	public static void main(String[] args) {
    	//Image객체를 Proxy를 통해 생성(+ loading)
        Image image1 = new Image_Proxy("image1.jpg");
        Image image2 = new Image_Proxy("image2.jpg");
        //Image를 보여주는 메서드 실행
        image1.displayImage();
        System.out.println("===구분선===");
        image2.displayImage();
    }
}
//결과값
Loading : image1.jpg
Displaying : image1.jpg
===구분선===
Loading : image2.jpg
Displaying : image2.jpg

3. 프록시 패턴의 장/단점

장점

  1. 사이즈가 큰 객체가 로딩되기 전에도 프록시를 통해 참조할 수 있다.
  2. 실제 객체의 public, protected 메서드를 숨기고 인터페이스를 통해 노출시킬 수 있다
  3. 로컬에 있지 않고 떨어져 있는 객체를 사용할 수 있다.
  4. 원래 객체의 접근에 대해서 사전처리를 할 수 있다.

단점

  1. 객체를 생성할때, 한단계를 거치게 된다 => 빈번한 객체 생성이 필요한 경우 성능이 저하될 수 있다.
  2. 프록시 내부에서 객체 생성을 위해 쓰레드 생성, 동기화가 구현되야 하는 경우 성능이 저하될 수 있다.
  3. 로직이 난해해져 가독성이 떨어진다.

4. 포워드 프록시(Forward Proxy) VS 리버스 프록시(Reverse Proxy)

1) 포워드 프록시

  • 예를 들어 어느 한 User가 Naver에 접속한다고 생각해 보도록 하자.

    => 그러면 사용자 PC가 직접 연결하는게 아니라 포워드 프록시 서버가 요청을 받아서 Naver에 그 결과를 User에게 전달해 준다.

포워드 프록시는 대게 캐슁 기능이 있어 자주 사용되는 컨텐츠라면, 월등한 성능 향상을 가져올 수 있으며, 정해진 사이트만 연결하게 설정하는 등 웹 사용 환경을 제한할 수 있으므로, 보안이 매우 중요한 기업 환경등에서 많이 사용한다.

2) 리버스 프록시

  • 어떤 한 User가 Naver의 웹 서비스 데이터를 요청하면 리버스 프록시는 이 요청을 받아서 내부 서버에서 데이터를 받은 후에 이 데이터를 사용자에게 전달해준다.

2_1) 리버스 프록시의 장점

  1. 보안
  2. 속도와 안정성
  3. 신뢰성 증대
profile
개발을 꿈꾸는 초짜

0개의 댓글