Backend/디자인패턴
프록시 패턴
chjysm
2023. 2. 17. 15:09
프록시 패턴이란?
어떠한 객체를 사용하고자 할 때, 객체에 직접적으로 접근하는 것이 아닌,
해당 객체에 실질적으로 접근하는 대리자(프록시) 를 두어
해당 대리자에 접근하여 실객체 설정 및 사용하도록 만든 디자인패턴
프록시 패턴의 장점
- 사이즈가 큰 객체라면 실제 해당 객체 생성 전에 프록시를 통해 참조할 수 있다.
- 실 객체의 내부 로직을 숨기고 인터페이스를 통해 원하는것만 노출 가능
- 실 객체 접근 전, 전처리 로직을 만들 수 있다.
- 개방/폐쇄 원칙
- 실 객체의 생명주기 관리 가능
프록시 패턴의 단점
- 객체 생성 시 한 단계가 추가되므로, 객체 생성이 빈번할 경우 성능 저하
- 프록시 내부에 스레드 생성, 동기화 구현 필요 시, 성능 저하
- 가독성 저하
프록시 패턴 종류
- 가상프록시
- 꼭 필요로 하는 시점가지 객체의 생성 연기하고, 객체가 실제로 생성된 것 처럼 동작하도록 만드는 패턴
- 프록시 에서 작은 단위의 작업을 처리하고 리소스가 많이 요구되는 작업은 실 클래스에서 사용하도록 구현
- 원격프록시
- 실 객체의 대변자 역할을 하도록 만드는 패턴
- 서로 다른 주소 공간에 있는 객체에 대해 마치 같은 주소 공간에 있는것 처럼 구현
- 보호프록시
- 원 객체에 대한 접근을 제어하기 위한 경우에 사용하는 패턴
- 로깅프록시
- 각 요청 전/후 로 로깅
- 캐싱프록시
- 항상 같은 결과를 생성하는 반복 요청에 대하여 캐싱
- 스마트 참조
- 해당 서비스를 사용중인 클라이언트가 없을 경우 해당 서비스에 대한 시스템자원을 해제한다.
프록시 패턴 구현
public interface AInterface { // 인터페이스
int getCount(int id);
List<String> getList(int id);
}
public class AImpl implements AInterface { // 실 객체
public int getCount(int id){
int i = 0;
return i;
}
public List<String> getList(int id){
List<String> list = new ArrayList<>();
return list;
}
}
@RequiredArgsConstructor
public class AProxy implements AInterface { // 프록시
private final AImpl aImpl;
@Override
@Transactional
public int getCount(int id){
// 전 처리
if( id < 1 ) {
return null;
}
aImpl.getCount(id);
}
@Override
@Transactional
public List<String> getList(int id){
// 전 처리
if( id < 1 ) {
return null;
}
aImpl.getList(id);
}
}
참조 :
[디자인패턴] 프록시패턴(Proxy Pattern)
프록시(Proxy)를 번역하면 대리자, 대변인의 의미를 갖고 있다. 대리자, 대변인은 누군가를 대신해서 그 역할을 수행하는 존재이다. 이는 프로그램에도 똑같이 적용된다. 즉, 프록시에게 어떤 일
velog.io