[디자인 패턴][구조 패턴] 프록시 패턴(Proxy Pattern)
Updated:
1. 개요
다른 객체에 대한 접근을 제어하기 위한 패턴
프록시 패턴(Proxy Pattern)은 구조 패턴(Structural Pattern)의 한 종류로, 실제 기능을 수행하는 객체의 접근을 제어하거나 원래 기능의 앞뒤에 부가적인 기능을 추가할 수 있다. 또한 프로그램 실행 시점이 아닌 실제로 객체를 사용하는 시점에 생성 및 초기화 할 수 있다.
2. 구조 패턴(Structural Pattern)
2-1. 구조 패턴이란?
구조 패턴이란 작은 클래스들의 상속과 합성을 통해 더 큰 클래스를 생성하는 방법을 제공하는 패턴으로, 독립적으로 개발한 클래스들을 마치 하나인 것 처럼 사용할 수 있다.
2-2. 구조 패턴 종류
3. 구성
[출처 : GoF의 디자인 패턴]
-
Subject : RealSubject와 Proxy를 위한 공통 인터페이스
-
RealSubject : 실제 기능을 제공하는 클래스
-
Proxy : RealSubject에 대한 접근을 제어하고, 객체의 생성과 삭제를 책임지는 클래스
4. 예제 코드
ID를 이용하여 Database에서 정보를 조회한다고 가정해보자. Proxy Pattern을 이용하면 Database에서 객체를 미리 생성해 놓는 것이 아니라 조회하는 시점에 생성해서 사용할 수 있다.
4-1. Subject
[Database.java]
1
2
3
4
public interface Database {
void findById(Long id);
}
4-2. RealSubject
[Crud.java]
1
2
3
4
5
6
7
8
9
10
11
public class Crud implements Database {
public Crud() {
System.out.println("Create Crud object!");
}
@Override
public void findById(Long id) {
System.out.println("Search completed with " + id);
}
}
4-3. Proxy
[CrudProxy.java]
1
2
3
4
5
6
7
8
9
10
11
12
public class CrudProxy implements Database {
private Database database;
@Override
public void findById(Long id) {
if(database == null) {
database = new Crud();
}
database.findById(id);
}
}
Line 7 ~ 9 : 사용하는 시점에 객체 생성
Line 10 : 실제 기능을 제공하는 객체의 메서드를 호출
5. 테스트
[Clinet.java]
1
2
3
4
5
6
7
8
public class Client {
public static void main(String[] args) {
Database db = new CrudProxy();
System.out.println("-----Before calling findbyId-----");
db.findById(1L);
}
}
[실행 결과]
6. 특징
-
유연한 확장 : 기존 코드를 수정하지 않고, 부가 기능 추가 가능(OCP)
-
캡슐화 : 실제 객체의 메서드들을 숨기고, 인터페이스를 통해 접근
-
코드의 증가 : 프록시 클래스에서 인터페이스에 정의된 메서드들을 모두 구현해야 하므로 구현해야 하는 코드의 양 증가
7. Composite vs Decorator vs Proxy
-
Composite Pattern
- 관련된 객체들을 하나의 인터페이스로 관리
-
Decorator Pattern
- 상속 없이 동적으로 새로운 기능 추가
-
Proxy Pattern
- 기능을 제공하는 대상에 대한 참조를 직접 관리하지 않음
Leave a comment