[Java] 디자인 패턴, Proxy에 대해 알아보자
- Language/JAVA
- 2024. 9. 12.
📑 Proxy 소개
- 구조 디자인 패턴이다.
- 어떤 객체에 대한 접근을 제어하거나 기능을 확장하려고 할 때 사용
- 클라이언트가 객체를 직접 사용하는 대신에 Proxy라는 대리자를 통해 객체에 접근하도록 만든다.
- 실제 객체와 같은 인터페이스를 구현함으로써, 클라이언트가 실제 객체와 동일하게 Proxy 를 사용할 수 있게 해 준다.
- Proxy 는 실제 객체의 생성과 관리, 생명주기를 관리하거나, 접근을 제어하며, 요청을 가로채 추가적인 행동을 수행하고 나서 실제 객체로 요청을 전달.
📝 구성 요소
요소 | 설명 |
Subject ( 주제 ) |
|
Real Subject ( 실제 주제 ) |
|
Proxy |
|
🔍 Point
클라이언트가 직접 대상 객체 (RealSubject)에 접근하는 대신, 그 사이에 Proxy객체가 위치하여 여러 가지 중요한 작업을 수행
🏁 주요 유형
프록시 종류 | 설명 |
가상 프록시 (Virtual Proxy) | 객체를 생성하는 것이 비용이 많이 들 때, 객체가 실제로 필요할때까지 객체의 생성을 지연시키는 데 사용 |
보호 프록시 (Protection Proxy) | 객체에 대한 접근을 제어할 때 사용하며, 특정 사용자에게만 접근 권한을 부여 |
원격 프록시 (Remote Proxy) | 다른 주소 공간에 있는 객체에 대한 접근을 제어할 때 사용되며, 원격 객체와의 통신을 관리 |
스마트 프록시 (Smart Proxy) | 실제 객체에 대한 추가적인 작업을 제공할 때 사용되며, 참조 횟수를 세는 등의 추가적인 기능을 수행 |
🍖 Proxy 사용 이유 ( 장점 )
1. 접근 제어와 보안 강화
- 프록시는 실제 객체에 대한 접근을 제어.
- 민감한 정보나 자원에 대한 보호를 강화할 수 있다.
- 보호 프록시 (Protection Proxy)를 통해 사용자 인증을 요구하거나 특정 사용자에게만 접근 권한을 제공
2. 비용 효율적인 지원 관리
- 가상 프록시(Virtual Proxy)를 사용하면, 객체의 생성과 초기화를 지연시킬 수 있어, 불필요한 리소스 소모를 줄이고 성능을 최적화할 수 있다.
3. 원격 객체 관리의 용이성
- 원격 프록시 (Remote Proxy)를 통해 다른 네트워크 영역에 위치한 객체들을 마치 로컬 객체처럼 쉽게 다룰 수 있다.
- 이는 분산 시스템이나 클라우드 서비스를 효율적으로 관리하는데 도움
4. 추가 기능의 제공
- 프록시를 통해 실제 객체의 기능에 부가적인 작업을 추가할 수 있다.
5. 시스템의 격리와 결합도 감소
- 프록시를 사용하면 클라이언트와 실제 서비스 사이의 결합도를 낮출 수 있다. 이는 시스템의 각 부분을 독립적으로 개발하고 테스트하는데 도움 된다.
6. 인터페이스의 단순화
- 복잡한 시스템이나 서드파티 라이브러리를 사용할 때, 프록시를 통해 더 간단하고 사용하기 쉬운 인터페이스를 클라이언트에게 제공한다.
- 이는 시스템의 복잡성을 추상화하고 사용자 친화적인 작업 흐름을 만드는데 기여.
🧑💻 코드 보기
☘️ Image
public interface Image {
void display();
}
☘️ RealImage
public class RealImage implements Image{
private String fileName;
public RealImage(String fileName) {
this.fileName = fileName;
loadFromDisk(fileName);
}
private void loadFromDisk(String fileName) {
System.out.println("Loading: "+fileName);
}
public void display() {
System.out.println("Displaying1: "+fileName);
}
}
☘️ ProxyImage
public class ProxyImage implements Image{
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName) {
this.fileName = fileName;
}
@Override
public void display() {
if(realImage == null) {
realImage = new RealImage(fileName);
}
realImage.display();
}
}
☘️ ProxyDemo
public class ProxyDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test_10mb.jpg");
image.display();
image.display();
}
}
🐳 마무리
같은 객체를 상속받은 두 개 이상의 객체가 서로를 보안하는 코드가 가장 인상적인 패턴이었다.
인상 깊었던 것은, 자신의 상속을 그대로 사용하지 않고 다른 객체를 통해 대리인을 하듯이 한다는 부분이었다.
마치, 무언가를 하기 위해서 행동을 할 때, 과정과 결과를 나눈 것 같은 기분이었다.
반응형
'Language > JAVA' 카테고리의 다른 글
[Java] 디자인 패턴, State에 대해 알아보자 (2) | 2024.09.11 |
---|---|
[Java] 디자인 패턴, Command 패턴 알아보자 (2) | 2024.09.10 |
[Java] 디자인 패턴, Strategy에 대해서 알아보자 (1) | 2024.09.07 |
[JAVA] 디자인패턴 - 싱글턴 (0) | 2024.09.02 |
[Java] 중첩 클레스 알아보기 (1) | 2024.07.03 |