프록시 - 프록시 패턴 예제

박찬우·2024년 2월 14일
0

스프링

목록 보기
38/88

서버 인터페이스

public interface Subject {
    String operation();
}

서버 구현체

@Slf4j
public class RealSubject implements Subject{
    @Override
    public String operation() {
        log.info("실제 객체 호출");
        sleep(1000);
        return "data";
    }
    private void sleep(int millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

프록시

@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();
        }

        return cacheValue;
    }
}

클라이언트

public class ProxyPatternClient {

    private Subject subject;
    
    public ProxyPatternClient(Subject subject) {
        this.subject = subject;
    }
    
    public void execute() {
        subject.operation();
    }
}

TEST

	// 클라이언트 - 서버
    @Test
    void noProxyTest() {
        RealSubject realSubject = new RealSubject();
        ProxyPatternClient client = new ProxyPatternClient(realSubject);

        // 총 3초가 걸림
        client.execute();
        client.execute();
        client.execute();
    }

	// 클라이언트 - 프록시 - 서버
    @Test
    void cacheProxyTest() {
        RealSubject realSubject = new RealSubject();
        CacheProxy cacheProxy = new CacheProxy(realSubject);
        ProxyPatternClient client = new ProxyPatternClient(cacheProxy);

        // 처음에는 1초가 걸리지만
        // 나머지는 캐시에 값이 있기 때문에 바로 가져옴
        client.execute();
        client.execute();
        client.execute();
    }

핵심

  • RealSubject 코드와 클라이언트 코드를 전혀 변경하지 않고, 프록시를 도입해서 접근 제어를 했다
  • 클라이언트 코드의 변경 없이 자유롭게 프록시를 넣고 뺄 수 있다. - 실제 클라이언트 입장에서는 프록시 객체가 주입되었는지, 실제 객체가 주입되었는지 알지 못한다
profile
진짜 개발자가 되어보자

0개의 댓글