앞서 원자적인 연산을 제공하지 않는 경우가 있기 때문에,
멀티스레드 환경에서 여러 스레드가 제공하는 경우 컬렉션 프레임워크를 사용하면 안된다고 했습니다
하지만 그런 상황에서도 컬렉션 프레임워크를 사용해야하는 경우가 존재합니다
이런 상황을 위해 synchronized와 Lock등을 통해 안전한 임계영역을 만들면 문제를 해결할 수 있습니다
하지만 이렇게 한다면 모든 컬렉션들을 다 복사해서 동기화 목적으로 새로 구현해야합니다
이것은 매우 비효율적입니다
ArrayList, LinkedList와 같은 코드를 모드 복사해서 synchronized 기능을 추가해야한다면
매우 복잡한 일이 될 것입니다
이런 복잡함을 해결할 때, 사용하는 것이 바로 프록시 패턴입니다
public class ProxyList implements OriginalList{
private OriginalList target;
public ProxyList target(OriginalList target){
this.target = target;
}
@Override
public synchronized void add(Object e){
target.add(e);
}
...
}
이런 형식으로 만들어둔다면, 이제 관련 프레임워크마다 복사해서 사용할 필요 없이
ProxyList 객체 하나만 만들어서 원하는 컬렉션 프레임워크를 주입해주면 됩니다!
사용자가 특정 메소드를 호출하면 런타임에 발생하는 인스턴스간 의존관계에 의해
먼저 프록시 객체에서 synchronized가 적용되고 원본 대상의 메소드가 호출됩니다
이후 원본 대상의 결과가 반환되고, 프록시 객체에서 synchronized가 해제되며
호출한 메소드로 반환됩니다
이런 방식을 앞서 말한 프록시 패턴이라고 합니다
어떤 객체에 대한 접근을 제어하기 위해 그 객체의 대리인 또는 인터페이스 역할을 하는
객체를 제공하는 패턴입니다
프록시 객체는 실제 객체에 대한 참조를 유지하면서, 그 객체에 접근하거나 행동을 수행하기 전에
추가적인 작업을 처리할 수 있도록 합니다