🌈Programming/Design Pattern
[Design Pattern] 프록시 패턴(Proxy Pattern) 알아보기
coco3o
2022. 7. 16. 17:48
반응형
프록시 패턴(Proxy Pattern)이란?
프록시는 대리인이라는 뜻으로, 무엇인가를 대신 처리하는 의미이다.
일종의 비서라고 생각하면 된다.사장실에 바로 들어가서 사장님을 바로 만나는게 아닌 비서를 통해 사장님을 만나는 개념이라고 생각할 수 있겠다.
어떤 객체를 사용하고자 할 때, 객체를 직접 참조하는 것이 아니라 해당 객체를 대행(대리, proxy)하는 객체를 통해 대상 객체에 접근하는 방식을 사용하면 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고,
실제 객체의 기능이 반드시 필요한 시점까지 객체의 생성을 미룰 수 있다.
일반적으로 프록시는 다른 무언가와 이어지는 인터페이스 역할을 하는 클래스를 의미한다.
프록시 패턴(Proxy Pattern)을 사용하는 이유가 뭘까?
- 객체지향 5원칙 중 하나인 OCP를 지킬 수 있다.
- 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있다.
- 객체지향 5원칙 중 하나인 SRP를 지킬 수 있다.
- 기존 코드가 해야 하는 일만 유지할 수 있다.
- 유연한 코드를 만들 수 있다.
- (객체)초기화 지연 및 기능 추가(로깅, 시간 측정, 캐싱), 흐름제어 등으로 다양하게 활용할 수 있다.
프록시 패턴(Proxy Pattern) 간단 예제
위 그림을 예로 간단한 예제를 만들어보자.
public interface Subject {
void request();
}
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("HelloCoCoWorld!");
}
}
public class Proxy implements Subject {
private Subject subject;
@Override
public void request() {
// 객체의 초기화를 지연시켜 실제로 사용될 때 생성함으로써 메모리 절약 가능
if (this.subject == null) {
this.subject = new RealSubject();
}
subject.request(); // 프록시가 RealSubject()의 메소드를 호출한다.
}
}
public class Main {
public static void main(String[] args) {
// RealSubject 클래스의 메소드를 호출하는것이 아닌 Proxy 클래스의 메소드를 호출한다.
Subject subject = new Proxy();
subject.request(); // 내부적으로 RealSubject의 메소드를 호출한다.
}
}
Main에서 RealSubject에 직접 접근하지 않고 Proxy를 생성하여 대신 시킨다.
프록시 패턴(Proxy Pattern)의 장단점
프록시 패턴 장점
- 기존 객체를 수정하지 않고 일련의 로직을 프록시 패턴을 통해 추가할 수 있다.
- 실제 객체를 수행하기 이전에 전처리를 하거나, 기존 객체를 캐싱할 수 있다.
- 기존 객체의 리소스가 무거울 경우, 이러한 캐싱 과정을 통해 부하를 줄일 수 있는 장점이 있다.
- 기존 객체와 클라이언트의 요청 사이에 위치해 있기 때문에 하나의 방패(보안) 역할을 한다.
프록시 패턴 단점
- 코드의 복잡도가 증가한다.
- 로직이 난해해져 가독성이 떨어질 수 있다.
- 성능이 저하될 수 있다.
- 객체를 생성할 때 한 단계를 거치게 되므로, 빈번한 객체 생성이 필요한 경우
- 객체 생성을 위해 스레드 생성 및 동기화가 구현되어야 하는 경우
반응형