728x90
✅ Proxy Pattern(프록시 패턴)
프록시 패턴(Proxy Pattern)은 객체에 대한 접근을 제어하거나 확장하기 위해, 실제 객체를 대신해서 그 역할을 하는 "대리 객체(proxy)"를 사용하는 구조적 디자인 패턴이야.
간단히 말하면, 프록시 객체는 실제 객체에 대한 접근을 제어하는 중간자 역할을 해.
즉, 실제 객체를 사용하기 전에 사전 작업을 처리하거나, 사후 작업을 추가하는 방식으로 동작할 수 있어.
📌 프록시 패턴이 사용되는 이유
- 접근 제어
- 실제 객체에 대한 접근을 제한하고 싶을 때. 예를 들어, 권한 관리, 로깅, 성능 최적화 등.
- 지연 로딩(Lazy Loading)
- 실제 객체를 필요할 때까지 생성하지 않고, 대신 프록시 객체가 생성된 후 실제 객체를 늦게 로드할 수 있음.
- 성능 최적화
- 네트워크 요청이나 무거운 객체에 대해 프록시 객체가 처리하고 실제 객체는 필요할 때만 로드하거나 동작하도록 할 수 있음.
- 보안
- 클라이언트와 서버 사이에서 실제 객체를 직접 사용하지 않고, 중간에서 보안 체크나 다른 기능을 수행할 수 있음.
📌 프록시 패턴의 종류
- Virtual Proxy (가상 프록시)
- 객체의 생성비용이 크거나 시간이 많이 소요될 때, 객체를 늦게 생성하도록 하는 프록시.
- Remote Proxy (원격 프록시)
- 실제 객체가 다른 시스템에 있을 때, 원격 객체에 대한 호출을 대리하는 프록시.
- Protection Proxy (보호 프록시)
- 실제 객체에 대한 접근을 제어하는 프록시. 예를 들어, 권한을 체크하는 역할을 할 수 있음.
- Cache Proxy (캐시 프록시)
- 요청을 처리할 때, 결과를 캐시하고, 이후 같은 요청이 오면 캐시된 데이터를 반환하는 프록시.
📌 프록시 패턴의 예시
1️⃣ 프록시 패턴을 사용한 예제 (로깅과 접근 제어)
여기서는 서비스 객체에 대한 접근을 제어하기 위해 프록시를 사용해.
로깅과 권한 체크를 하는 프록시 객체가 실제 서비스 객체를 대리하여 사용돼!
// 실제 서비스 클래스
public class RealService {
public void performTask() {
System.out.println("실제 서비스에서 작업을 수행합니다.");
}
}
// 프록시 클래스 (대리 객체)
public class ServiceProxy {
private RealService realService;
public ServiceProxy(RealService realService) {
this.realService = realService;
}
public void performTask() {
// 1. 접근 제어: 권한 체크
System.out.println("권한을 확인합니다...");
// 2. 실제 서비스 메서드 호출
realService.performTask();
// 3. 로깅
System.out.println("작업이 완료되었습니다.");
}
}
// 실행 코드
public class Main {
public static void main(String[] args) {
RealService realService = new RealService();
ServiceProxy serviceProxy = new ServiceProxy(realService);
serviceProxy.performTask(); // 프록시를 통해 실제 서비스 호출
}
}
2️⃣ 프록시 패턴을 활용한 지연 로딩(Lazy Loading) 예제
이 예제에서는 Virtual Proxy를 사용해 실제 객체를 필요할 때만 생성하도록 하고, 지연 로딩을 구현해!
// 실제 객체
public class ExpensiveResource {
public ExpensiveResource() {
System.out.println("비싼 자원을 초기화합니다...");
}
public void performTask() {
System.out.println("비싼 자원에서 작업을 수행합니다.");
}
}
// 프록시 객체 (가상 프록시)
public class ExpensiveResourceProxy {
private ExpensiveResource realResource;
public void performTask() {
// 실제 객체가 필요한 시점에만 생성
if (realResource == null) {
realResource = new ExpensiveResource();
}
realResource.performTask();
}
}
// 실행 코드
public class Main {
public static void main(String[] args) {
ExpensiveResourceProxy proxy = new ExpensiveResourceProxy();
// 실제 객체는 아직 생성되지 않음
proxy.performTask(); // 이 시점에 실제 객체가 생성됨
}
}
📌 프록시 패턴의 장점
- 성능 최적화: 객체를 지연 로딩하거나, 캐시를 사용하여 불필요한 리소스 사용을 줄일 수 있음.
- 권한 관리: 실제 객체에 대한 접근을 중간에서 제어하여 보안 기능을 추가할 수 있음.
- 유지보수성: 실제 로직을 프록시 객체에서 분리하여 유지보수가 용이함.
- 로깅 및 모니터링: 객체의 작업을 프록시에서 로그하거나, 성능을 모니터링할 수 있음.
📌 정리
프록시 패턴은 객체에 대한 접근을 제어하거나 확장하는 중간자 역할을 하는 디자인 패턴이야.
특히 성능 최적화, 보안, 로깅 등에서 매우 유용하게 사용될 수 있어.
Spring에서도 AOP에서 프록시 패턴을 많이 사용하고 있기 때문에, 프록시 패턴의 이해는 중요해! 😄
728x90
'프로그래밍 > Spring' 카테고리의 다른 글
Spring Controller란? (0) | 2025.03.28 |
---|---|
JDK 동적 프록시 (JDK Dynamic Proxy) (0) | 2025.03.27 |
Spring셋팅 하기 (0) | 2025.03.27 |
Spring에서 빈(Bean)의 종류 (0) | 2025.03.26 |
SOLID 원칙이란? (0) | 2025.03.26 |