A A
[Design Pattern] Proxy Pattern - ํ”„๋ก์‹œ ํŒจํ„ด

Proxy Pattern - ํ”„๋ก์‹œ ํŒจํ„ด

Proxy Pattern์€ ์ฃผ๋กœ ๊ฐ์ฒด์˜ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด์— ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ด ํŒจํ„ด์€ ์ฃผ์ฒด(Real Subject)์™€ ๊ทธ ์ฃผ์ฒด์— ๋Œ€ํ•œ ๋Œ€๋ฆฌ์ž(Proxy)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • Proxy๋Š” ๋Œ€๋ฆฌ์ธ ์ด๋ผ๋Š” ์˜๋ฏธ, ์ผ์„ ๋Œ€์‹  ํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • ‘๋Œ€๋ฆฌ์ธ proxy’์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ฅผ ๋„˜๋Š” ์ผ์ด ๋ฐœํ–‰ํ•˜๋ฉด, ์‹ค์ œ ‘๋ณธ์ธ real’ ์—๊ฒŒ ์™€์„œ ์—…๋ฌด์š”์ฒญ์„ ํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋ฐ”๋น ์„œ ์ผ์„ ํ•  ์ˆ˜ ์—†๋Š” ‘real object’ ๋Œ€์‹ ์— ‘proxy object’๊ฐ€ ์–ด๋Š์ •๋„ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  real ์˜ค๋ธŒ์ ํŠธ๋Š” proxy ์˜ค๋ธŒ์ ํŠธ์˜ ์กด์žฌ๋ฅผ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.
    • ์ฆ‰, ์ด๋ง์€ ์ž์‹ ์ด proxy๋ฅผ ๊ฒฝ์œ ํ•ด์„œ ํ˜ธ์ถœ๋˜๊ณ  ์žˆ๋Š”์ง€ ์ง์ ‘ ํ˜ธ์ถœ๋˜๊ณ  ์žˆ๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
    • ์ด์œ ๋Š” real ์˜ค๋ธŒ์ ํŠธ์™€ proxy ์˜ค๋ธŒ์ ํŠธ๋Š” ์„œ๋กœ ๊ตฌ์กฐ์  ๋ถ„๋ฆฌ๊ฐ€ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ฉด์—, ‘proxy ์˜ค๋ธŒ์ ํŠธ’๋Š” ‘real ์˜ค๋ธŒ์ ํŠธ’๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

Proxy Pattern์˜ ์ข…๋ฅ˜

  • ๊ฐ€์ƒ ํ”„๋ก์‹œ(Virtual Proxy): ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ด ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ฒฝ์šฐ, ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ํ•„์š”ํ•  ๋•Œ๊นŒ์ง€ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  Proxy๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Proxy๋Š” ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๊นŒ์ง€ ๊ทธ ๊ฐ์ฒด์˜ ์—ญํ• ์„ ๋Œ€์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • ์›๊ฒฉ ํ”„๋ก์‹œ(Remote Proxy): ๋‹ค๋ฅธ ์ฃผ์†Œ ๊ณต๊ฐ„์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋กœ์ปฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ณดํ˜ธ ํ”„๋ก์‹œ(Protection Proxy): ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์บ์‹ฑ ํ”„๋ก์‹œ(Caching Proxy): ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๊ฐ’์ด๋‚˜ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

Proxy Pattern์˜ ๊ตฌ์กฐ

