프록시 패턴(Proxy Pattern)
- 대리자, 대변인
- 누군가를 대신해 그 역할을 수행
프록시 적용전
public class ClientWithNoProxy {
public static void main(String[] args) {
// 프록시를 이용하지 않은 호출
Service service = new Service();
System.out.println(service.runSomething());
}
}
public class Service {
public String runSomething() {
return "서비스 짱!!!";
}
}
- Service 객체의 runSomething() 메서드 직접 호출
프록시 적용 후
public class Service implements IService {
public String runSomething() {
return "서비스 짱!!!";
}
}
public class Proxy implements IService {
IService service1;
public String runSomething() {
System.out.println("호출에 대한 흐름 제어가 주목적, 반환 결과를 그대로 전달");
service1 = new Service();
return service1.runSomething();
}
}
public interface IService {
String runSomething();
}
public class ClientWithProxy {
public static void main(String[] args) {
// 프록시를 이용한 호출
IService proxy = new Proxy();
System.out.println(proxy.runSomething());
}
}
- 실제 서비스와 클라이언트 사이에 대리자(프록시) 를 두어, 특정 로직을 실행한 후, 실제 객체의 메서드 호출 혹은 반대의 작업 가능
구성
- 실제 서비스 객체 (Service)
- 실제 로직이 구현되어있음.
- 대리자 객체 ( Proxy )
- 실제 서비스 객체의 메서드 호출, 추가 로직 수행가능
- 인터페이스 ( IService )
- 대리자와 실제 서비스 객체가 구현해야할 메서드를 정의함
작동
- 메서드 호출
- 클라이언트가 대리자의 메서드 호출
- 메서드 가로채기
- 대리자가 호출을 가로채어 추가적인 로직 수행
- 실제 메서드 호출
- 이후 대리자가 실제 서비스 객체의 메서드 호출
- 메서드 호출 결과 변환
- 실제 서비스 객체의 메서드 호출 결과를 클라이언트에게 반환
중요 포인트
- 대리자는 실제 서비스와 같은 이름의 메서드 구현
- 인터페이스를 사용함.
- 실제 서비스의 참조 변수를 가짐
- 대리자는 추가적인 로직 수행 후 실제 서비스의 메서드를 호출하고 해당 값을 클라이언트에게 반환
- 프록시 패턴은 OCP + DIP 적용 설계 패턴
- 개방 폐쇄 원칙
- 기존의 코드를 변경하지 않고 새로운 기능 추가가능
- 마티즈나 쏘나타 등 차량들은 IService 같은 인터페이스를 구현함으로, 차량의 종류를 바꿔도 프록시 패턴이 영향을 받지 않는다.
- 의존 역전
- 상위 모듈이 하위 모듈에 의존 X
- 특정 모듈이
IService
인터페이스를 구현함으로서, 종류를 변경해도 프록시 패턴의 영향을 미치지 않음.
- 개방 폐쇄 원칙
Uploaded by N2T
'자바 > 스프링입문객체지향' 카테고리의 다른 글
[6단원]디자인 패턴 - 개요 (0) | 2023.09.15 |
---|---|
[6단원]디자인 패턴 - 어댑터 패턴 (0) | 2023.09.15 |
[6단원]디자인 패턴 - 데코레이터 패턴 (Decorator Pattern) (0) | 2023.09.15 |
[5단원]5원칙 - LSP (0) | 2023.09.13 |
[5단원]5원칙 - ISP (0) | 2023.09.13 |