text/Java
프록시 패턴(Proxy pattern) 간단 정리
hoonzii
2023. 3. 9. 13:07
반응형
프록시 패턴 (내가 이해한)
- 실제 클래스를 대체하는 대리자 클래스를 구성
- 실제 클래스를 변경하지 않고도, 클래스의 동작 수행 이전 혹은 이후에 무언가를 실행 가능
- 고로 동작은 똑같이 한다는 걸 보장, 허나 동작의 흐름?을 제어
- 실제 동작 객체가 수행하기전 까진 초기화 x, 동작시 초기화 수행 가능 (ex. 지연된 초기화)
- 무거운 객체를 항상 초기화 하는게 아니라 가벼운 프록시 객체만 로딩
- 추후 실제 동작 필요시 그때서야, 무거운 객체를 로딩
- 실제 동작 객체의 동작전 대리자 객체만의 동작을 추가 수행 (ex. 로그 남기기)
- 실제 동작 객체는 변경하지 않고, 프록시의 객체 동작전, 후 로그 생성 및 변경 가능
- 실제 동작 객체의 동작 후, 결과를 보관 및 사용자의 재요청시 보관된 결과를 반환 (ex. 캐시)
- 반복 수행되는 결과 반환에 대해 동작 수행후 결괏값을 보관 및 재요청 시 반환 (key-value mapping)
- 실제 동작 객체가 수행하기전 까진 초기화 x, 동작시 초기화 수행 가능 (ex. 지연된 초기화)
대충 예제를 만들어 봅시다.
원하는 바는
- real 클래스는 무거우니 proxy 객체가 대신 선언
- 그러기 위해서 real, proxy 둘다 ObjectInterface를 implements 함
- real 클래스의 doThing 함수가 동작하기 전까지는 real 클래스 선언 필요 x
- 필요시 선언을 위해 proxy 객체의 field 값 = null 로 선언
- proxy doThing 실행시 real 클래스의 생성 및 실행값 전달
위 다이어그램을 토대로 코드 구현해보자.
// ObjectInterface
public interface ObjectInterface {
public void doThing();
}
// proxy
public class proxy implements ObjectInterface{
private real real = null;
@Override
public void doThing() { // proxy doThing 실행시
if(real == null) { // real 객체 초기화
real = new real();
}
real.doThing(); // real 객체의 doThing 함수 호출
}
}
// real
public class real implements ObjectInterface{
@Override
public void doThing() {
System.out.println("real do thing");
}
}
//mainClass
public class mainClass {
public static void main(String[] args) {
ObjectInterface obj = new proxy(); // real 대신 proxy 선언
obj.doThing();
}
}
proxy 객체의 편리한 점
real 클래스와 호출하는 main 클래스는 변하지 않게끔 proxy 객체를 수정할 수 있다.
예를 들어
만약 doThing함수 호출 시 콘솔창에 해당 호출 내역이 필요하다면?
public class proxy implements ObjectInterface{
private real real = null;
@Override
public void doThing() {
System.out.println("실행 전 기록이 찍혔으면 좋겠어요.");
if(real == null) {
real = new real();
}
real.doThing();
System.out.println("실행 후 기록이 찍혔으면 좋겠어요.");
}
}
proxy 간단 정리 끝
참고
- 출근 때 본 유튜브) https://youtu.be/TO9XnSkuUtg
- 친절한 블로그) https://johngrib.github.io/wiki/pattern/proxy/#fnref:yuki-378
- 잘 정리된 외국어 글) https://refactoring.guru/ko/design-patterns/proxy
반응형