Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 릿코드풀기
- leetcode 풀기
- 상가수익률계산기
- leetcode풀기
- python sorted
- 알고리즘풀이
- 파이썬 알고리즘
- LeetCode
- 릿코드풀이
- python zip_longest
- 알고리즘풀기
- python xor
- 파이썬 알고리즘 풀기
- python priority queue
- 코틀린기초
- leetcode풀이
- python Leetcode
- 잇츠디모
- 릿코드 풀기
- python 알고리즘
- 릿코드 파이썬
- 파이썬릿코드
- 파이썬알고리즘
- python 릿코드
- 파이썬릿코드풀기
- binary search
- 파이썬알고리즘풀기
- 파이썬 프로그래머스
- 릿코드
- 파이썬 릿코드
Archives
- Today
- Total
소프트웨어에 대한 모든 것
[디자인패턴][Proxy] 프록시 패턴 본문
반응형
프록시 패턴 정의
- 프록시에게 어떤 일을 대신 시키는 것
- 어떤 객체를 사용할 때 객체를 직접적으로 참조하는 것이 아닌 해당 객체를 대리하는 객체를 통해서 대상 객체에 접근하는 방식. 이는 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고, 실제 객체의 기능이 필요한 시점까지 객체의 생성을 미룰 수 있음
프록시 패턴 장점, 단점
장점
- 메모리 사용량이 큰 객체가 로딩 전에 프록시를 통해서 참조 가능
- 로컬에 있지 않고 떨어져 있는 객체 사용 가능
- 원래 객체의 접근에 대해서 사전처리 작업 가능
단점
- 객체 생성에 한 단계를 거치므로 빈번한 객체 생성이 필요한 경우 성능 저하 발생 가능
- 코드 가독성 저하
프록시 패턴 특징
- 대리자는 실제 서비스와 같은 이름의 메소드를 구현
- 대리자는 실제 서비스에 대한 변수를 갖음
- 대리자는 실제 서비스와 같은 이름의 메소드를 호출하고 그 결과를 클라이언트에 반환
- 대리자는 실제 시버스 메소드 호출 전후 별도의 로직 수행 가능
프록시 패턴 왜 사용하는가?
프록시 객체가 클라이언트의 모든 요청을 받아서 실제 객체에 대한 서비스에 대한 접근을 흐름을 제어하면서 서비스를 유연하게 제공할 수 있습니다.
Proxy 적용 전 | Proxy 적용 후 |
|
<출처 - https://refactoring.guru/design-patterns/proxy>
프록시 패턴 종류
가상 프록시
생성하기 힘든 자원에 대한 접근을 제어
원격 프록시
원격 객체에 대한 접근을 제어
보호 프록시
접근 권한이 필요한 자원에 대한 접근을 제어
프록시 패턴 클래스 다이어그램
프록시 패턴 활용 (가상 프록시)
디스크에 접근해서 이미지 파일을 불러오는 예제입니다. RealImage 객체에 집접 접근하지 않고 프록시 객체 ProxyImage를 통해서 RealImage 객체에 접근합니다. RealImage 객체는 생성시 디스크에서 파일을 읽어오는 행위를 하기 때문에 시간이 오래 걸리지만, ProxyImage 객체를 통해서 사용하는 경우 RealImage를 display() 하는 경우(실제 사용 시점)에 디스크에서 이미지를 로드하게 됩니다. 프록시 패턴을 통해서 lazy initialization을 가능케 합니다.
import time
from abc import ABC, abstractmethod
class Image(ABC):
def __init__(self):
self.filename = None
@abstractmethod
def display(self):
pass
class RealImage(Image):
def __init__(self, filename):
self.filename = filename
self.load_from_disk()
def load_from_disk(self):
print(f'loading {self.filename}')
time.sleep(1000)
def display(self):
print(f'displaying {self.filename}')
class ProxyImage(Image):
def __init__(self, filename):
self.filename = filename
self.real_image = None
def display(self):
if self.real_image is None:
self.real_image = RealImage(self.filename)
self.real_image.display()
proxy_image = ProxyImage('hello.png')
proxy_image.display()
참고 자료
https://limkydev.tistory.com/79
https://coding-factory.tistory.com/711
https://today-retrospect.tistory.com/102
반응형
'시스템 설계 및 디자인 > 디자인 패턴' 카테고리의 다른 글
[디자인패턴][Mediator] 중재자 패턴 (0) | 2022.03.24 |
---|---|
[디자인패턴][Observer] 옵저버 패턴 (0) | 2022.03.24 |
[디자인패턴][Prototype] 프로토타입 패턴 (0) | 2022.03.24 |
[디자인패턴][Composite] 컴포지트 패턴 (0) | 2022.03.24 |
[디자인패턴][Factory Method] 팩토리 메소드 패턴 (0) | 2022.03.24 |
Comments