Proxy Pattern์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • Subject(์ฃผ์ฒด)์˜ ์—ญํ• : Proxy์™€, RealSubject์˜ ์—ญํ• ์„ ๋™์ผ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. → ๋ผˆ๋Œ€์˜ ๋Š๋‚Œ
  • Proxy(๋Œ€๋ฆฌ์ธ)์˜ ์—ญํ• : Client์˜ ์š”๊ตฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŒํผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค, ๊ทธ๋Ÿฌ๋‚˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋ฉด Real Subject์—๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ๋งก๊น๋‹ˆ๋‹ค.
  • Real Subject(์‹ค์ œ์˜ ์ฃผ์ฒด)์˜ ์—ญํ• : Proxy๊ฐ€ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†๋Š” ์ผ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • Client(์˜๋ขฐ์ธ)์˜ ์—ญํ• : ProxyํŒจํ„ด์„ ์ด์šฉํ•˜๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค.

  • ์‹ค์ œ๋กœ Server ๊ตฌ์„ฑ์‹œ, Server์•ž์— Proxy ๋‘๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.
  • Proxy๋Š” Server์™€ Communicationํ•˜๋ฉด์„œ Client์—๊ฒŒ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์™ธ์—๋„ log, statics ๊ธฐ๋Šฅ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜น์€ Server์˜ log๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋“ค์–ด์˜ค๋Š” requests์— ๋Œ€ํ•œ response๋ฅผ cache๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
  • Client๊ฐ€ ์ž์ฃผ ์š”์ฒญํ•˜๋Š” request๊ฐ™์€ ๊ฒฝ์šฐ๋Š” proxy์—์„œ ๋ฐ”๋กœ response๋ฅผ ์ฃผ๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์•„์™€ ๊ฐ™์€ ๊ฐœ๋…๋“ค์ด Proxy Pattern์—๋„ ๋˜‘๊ฐ™์ด ์ ์šฉ์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ์— ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” Object๊ฐ€ ์žˆ๊ณ , ๊ทธ Object๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Client๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋•Œ Client๊ฐ€ Object์˜ ์–ด๋– ํ•œ ๊ธฐ๋Šฅ์„ ์‹คํ–‰์‹œํ‚ค๋ ค๊ณ  ํ•˜๋ฉด Proxy์—์„œ๋Š” Object์˜ Function์„ ์‹คํ–‰์‹œํ‚ค๊ฑฐ๋‚˜, ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ Object์˜ ๊ฒฐ๊ณผ๋ฅผ cache๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Proxy Pattern์˜ ์žฅ์  & ๋‹จ์ 

  • Proxy Pattern์˜ ์žฅ์ 
    • ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ œ์–ด: proxy๋Š” ์ฃผ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ง€์—ฐ ์ดˆ๊ธฐํ™”: ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ถ”๊ฐ€ ๊ธฐ๋Šฅ: proxy๋Š” ์ฃผ์ฒด์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „ํ›„์— ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Proxy Pattern์˜ ๋‹จ์ 
    • ๋ณต์žก์„ฑ ์ฆ๊ฐ€: proxy๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ: proxy๋ฅผ ํ†ตํ•ด ์š”์ฒญ์ด ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Proxy Pattern - Example.1

class Cat:
    def speak(self):
        print("meow")

kitty = Cat()
kitty.speak()  # meow
  • Cat class๋Š” Speak ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • Cat object์ธ kitty๋ฅผ ๋งŒ๋“ค๊ณ  kitty๋Š” speak์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
class CatProxy:
    def __init__(self, cat:Cat):
        self.cat = cat

   def speak(self):
    print("before speak") # validity Check
    self.cat.speak()
    print("after speak") # logging
  • CatProxy๋Š” ๋‚ด๋ถ€์˜ Cat object๋ฅผ property๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ Cat์„ ๋Œ€ํ‘œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ speakํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • (Proxy pattern์˜ ํŠน์„ฑ์ƒ ๊ธฐ์กด Object์ธ Cat๊ณผ Proxy object๊ฐ€ ๋™์ผํ•œ interface๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•จ)
  • CatProxy์˜ speak์•ˆ์—๋Š” ๊ทธ ๋ชฉ์ ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
kitty_proxy = CatProxy(kitty)
kitty_proxy.speak()

