Goa
- 프록시 패턴이란 무엇인지 알아보고 이해한다
- 프록시 패턴의 다이어그램
프록시 패턴 (Proxy Pattern)
특정 객체로의 접근을 제어하는 대리인(특정 객체를 대변하는 객체)를 제공한다. 실제 객체의 메서드를 호출하면 그 호출을 중간에 가로채느 패턴이다. 프록시 패턴에는 수많은 변종이 있고, 그리고 그러한 변종들은 대게 접근을 제어하는 방법을 다르게 제어한다.
왜 프록시 패턴을 사용하는가?
- 1. 원격 객체, 2. 생성하기 힘든 객체, 3.보안이 중요한 객체와 같은 다른 객체로의 접근을 제어하는 대리인 객체를 만들 수 있기 때문
프록시 패턴 사용 시 장점
- 객체에 대한 보안을 제공한다. 일반적으로 클라이언트는 객체에 직접 접근할 수 없다. 이는 객체가 악의적인 활동에 의해 변형될 수 있기 때문이다. 프록시는 객체를 보호하는 방패 역할을 한다.
- 다른 서버에 존재하는 외부 객체에 대한 로컬 인터페이스를 제공한다. 분산 시스템 구조에서 클라이언트가 원격으로 특정 커맨드를 권한이 없어 수행하지 못하는 경우가 있다. 이런 경우 로컬 객체(프록시)에 요청을 보내고 프록시는 원격 서버에서 요청을 수행한다.
- 무거운 객체, 특히 자주 사용되는 객체를 캐싱해 애플리케이션의 성능을 향상시킨다.
단, 프록시 패턴을 사용하면 간혹 객체로부터의 응답이 느려지기도 한다. 예를 들어 lazy initialization에 프록시를 사용하고 객체를 처음으로 요청하면, 초기화에 걸리는 시간 때문에 응답 시간이 더 길어질 수 있다.
프록시에서 접근을 제어하는 방법
- 원격 프록시 : 원격 객체로의 접근을 제어
- 가상 프록시 : 생성하기 힘든 자원으로의 접근을 제어
- 보호 프록시 = 동적 프록시 : 접근 권한이 필요한 자원으로의 접근을 제어
프록시패턴 다이어그램
- Subject
- Client에서 필요로 하는 기능을 명시한다
- RealSubject와 Proxy는 Subject 인터페이스를 구현한다
- 똑같은 인터페이스를 구현함으로써, RealSubject가 들어갈 자리에 Proxy를 대신 집어넣을 수 있다.
- RealSubject
- 실제 작업을 처리하는 객체
- Spring에서의 Service에 해당하는 클래스
- Proxy
- 객체의 대변인 역할을 하며 객체로의 접근을 제어
- 실제 작업을 처리하는 객체(RealSubject)의 레퍼런스가 있어, Client로 받은 역할 전달
SOLID 관점에서 본 프록시 패턴
- 단일 책임 원칙 : 실제 객체와 프록시 객체의 책임이 분리되어있다.
- 개방 폐쇄 원칙 : 프록시 객체를 사용하는 객체 관점에서는 새로운 기능이 추가되어도 여전히 프록시 객체인지 진짜 객체인지 알 수가 없다.
- 리스코프 치환 원칙 : 인터페이스를 구현하면서 제공하는 기능이 구현체의 메서드로 대체 가능하다.
- 인터페이스 분리 원칙 : 프록시 객체를 사용하는 객체 관점에서 필요한 기능으로 인터페이스를 분리했다.
- 의존성 역전 원칙 : 프록시 객체와 프록시 객체를 사용하는 객체 모두 추상화된 인터페이스에 의존한다.
참고
헤드퍼스트 디자인 패턴
https://velog.io/@ljinsk3/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-Proxy-Pattern
https://blog.hexabrain.net/346
https://jihyehwang09.github.io/2019/12/23/design-pattern-proxy/
'JAVA > 디자인 패턴' 카테고리의 다른 글
[Proxy Pattern] 프록시 패턴 - 가상 프록시 (0) | 2023.07.03 |
---|---|
[Proxy Pattern] 프록시 패턴 - 원격 프록시 (0) | 2023.07.03 |
[Adapter Pattern] 어댑터 패턴이란? (0) | 2023.06.28 |
[Design Pattern] 디자인 패턴이란? (0) | 2023.06.28 |
[Singleton Pattern] 싱글톤 패턴 (0) | 2023.06.27 |