✔️ 프록시 패턴
프록시는 대체자 이다.
프록시의 주요 기능
- 접근 제어
- 권한에 따른 접근 차단
- 캐싱
- 지연 로딩
- 부가 기능 추가
- 원래 서버가 제공하는 기능에 더해서 부가 기능을 수행
- 예) 요청 값이나, 응답 값을 중간에 변형
- 예) 실행 시간을 측정해서 추가 로그를 남김
프록시는 체인 작용이 가능하다.
GOF 디자인 패턴
둘다 프록시를 사용하지만 의도에 따라서 프록시 패턴과 데코레이터 패턴으로 구분
- 프록시 패턴 : 접근 제어가 목적
- 데코레이터 패턴 : 새로운 기능 추가가 목적
위 그림을 보면
클라이언트가 subject에 접근하지만 subject의 구현체인 proxy가 캐시 처리를 하고
없다면 target으로 realSubject를 이용해서 처리
package hello.proxy.pureproxy.proxy.code;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class CacheProxy implements Subject{
private Subject target;
private String cacheValue;
public CacheProxy(Subject target) {
this.target = target;
}
@Override
public String operation() {
log.info("프록시 호출");
// 캐시에 없으면
if (cacheValue == null) {
cacheValue = target.operation();
}
// 캐시에 있으면 target에 접근하지 않고 바로 반환
return cacheValue;
}
}
✔️ 데코레이터 패턴
package hello.proxy.pureproxy.decorator.code;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MessageDecorator implements Component{
private Component component;
public MessageDecorator(Component component) {
this.component = component;
}
@Override
public String operation() {
log.info("MessageDecorator 실행");
String result = component.operation();
String decoResult = "*****" + result + "*****";
log.info("MessageDecorator 꾸미기 적용 전 ={}, 적용 후 ={}", result, decoResult);
return decoResult;
}
}
프록시는 Component를 구현하기 때문에 프록시에서 프록시를 의존할 수 있음 (데코도 마찬가지)
GOF 데코레이터 패턴
생각해보면 꾸며주는 역할을 하는 데코레이터들은 스스로 존재 불가능
항상 꾸며줄 대상이 필요(component) < 중복 발생
Decorator라는 추상클래스를 만드는 방법도 고민 가능
모든 실 사용은 자동 빈등록이 아닌 수동 빈 등록이다.
프록시를 빈으로 등록하는 것이다.
인터페이스 기반 프록시가 좋다. 클래스 기반 프록시는 상속을 해야한다.
하지만 상황에 맞춰서 사용하면 된다.
인터페이스는 역할과 구현을 나눌 수 있어서 좋은 것이다.
하지만 문제가 있다.
프록시 클래스를 너무 많이 만들어야 한다.
사용하는 로직은 하나인데 대상 클래스가 달라 target 만큼 프록시를 만들면 너무 많다.
이를 해결하기 위해 동적 프록시 기술이 있다.
자세한 구현 코드는 강의 자료 참고, 핵심내용만 정리
🔖 학습내용 출처
'Back-End > Spring Advance & Boot' 카테고리의 다른 글
스프링 고급편 - 스프링이 지원하는 프록시 (프록시 팩토리) (1) | 2024.09.25 |
---|---|
스프링 고급편 - 동적 프록시 기술 (0) | 2024.09.24 |
스프링 고급편 - 템플릿 메서드 패턴과 콜백 패턴 (0) | 2024.08.22 |
스프링 고급편 - 쓰레드 로컬 ThreadLocal (0) | 2024.08.19 |
스프링 고급편 - 로그 추적기 (0) | 2024.08.16 |