A A
[Design Pattern] Facade Pattern - ํŒŒ์‚ฌ๋“œ ํŒจํ„ด

Facade Pattern

ํผ์‚ฌ๋“œ ํŒจํ„ด(Facade Pattern)์€ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์ด๋‚˜ ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
  • ์ด ํŒจํ„ด์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹œ์Šคํ…œ์„ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹œ์Šคํ…œ์˜ ๋ณต์žก์„ฑ์„ ๊ฐ์ถ”๊ณ , ๋‹จ์ˆœํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํผ์‚ฌ๋“œ ํŒจํ„ด์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™ ์ค‘ ํ•˜๋‚˜์ธ "๋‹จ์ผ ์ฑ…์ž„ ์›์น™"(Single Responsibility Principle)์„ ๋”ฐ๋ฅด๋ฉฐ, ์‹œ์Šคํ…œ์˜ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Facade (๊ฑด๋ฌผ์˜ ์•ž๋ฉด์„ ์˜๋ฏธ)

  • Facade Pattern์ด๋ž€ ๊ฑด๋ฌผ์˜ ์•ž๋ฉด์ฒ˜๋Ÿผ ๊ทธ ๋’ค์ชฝ์˜ ๋ณต์žกํ•จ์€ ๋‚ด๋ถ€์— ์ˆจ๊ธฐ๊ณ  ๋‹จ๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ํ†ตํ•ฉํ•˜์—ฌ ๊ณ ์ˆ˜์ค€์˜ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Client๋Š” ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํด๋ž˜์Šค๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๋” ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Client๋Š” ๋ณต์žกํ•œ ํด๋ž˜์Šค์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ๋Œ€ํ•  ํ•„์š” ์—†์ด ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” Facade Pattern์—์„œ ์‚ฌ์šฉํ•ด์„œ ๋” ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Example Facade Pattern

  • ์šฐ์ฃผ๋กœ์ผ“์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ Stage1, Stage2, Capsule์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ์ฃผ์„ ์„ ์›ํ•˜๋Š” ๋ชฉ์ ์ง€๋กœ ๋ณด๋‚ผ๋•Œ ๊นŒ์ง€์˜ ๋ณต์žกํ•œ ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • Stage1: ์ ํ™”, ์ด๋ฅ™, ๋ถ„๋ฆฌ. Stage2: ์ ํ™”, ๋ถ„๋ฆฌ. Capsule ์ ํ™”, ์ฐฉ๋ฅ™์˜ ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋งค๋ฒˆ Client๊ฐ€ ๋‹ค๋ฃจ๊ธฐ ๋ฒˆ๊ฑฐ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜๋กœ ๋ฌถ์€ Facade Pattern์„ ๋งŒ๋“ค๋ฉด ๊ฐœ๋ฐœํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • Stage 1 Class - ์ ํ™”, ์ด๋ฅ™, ๋ถ„๋ฆฌ, ๊ท€ํ™˜
class Stage1:
    def ignite(self):
        print('1st stage ignition')

    def liftOff(self):
        print('1st stage liftOff')

    def eject(self):
        print('1st stage eject')

    def comeBack(self):
        print('1st stage return')
  • Stage 2 Class - ์ ํ™”, ๋ถ„๋ฆฌ
class Stage2:
    def ignite(self):
        print('2nd stage ignition')

    def eject(self):
        print('2nd stage eject')
  • Capsule Class - ์ ํ™”, ์ฐฉ๋ฅ™
class Capsule:
    def ignite(self):
        print('capsule ignition')

    def landing(self):
        print('capsule landing/deploy')

 

  • Rocket Class - ๋‚ด๋ถ€์— Stage1, 2, Capsule ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ๋‚ด๋ถ€์— ๋ฐœ์‚ฌ Launch ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
class Rocket:
    def __init__(self):
        self.stage1 = Stage1()
        self.stage2 = Stage2()
        self.capsule = Capsule()

    def launch(self):
        self.stage1.ignite()
        self.stage1.liftOff()
        self.stage1.eject()
        self.stage2.ignite()
        self.stage1.comeBack()
        self.stage2.eject()
        self.capsule.ignite()
        self.capsule.landing()
  • Stage1 Class: ์ ํ™”, ์ด๋ฅ™, ๋ถ„๋ฆฌ, ๊ท€ํ™˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • Stage2 Class: ์ ํ™”, ๋ถ„๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • Capsule Class: ์ ํ™”, ์ฐฉ๋ฅ™ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • Rocket Class: Stage1, Stage2, Capsule์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, launch ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ผ๋ จ์˜ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

  • Client → ์—ฌ๋Ÿฌ ๋ถ€ํ’ˆ์„ ์ง์ ‘ ํ†ต์ œํ•  ํ•„์š” ์—†์ด Rocket Object๋ฅผ ๋งŒ๋“ค์–ด์„œ launch๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
rocket = Rocket()
rocket.launch()
Facade Pattern์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ž˜์Šค๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฌถ์–ด์„œ ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Facade์˜ ์—ญํ• 

  • Facade๋Š” ๋ณต์žกํ•œ ๊ฒƒ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • ํ•ต์‹ฌ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ ๊ฒŒ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.
    • Class & Method๊ฐ€ ๋งŽ์ด ๋ณด์ด๋ฉด, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋ฌด์—‡์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€ ๋ง์„ค์ด๊ฒŒ ๋˜๊ณ , ํ˜ธ์ถœํ•˜๋Š” ์ˆœ์„œ์—๋„ ์ฃผ์˜ ํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค
    • ์ฆ‰, ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํ‹€๋ฆฌ๊ธฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์žฌ๊ท€์  Facade ํŒจํ„ด์˜ ์ ์šฉ

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

ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ Facade๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š” ์‹ฌ๋ฆฌ์  ์š”์ธ

  • ๋ณต์žกํ•œ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€๋ฅผ ์†์ง€ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” Facade ์—ญํ• ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฌด์˜์‹์ ์œผ๋กœ ํ”ผํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ์š”?
  • ์ˆ™๋ จ๋œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๋จธ๋ฆฌ ์†์—๋Š” ์‹œ์Šคํ…œ์˜ ๋‚ด์šฉ์ด ๋ชจ๋‘ ๋“ค์–ด์žˆ๊ณ  ๋งŽ์€ ํด๋ž˜์Šค์˜ ์ƒํ˜ธ๊ด€๊ณ„๋ฅผ ์†์— ์žกํž ๋“ฏ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ผ์ง€๋„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๋˜๋Š” ์ž์‹ ์˜ ๊ธฐ์ˆ ์„ ์ž๋ž‘ํ•˜๋ฉฐ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ '์•„๋Š” ์ฒ™' ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์–ด๋–ค ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ 'A ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ์ „์—๋Š” B๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , B๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์—๋Š” C์— ๋“ฑ๋กํ•ด์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค'๋Š” ์‹์˜ ๋ง์„ ํ•œ๋‹ค๋ฉด ์ด๋Š” Facade ํŒจํ„ด์„ ๋„์ž…ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์‹œ์‚ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ™•์‹คํ•˜๊ฒŒ ์–ธ์–ด๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธํ•˜์šฐ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๋จธ๋ฆฌ ์†์— ์ˆจ๊ฒจ๋‘˜ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฝ”๋“œ๋กœ์„œ ํ‘œํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.