# Result
before speak
meow
after speak

 

  • CatProxy object์ธ Kitty_proxy๋ฅผ ๋งŒ๋“ค๊ณ  cat object์ธ kitty๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค˜์„œ speak๋ฅผ ํ˜ธ์ถœ ์‹œ, ๊ฒฐ๊ตญ Cat class์˜ speakํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Client๊ฐ€ ์–ด๋–ค object๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๊ฐ™์€ interface๋ฅผ ๊ฐ€์ง„ ๋‹ค๋ฅธ object๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•  ๋•Œ, Proxy Pattern์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Proxy Pattern - Example.2

  • Subject(์ฃผ์ฒด)์˜ ์—ญํ•  → Printable
  • Proxy(๋Œ€๋ฆฌ์ธ)์˜ ์—ญํ•  → PrinterProxy
  • RealSubject(์‹ค์ œ์˜ ์ฃผ์ฒด)์˜ ์—ญํ•  → Printer
  • Client(์˜๋ขฐ์ธ)์˜ ์—ญํ•  → Main
import time
from abc import *
from asyncio.windows_events import NULL

class Printable(metaclass = ABCMeta):
    def __init__(self):
        self._name = ""

    @abstractmethod # ๋ผˆ๋Œ€
    def setPrinterName(self):
        pass
    
    @abstractmethod # ๋ผˆ๋Œ€
    def getPrinterName(self):
        pass
    
    @abstractmethod # ๋ผˆ๋Œ€
    def printText(self):
        pass

class Printer(Printable): # Real
    def __init__(self, name):
        self._name = name
        self.heavyJob("Printer์˜ ์ธ์Šคํ„ด์Šค("+self.name+")๋ฅผ ์ƒ์„ฑ ์ค‘") # ์ดˆ๊ธฐํ™” ์—ญํ• 

    def setPrinterName(self, name):
        self._name = name

    def getPrinterName(self):
        return self._name

    def printText(self, msg):
        print("==="+self.name"===", end=": ")
        print(msg)
    
    def heavyJob(self, msg): # ๋ถ€ํŒ…
        print(msg)

        for i in range(5):
            time.sleep(1)
        
        print("์™„๋ฃŒ")

class PrinterProxy(Printable):

    def __init__(self, name):
        self._name = name
        self._real = NULL
    
    def realize(self):
        if self._real == NULL:
            self._real = Printer(self._name) # ๋ถ€ํŒ… ์—ญํ• 
    
    def setPrinterName(self, name):
        if self._real != NULL:
            self._real.setPrinterName(name) # ๋ถ€ํŒ… ํ›„

        self._name = name
    
    def getPrinterName(self): 
        return self._name
    
    def printText(self, msg): # ๋งŒ์•ฝ์— ๋Œ€๋ฆฌ์ธ์˜ ์—ญํ•  ๋ฒ”์œ„ ์ดˆ๊ณผ์‹œ, realize์—์„œ ์‹คํ–‰
        self.realize()
        self._real.printText(msg)
        
# client
p = PrinterProxy("๋ณด์Šคํ† ํฌ")
print("ํ˜„์žฌ ์ด๋ฆ„์€ "+p.getPrinterName()+"์ž…๋‹ˆ๋‹ค.")
p = PrinterProxy("๋จธํ๋ฆฌ")
print("ํ˜„์žฌ ์ด๋ฆ„์€ "+p.getPrinterName()+"์ž…๋‹ˆ๋‹ค.")
p.printText("hello, How are you?")
p.printText("Do you hear me?")

p.setPrinterName("์•„ํด๋กœ")
print("ํ˜„์žฌ ์ด๋ฆ„์€ "+p.getPrinterName()+"์ž…๋‹ˆ๋‹ค.")
p.printText("We successfully arrived the moon.")
  • ๋ณด๋ฉด, ๋ณด์Šคํ† ํฌ, ๋จธํ๋ฆฌ๋Š” → ๋Œ€๋ฆฌ์ธ์ด ๊ฐ€๋ณ๊ฒŒ ์ผ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • Printer์˜ ์ธ์Šคํ„ด์Šค (๋จธํ๋ฆฌ)๋ฅผ ์ƒ์„ฑ์ค‘์ธ ๊ณผ์ •์€ → ๋ณธ์ธ์ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. (๋ถ€ํŒ… ๊ณผ์ • ์ž…๋‹ˆ๋‹ค)

 

Proxy Pattern - Example.2 : Sequence Diagram


