프록시

zhzkzhffk·2022년 5월 15일
0

클라이언트와 서버

클라이언트 → 서버에 필요한 것을 요청
서버 → 클라이언트의 요청을 처리
코드상의 객체 → 요청하는 객체(클라이언트), 요청을 처리하는 객체(서버)

직접 호출과 간접 호출

직접 호출: 흔히 생각되는 호출이자 요청, 일반적으로 클라이언트가 서버를 직접 호출하고, 처리 결과를 직접 받는다.

간접 호출: 클라이언트가 요청한 결과를 서버에 직접 요청하는 것이 아니라 어떤 대리자(Proxy)를 통해서 대신 간접적으로 서버에 요청할 수 있다.

간접 호출 특징

접근 제어, 캐싱: 만약 요청 정보가 캐시 메모리에 존재하면 기존의 요청 속도 보다 훨씬 빠르게 처리 결과를 받을 수 있다.
부가 기능 추가: 클라이언트의 요청보다 부가 기능을 수행해준다.(단순 요청에서 조금 더 정제된 요청..)
프록시 체인: 대리자는 또 다른 대리자를 call할 수 있다. 중요한 점은 클라이언트는 대리자를 통해서 요청했기 때문에 이후 과정은 모른다는 점이다. 대리자의 대리자…대리자…를 통해 요청을 처리하고 클라이언트에게 도착하기만 하면 된다.

프록시 특징

*대체 가능*
객체에서 프록시가 되려면, 클라이언트는 서버에게 요청을 한 것인지, 프록시에게 요청을 한 것이지 몰라야 한다. 즉, 서버와 프록시는 같은 인터페이스를 사용해야 한다. 그리고 클라이언트가 사용하는 서버 객체를 프록시 객체로 변경해도 클라이언트 코드를 변경하지 않고 동작할 수 있어야 한다.

클라이언트는 서버 인터페이스(ServerInterface)에만 의존한다. 그리고 서버와 프록시가 같은 인터페이스를 사용 → DI를 사용해서 대체 가능

런타임 시점에서 클라인트 객체에 DI를 사용해서 클라이언트 → 서버에서 클라이언트 → 프록시로 객체 의존관계를 변경해도 클라이언트는 변경 사실 조차 모른다.

*프록시의 주요 기능*

  • 접근 제어
    • 권한에 따른 접근을 차단 → 리소스나 서버에 접근을 권한에 따라 제어 권한이 없으면 예외, 반환
    • 캐싱 → 클라이언트가 프록시에게 요청을 할 때 프록시가 요청 데이터를 갖고 있으면 반환
    • 지연로딩 → 클라이언트가 요청된 정보 안에 연관관계를 가진 객체의 fetch → LAZY인 객체를 접근할 때 그 때 데이터를 조회
  • 부가 기능 추가
    • 원래 서버가 제공하는 기능 + 부가 기능 수행 → 요청 값, 응답 값 중간에 변형, 실행 시간을 측정
profile
Backend Developer

0개의 댓글