프록시(Proxy)?

김형준 Kim Hyeong Jun·2022년 12월 8일
0

Proxy란 사전적으로는 대리인이라는 뜻을 가지고 있다.
Java에서 프록시는

  • RealSubject 는 자신의 기능에만 집중하고
  • 그 이외 부가 기능을 제공하거나 접근을 제어하는 역할을 Proxy 객체에게 위임한다.

이로 인해 SOLID 원칙 중 SRP를 지향하는 코드로 작성이 가능해진다.

SRP (Single Responsibility Principle, 단일 책임 원칙)

객체는 단 하나의 책임만 가져야 한다는 원칙을 말한다.

  • 응집도는 높게
    (한 프로그램의 요소가 얼마나 뭉쳐있는지, 즉 구성 요소들 사이의 응집력)
  • 결합도는 낮게
    (프로그램 구성 요소들 사이가 얼마나 의존적인지)

여러 객체들이 하나의 책임만을 갖도록 잘 분배한다면, 시스템에 변화가 생기더라도
그 영향을 최소화할 수 있기 때문에 SRP원칙을 따르는 것이 좋다.
Reperence


프록시 패턴

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

위 그림에서 보듯, 클라이언트가 Subject인터페이스의 request()를 호출하면 구현클래스인 RealSubject의 request()가 호출된다.

이때 프록시가 대신 RealSubject의 request()메서드를 호출하고 그 반환값을 클라이언트에게 전달하는것이다.

코드

인터페이스 생성

package com.programmers.java.proxyPattern;

public interface Subject {
    String request();
}

구현 클래스 생성

package com.programmers.java.proxyPattern;

public class RealSubject implements Subject {

    @Override
    public String request() {
        return "HelloWorld";
    }
}

구현 클래스를 호출하는 프록시(클래스) 생성

package com.programmers.java.proxyPattern;

public class Proxy implements Subject {

    private final RealSubject realSubject = new RealSubject();

    @Override
    public String request() {
        return realSubject.request();  //프록시가 실제의 메소드를 호출한다.
    }

}

프록시를 통해 한번 우회하여 메서드에 접근

package com.programmers.java.proxyPattern;

public class Main {

    public static void main(String[] args) {
        // Subject클래스의 메소드를 호출하는것이아닌 프록시클래스의 메소드를 호출한다.
        Subject subject = new Proxy();
        System.out.println(subject.request()); // 내부적으로 Subject의 메소드를 호출한다.

    }
}

특징

  • 인터페이스를 두기때문에 개발코드에서 구현체의 영향을 받지 않는다.
  • 구현 클래스에 직접 접근하지않고 Proxy를 통해 한 번 우회하여 접근한다.(흐름제어)

주의할점은 흐름을 제어하는것만 담당하고 결과를 조작하거나 변경할 순 없다.


프록시 패턴의 장점

  • 실제 객체를 수행하기 전에 전처리를 하거나 기본 객체를 캐싱할 수 있다.
  • 실제 객체를 수정하지 않고 추가적인 기능을 삽입할 수 있다.
  • 사이즈가 큰 객체가 로딩되기 전에도 프록시를 통해 참조를 할 수 있다.
  • 실제 객체의 public, protected 메소드를 숨기고 인터페이스를 통해 노출시킬 수 있다.
  • 로컬에 있지 않고 떨어져있는 객체를 사용할 수 있다.

프록시패턴 단점

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

프록시 Pattern 의 특징

  1. 프록시 객체는 RealSubject와 같은 이름의 메서드를 구현한다.
  2. 프록시 객체는 RealSubject에 대한 참조 변수를 가진다.
  3. 프록시 객체는 RealSubject의 method 를 호출하고 그 결과를 클라이언트에게 반환한다.
  4. 프록시 객체는 RealSubject 메서드의 호출 전, 후에 별도의 로직을 수행할 수 있다.

Reference

https://velog.io/@dev_leewoooo/Proxy-pattern%EC%9D%B4%EB%9E%80-with-Java

https://velog.io/@newtownboy/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%ED%94%84%EB%A1%9D%EC%8B%9C%ED%8C%A8%ED%84%B4Proxy-Pattern

https://esoongan.tistory.com/180

profile
I want be a developer🙂

0개의 댓글