Proxy๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์†๋„ ์˜ฌ๋ฆฌ๊ธฐ

  • Proxy๋Š” ๊ฐ€๋Šฅํ•œ ์ผ๋งŒ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ printํ•  ๋•Œ ๊นŒ์ง€ ๋ฌด๊ฑฐ์šด ์ฒ˜๋ฆฌ๋ฅผ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€๋ น ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๊ธฐ๋™์‹œ์ ์—์„œ ์ด์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ๊นŒ์ง€ ์ „๋ถ€ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋™์— ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. → ์ด๊ฑด ์‚ฌ์šฉ์ž๋“ค์˜ ๋ถˆ๋งŒ์œผ๋กœ ์ด์–ด์งˆ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ , ๊ทธ ๋‹จ๊ณ„๊ฐ€ ๋˜์—ˆ์„๋•Œ ์ฒ˜์Œ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๋Š”ํŽธ์ด ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.
Proxy & Real ๋ถ„๋ฆฌ ํ•„์š”?
- Printer ํด๋ž˜์Šค ์•ˆ์— ์ฒ˜์Œ๋ถ€ํ„ฐ ์ง€์—ฐ ํ‰๊ฐ€์˜ ๊ธฐ๋Šฅ์„ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ์Œ → But, Design pattern์˜ ๊ธฐ๋Šฅ์— ์œ„๋ฐฐ๋จ.
- ๊ทธ๋Ÿฌ๋‚˜, ๋‘˜์„ ๋ถ„๋ฆฌํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ€ํ’ˆํ™” ํ•˜์—ฌ ๋งŒ๋“ค๋ฉด, ๊ฐœ๋ณ„์ ์œผ๋กœ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•จ

ํˆฌ๊ณผ์  API

  • PrinterProxy ํด๋ž˜์Šค์™€ Printer ํด๋ž˜์Šค๋Š” ๊ฐ™์€ Printable์ด๋ž€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • Main ํด๋ž˜์Šค๋Š” ์‹ค์ œ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ณณ์ด PrintProxy ํด๋ž˜์Šค์ด๋“ , Printer ํด๋ž˜์Šค์ด๋“  ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • Printer๋ฅผ ์ง์ ‘ ์ด์šฉํ•ด๋„, ์ค‘๊ฐ„์˜ PrinterProxy๊ฐ€ ๋“ค์–ด์™€๋„ ๋ฌธ์ œ ์—†์ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ PrinterProxy ํด๋ž˜์Šค๋Š” ํˆฌ๊ณผ์ ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HTTP Proxy

  • Proxy๋ผ๊ณ  ํ•˜๋ฉด HTTP Proxy๊ฐ€ ๋จผ์ € ๋– ์˜ค๋ฆ…๋‹ˆ๋‹ค.
  • HTTP Proxy๋Š” HTTP ์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด์—์„œ ์›นํŽ˜์ด์ง€์˜ cashing์„ ์‹คํ–‰ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ด๋ฉฐ ์ด๊ฒƒ๋„ ProxyํŒจํ„ด์„ ์ ์šฉํ•ด์„œ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • HTTP Proxy๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ๋Š” ์ผ๋ก€๋กœ ํŽ˜์ด์ง€์˜ cashing์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…์„ ํ•˜๋ฉด, ์›น๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ค ์›นํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œํ•  ๋•Œ, ์ผ์ผ์ด ์›๊ฒฉ์ง€์— ์žˆ๋Š” ์›น ์„œ๋ฒ„์— ์—‘์„ธ์Šคํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ์ทจ๋“ํ•˜๋Š” ๊ฑฐ์ด ์•„๋‹Œ, HTTP Proxy๊ฐ€ ์บ์‰ฌํ•ด์„œ ์–ด๋–ค ์›นํŽ˜์ด์ง€๋ฅผ ๋Œ€์‹ ํ•ด์„œ ์ทจ๋“ํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ตœ์‹ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ํŽ˜์ด์ง€์˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ์ง€๋‚ฌ์„๋•Œ ์›น ์„œ๋ฒ„์— ์›น ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ง€๋Ÿฌ ๊ฐ‘๋‹ˆ๋‹ค.