[Tistory] [Proxy Pattern] 프록시 패턴

원글 페이지 : 바로가기

Proxy 영어로 Proxy는 ‘대리’, ‘대리인’ 이라는 뜻을 가지고 있다. 뜻 그대로 프록시 패턴이란, 원본 객체에 직접적으로 접근 하는 것이 아니라 어떤 ‘대리자’를 통해서 간접적으로 원본 객체를 사용하는 것을 말한다. 그림을 통해 자세히 알아보자 Proxy Pattern 인터페이스를 구현한 ‘Origin Object’와 ‘Proxy Object’가 있다. ‘Proxy Object’는 ‘Origin Object’를 컴포지션하여 멤버 변수로 사용하고있다. 이때 Client에서 요청이 온다면 다음처럼 작동 할 것이다. Client에서 Request를 보냄 Controller를 거친 뒤, ‘Origin Object’가 아닌 ‘Proxy Object’를 호출 ‘Proxy Object’는 method A를 구현하고, 기타 작업을 수행 후 ‘Origin Object’의 method A를 호출 결과 return Proxy Pattern 위의 그림에서 봤듯이 프록시 패턴은 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴을 말한다. 그렇다면 원본 객체에 곧 바로 접근하여 기능을 추가하지 않고, 번거롭게 대리자를 통해 간접적으로 접근하는 이유가 무엇인지, 구조는 어떻게 되어있는지를 알아보자 (* 아래의 대상은 원본 객체를 의미) Proxy Pattern의 장점, 활용 기존 코드의 변경 없이 새로운 기능을 추가할 수 있다 (OCP 원칙) 이로 인해 기존 코드는, 부가 기능 없이 본래 기능만 하도록 유지할 수 있다 (SRP 원칙) 보안(Security) Client가 작업을 수행할 수 있는 권한이 있는지 확인하고, 권한이 있는 경우에만 요청을 대상으로 전달할 수 있다 캐싱(Caching) 내부 캐시를 유지하여, 데이터가 캐시에 아직 존재하지 않는 경우에만 대상으로 요청을 넘긴다 이를 통해 동일한 요청에 대해 다시 서비스 로직을 수행하지 않고 캐시된 결과를 반환시킬 수 있다 데이터 유효성 검사(Data validation) Client에서 넘어온 입력이, 대상으로 전달되기 전에 유효성 검사를 할 수 있다 지연 로딩(Lazy Loading) 대상의 생성 비용이 비싸다면, 실제로 대상이 사용되기 전까지 호출을 연기할 수 있다 로깅(Logging) 프록시가 클라이언트와 대상 사이에 위치하여, 메서드 호출을 인터셉트하고 이를 기록할 수 있다 이를 통해 각 메서드의 호출 시간, 매개변수, 반환값 등을 기록하여 디버깅이나 성능 모니터링에 활용할 수 있다 원격 객체(Remote objects) 대상이 다른 주소 공간(서버)에 있거나 네트워크를 통해 접근해야 할 때, 원격 위치에 있는 객체를 가져와서 로컬처럼 보이게 할 수 있다 이를 통해 네트워크 통신의 복잡성을 숨기고 클라이언트가 마치 로컬 객체를 사용하는 것처럼 편리하게 접근할 수 있다 Proxy Pattern의 구조 Subject: Proxy와 Real Subject를 하나로 묶는 인터페이스 대상과 프록시를 동일하게 해주는 추상 메서드 ‘operation()’ 을 정의한다 클라이언트는 인터페이스를 통해 통신하기에, Proxy와 Real Subject를 의식할 필요가 없다(즉, 몰라도 된다) RealSubject: 원본 객체로, ‘대상’ 이라고 부른다 Proxy: 대상 객체(RealSubject)를 중계하는 대리자 객체 프록시는 대상을 composition한다 프록시는 대상과 같은 이름의 메서드(인터페이스에 정의된 메서드)를 호출하며, 별도의 로직을 수행할 수 있다 프록시는 흐름 제어만을 할 뿐, 결과값을 조작하거나 변경시키면 안된다. 결과의 변화가 없는 추가적인 로직은 가능하다 Proxy 구현 interface의 구현체인 실제 객체를 생성 이후, 또다른 interface의 구현체이자 우리가 사용할 프록시 객체를 생성 프록시 객체에서 composition으로 실제 객체를 필드로 선언 프록시 객체에서 내가 원하는 추가적인 동작을 구현하고, 실제 객체의 method를 사용 백기선님 강의 영상 코드 Proxy Pattern vs Decorator Pattern 디자인 패턴중에 Decorator Pattern은 Proxy Pattern과 비슷하기에 둘을 헷갈릴 수 있다. 하지만 ‘GoF(Gang of Four) 디자인 패턴’에 따르면, Proxy Pattern과 Decorator Pattern 모두 Proxy 개념을 사용하고 구현 방법 역시 동일한 디자인 패턴이지만 의도에 따라 둘을 구분하고 있다. Proxy Pattern vs Decorator Pattern Proxy Pattern 접근 제어와 부가적인 기능 추가를 목적으로 한다 Decorator Pattern 런타임시에 원본 객체에 기능을 동적으로 추가하려는 목적으로 사용한다 부가적인 기능이 아닌, 기존 기능의 확장에 집중한다 Reference (백기선님 강의) 프록시 패턴: https://youtu.be/tes_ekyB6U8?si=UPzgU-gSlxFtG4Dz 프록시 패턴: https://velog.io/@semi-cloud/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B83-%ED%94%84%EB%A1%9D%EC%8B%9C-%ED%8C%A8%ED%84%B4Proxy-Pattern [스프링 핵심 원리 고급편(3)] : 프록시 패턴(Proxy Pattern) ☁️ 들어가기 로그 추적기의 수정을 최소화하기 위해, 템플릿 메서드 패턴과 콜백 패턴까지 도입하였다. 하지만 결과적으로 수백개의 클래스에 로그를 남기고 싶다면 모두 고쳐야 한다는 단점 velog.io 프록시(Proxy) 패턴 – 완벽 마스터하기: https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%ED%94%84%EB%A1%9D%EC%8B%9CProxy-%ED%8C%A8%ED%84%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90 💠 프록시(Proxy) 패턴 – 완벽 마스터하기 Proxy Pattern 프록시 패턴(Proxy Pattern)은 대상 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름을 제어하는 행동 패턴이다. 프록시(Proxy)의 사전적인 의미는 ‘대리인’이라는 뜻이다. 즉, 누 inpa.tistory.com

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다