안녕하세요, BTC 블랙아웃입니다!
오늘은 디자인 패턴 중 하나인 '프록시 패턴'에 대해서 함께 알아보겠습니다.
프록시 패턴은 이름에서도 알 수 있듯이 '대리인'의 역할을 하는 패턴입니다. 언제, 왜 이 패턴이 필요한지, 그리고 어떤 종류의 프록시 패턴이 있는지 한 번 살펴보겠습니다.
1. 프록시 패턴이란?
프록시 패턴은 어떤 객체에 대한 접근을 제어하는 역할을 합니다. 대상 객체에 직접 접근하는 대신 프록시 객체를 통해 접근하게 되는데, 이로 인해 다양한 작업을 추가로 수행할 수 있습니다.
2. 프록시 패턴의 종류
1) 가상 프록시 (Virtual Proxy)
특징: 실제 객체의 생성이 자원을 많이 소모하는 경우, 실제 필요한 시점에 객체를 생성합니다.
예시: 이미지 뷰어 앱에서 큰 이미지를 로딩할 때, 사용자가 실제로 이미지를 클릭하기 전까지는 썸네일만을 보여주고, 클릭 시 실제 큰 이미지를 로딩하는 방식.
2) 보호 프록시 (Protection Proxy)
특징: 객체에 대한 접근 권한을 체크하여, 특정 사용자만이 해당 객체에 접근할 수 있도록 합니다.
예시: 웹 사이트의 VIP 회원 전용 콘텐츠. VIP 회원이 아닌 사용자가 접근하려 할 때 프록시가 접근을 차단합니다.
3. 프록시 패턴 생성 예시
이 예제는 크기가 큰 이미지 파일을 다룰 때, 사용하는 예시입니다.
대용량 이미지 파일을 로딩하는 대신 작은 썸네일 이미지를 먼저 보여주고, 사용자가 원하는 이미지를 선택해 클릭할 때만 실제 이미지를 로딩하는 방식입니다.
// Image 인터페이스 정의
public interface Image {
void display();
}
// RealImage 클래스: 실제 이미지 로딩 및 표시
public class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading " + filename);
}
@Override
public void display() {
System.out.println("Displaying " + filename);
}
}
// ProxyImage 클래스: RealImage의 프록시
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();
}
}
// 메인 클래스
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test.jpg");
image.display(); // 이미지 로딩 및 표시
image.display(); // 이미 로딩된 이미지 표시
}
}
- Image 인터페이스
먼저, 실제 객체와 프록시 객체가 공통으로 구현할 Image 인터페이스를 정의합니다. - RealImage 클래스 (실제 객체)
Image 인터페이스를 구현하는 실제 객체인 RealImage 클래스를 만듭니다. - ProxyImage 클래스 (프록시 객체)
실제 RealImage 객체의 생성을 지연시키는 프록시 객체인 ProxyImage 클래스를 구현합니다. - 메인 클래스
마지막으로, 프록시 패턴을 테스트하기 위한 메인 클래스를 작성합니다.
4. 프록시 패턴의 장점
- 접근 제어: 객체에 대한 접근을 세밀하게 제어할 수 있습니다.
- 지연 초기화: 실제 객체의 생성 시점을 늦출 수 있어, 성능 최적화에 도움이 됩니다.
- 참조 카운트: 실제 객체에 대한 참조 횟수를 계산하는데 사용될 수 있습니다.
5. 결론
프록시 패턴은 객체의 생성과 접근을 제어하는 역할을 합니다.
예제에서 보았듯이, 실제로 무거운 연산이 필요한 RealImage의 생성을 지연시켜 리소스를 효율적으로 관리했습니다. 프록시 패턴을 잘 활용하면 시스템의 성능을 최적화하고, 필요한 작업만을 수행하여 리소스 낭비를 줄일 수 있습니다.
이상으로 프록시 패턴에 대한 포스팅을 마치겠습니다.
'Programming' 카테고리의 다른 글
[SpringBoot] Lombok 어노테이션 (0) | 2023.10.24 |
---|---|
[Django/React] 장고와 리액트 연동 (1) (0) | 2023.10.20 |
Understanding Interfaces in Go (1) | 2023.10.13 |
많이 사용되는 개발 프레임워크 및 라이브러리 (0) | 2023.10.13 |
@Transactional 애노테이션 : 주의사항 (0) | 2023.10.13 |
댓글