Jiseob Kim

iOS Developer

DesignPattern - Facade Pattern ์•Œ์•„๋ณด๊ธฐ

22 Sep 2021 » DesignPattern


ํ•˜ Roam Research๋ž‘ ZettelKasten ๋„˜ ๋งค๋ ฅ์ ์ธ๋ฐ ์–ด๋ ค์›Œใ…  ๊ธ€ ์ •๋ฆฌํ• ๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์•„์กŒ๋‹ค.

์ƒ๊ฐ๊ณผ ์ƒ๊ฐ์„ ์—ฐ๊ฒฐํ•˜๋‹ˆ ์ฃผ์ œ๋„ ๋„ˆ๋ฌด ๋งŽ์•„์ง€๊ณ  ์žˆ๋‹ค.


์‚ฌ์กฑ์€ ๊ทธ๋งŒํ•˜๊ณ , ์˜ค๋Š˜์˜ ์ฃผ์ œ๋Š” Facade Pattern ์ด๋‹ค.

SOLID ์›์น™์„ ํ•ด๋ณด๋ ค ํ–ˆ๋Š”๋ฐ, ๊ธ€์„ ์“ฐ๋ ค๋ฉด ์ด๊ฒŒ ๋จผ์ € ๋˜์–ด์•ผ ํ• ๊ฒƒ ๊ฐ™์•˜๋‹ค.


์šฐ์„  Facade ๋ผ๋Š” ๋ง์˜ ๋œป์„ ๋จผ์ € ๋ณด์ž

  • ํ•œ๊ธ€: ์ •๋ฉด
  • ์˜์–ด ์„ค๋ช…: The face or front of building


๋ญ”๊ฐ€๊ฐ€ ๋จผ์ € ๋’ค๋ฅผ ์•Œ๊ธฐ์ „์— ๋งž์ด๋ฅผ ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๊ธ€์„ ๋ณด๊ฒŒ ๋˜๋ฉด ์•„๋งˆ

์ด๊ฒŒ ์ด๋ฆ„์ด Facade๊ฐ€ ๋  ์ˆ˜ ๋ฐ–์— ์—†๊ตฌ๋‚˜! ์ฐฐ๋–ก์ด๋„ค! ์‹ถ์„ ๊ฒƒ์ด๋‹ค


์˜ˆ์‹œ


์ ๋‹นํ•œ ์˜ˆ๋กœ ๋‚ด๊ฐ€ ํƒ๋ฐฐ๋ฅผ ๋ถ™์ด๋Ÿฌ ์šฐ์ฒด๊ตญ์ด๋‚˜ ํŽธ์˜์ ์— ๊ฐ”๋‹ค๊ณ  ํ•ด๋ณด์ž.

๊ทธ๋ฆฌ๊ณ  ์‹ ๋ถ„์ฆ๊ณผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฌผ๊ฑด์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๊ทผ๋ฐ ๋‚˜๋”๋Ÿฌ ์•Œ์•„์„œ ์‹ ์› ํ™•์ธํ•˜๊ณ ,

์นด๋“œ๋กœ ํ• ์ง€ ํ˜„๊ธˆ์œผ๋กœ ํ• ์ง€ ์•Œ์•„์„œ ๊ฒฐ์ œํ•˜๊ณ 

์•Œ์•„์„œ ํƒ๋ฐฐ์‚ฌ๋„ ์ง€์ •ํ•˜๊ณ 

๋ฐฐ์†ก ๋‹ด๋‹น ์ง€์ •๋„ ๋„ˆ๊ฐ€ ํ•ด ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ?

์ƒ์ƒ๋งŒํ•ด๋„ ๋”์ฐํ•˜๋‹ค.


์‹ค์ œ๋กœ๋Š” ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด

์šฐ๋ฆฌ๋ฅผ ๋งž์ดํ•ด์ฃผ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ๋‹ค.

ํ”„๋ก ํŠธ ๋ฐ์Šคํฌ๊ฐ€ ๊ทธ๋Ÿฐ ์—ญํ• ์„ ํ•˜๊ฒ ์ง€?


ํ”„๋ก ํŠธ ๋ฐ์Šคํฌ์— ์‹ ๋ถ„์ฆ์„ ์ œ์‹œํ•˜๊ณ  ๋ณด๋‚ผ ๋ฌผ๊ฑด๋“ค๊ณผ ๋„์ฐฉ์ง€๋ฅผ ๊ฑด๋‚ด์ฃผ๋ฉด

์•Œ์•„์„œ ์ง์›์ด ์‹ ์›ํ™•์ธ, ๊ฒฐ์ œ, ํƒ๋ฐฐ์‚ฌ ์ง€์ •, ๋‹ด๋‹น ๊ธฐ์‚ฌ ์ง€์ • ๋“ฑ๋“ฑ ๋‹ค ํ•ด์ค€๋‹ค

(์‹ ์›ํ™•์ธ์€,, ์Œ ๊ทธ๋ƒฅ ํ•œ๋‹ค๊ณ  ํ•˜์ž!)

์•„๋ฌดํŠผ, ์ด์ฒ˜๋Ÿผ ์šฐ๋ฆฌ๋ฅผ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ๋‹ค. ์ด๊ฒŒ Facade๋‹ค

๋’ท ๊ธฐ๋Šฅ์„ ์ด์šฉ์„ ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๋กœ์„  ๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ๋งŒ ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ ๋’ค์— ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€๋Š” ๋ชฐ๋ผ๋„ ๋œ๋‹ค.


์ฝ”๋“œ ์ ์šฉ


์ด๊ฒƒ์„ ์กฐ๊ธˆ๋” ๋‹จ์ˆœํ™” ํ•ด๋ณด์ž

โ€œ๋‚˜๋Š” A, B, C๋ผ๋Š” ์ •๋ณด๋ฅผ ์ด์šฉํ• ๊ฑฐ์•ผ, ๋จผ์ € B๋กœ๋Š” ์ด๊ฑฐ๋ฅผ ํ•œ๋‹ค์Œ์— A๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋๋‚˜๋ฉด C์ •๋ณด๋ฅผ ์ด์šฉํ•ด์„œ ๋งˆ๋ฌด๋ฆฌ๋ฅผ ์ง€์–ด!โ€

์ด๊ฒƒ์€ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  1. ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ถ€๋ถ„
  2. ์ •๋ณด๋ฅผ ์ด์šฉํ•˜๋Š” ๋ถ€๋ถ„

๊ทธ๋ฆฌ๊ณ , 2์— ๋Œ€ํ•ด์„  ๋Œ€์‹  ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์žˆ์–ด์•ผ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„  ํŽธํ•˜๋ฏ€๋กœ

์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ•ด๋ณด์ž.

  1. Facade๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •๋ณด๋ฅผ ์ œ๊ณต


์†Œ์Šค์ฝ”๋“œ ์ƒ์œผ๋กœ๋„ ํ› ์–ด์–ผ์”ฌ ๊น”๋”ํ•ด์ง€๊ฒ ์ง€?

์ฝ”๋“œ๋กœ ํ•œ๋ฒˆ ๋ด๋ณด์ž (๋ง๋„ ์•ˆ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์“ธ ์˜ˆ์ •, ๋Š๋‚Œ๋งŒ ์•Œ์ž ใ… )

์šฐ์„  a,b,c๋กœ ์ด๋Ÿฐ ์•ก์…˜๋“ค์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

func aAction(item: Int) {
    print(item)
}

func bAction(item: [Int], handler: (()->())) {
    print(item)
    handler()
}

func cAction(item: String) {
    print(item)
}

๊ทธ๋ฆฌ๊ณ 

  1. ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ถ€๋ถ„
  2. ์ •๋ณด๋ฅผ ์ด์šฉํ•˜๋Š” ๋ถ€๋ถ„

๋ฅผ ์ฝ”๋“œ๋กœ ๋ณด์ž

// ์ œ๊ณตํ•  a,b,c
let a = 1
let b = [1,2,3]
let c = "String!"

// ๋จผ์ € B๋กœ ์ด๊ฑฐ ํ•˜๊ณ !
bAction(item: b) {
    // ๊ทธ ๋‹ค์Œ์— A ํ•˜๊ณ !
    aAction(item: a)
    // ๊ทธ๋ฆฌ๊ณ  C๋กœ ํ•ด!
    cAction(item: c)
}

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ œ๊ณตํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๋กœ์ง์— ๋Œ€ํ•ด์„œ๋„ ๋น ์‚ญํ•˜๊ฒŒ ์•Œ์•„์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๊ฒŒ ๋‹จ์ˆœํ•ด์„œ ๊ทธ๋ ‡์ง€, ์ •๋ง ์ •๋ง ์ •๋ง ๋ณต์žกํ•˜๊ณ  ๋ณต์žกํ•œ๊ฑฐ๋ผ๋ฉด? ์˜ค ๋”์ฐํ•˜๋‹ค.


๊ทธ๋ž˜์„œ Facade๋ฅผ ๋„์ž…ํ•ด๋ณด์ž.

struct HotelFacade {
    let a: Int
    let b: [Int]
    let c: String
    
    func doIt() {
        // ๋จผ์ € B๋กœ ์ด๊ฑฐ ํ•˜๊ณ !
        bAction(item: b) {
            // ๊ทธ ๋‹ค์Œ์— A ํ•˜๊ณ !
            aAction(item: a)
            // ๊ทธ๋ฆฌ๊ณ  C๋กœ ํ•ด!
            cAction(item: c)
        }
    }
}

์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์€ ๊ตฌ์กฐ์ฒด๋‹ˆ๊นŒ ์•Œ์•„์„œ ๋ฉค๋ฒ„์™€์ด์ฆˆ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์ด ์ž‘์„ฑ๋ ํ…Œ๋‹ˆ ๋”ฐ๋กœ ์ž‘์„ฑ์•ˆํ•˜๊ณ ,

ํ•จ์ˆ˜๋Š” doIt()์ด๋ผ๋Š” ๊ฒƒ๋งŒ ์žˆ๋‹ค.


์ด์ œ ์ด๊ฒƒ์„ ๋ฐ˜์˜ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

// ์ œ๊ณตํ•  a,b,c
let a = 1
let b = [1,2,3]
let c = "String!"

// ์ •๋ณด ์ค„๊ฒŒ
let hotelFacade = HotelFacade(a: a, b: b, c: c)

// ์ค€๋น„ ๋์–ด? ํ•ด์ค˜ ใ…  ๋‚œ ๊ฐˆ๊ฒŒ!
hotelFacade.doIt()

์ด๋Ÿฐ ๊ฒƒ์ด๋‹ค!


๊ฒฐ๋ก 


์ด์ œ ์ข€ ๊ณ ๊ธ‰์ง€๊ฒŒ ์„ค๋ช…ํ•ด๋ณด์ž

ํผ์‚ฌ๋“œ ํŒจํ„ด์€ ๋‹ค๋ฃจ๊ธฐ ๊นŒ๋‹ค๋กœ์šด ๋กœ์ง๋“ค์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋•Œ ์‚ฌ์šฉ์ž๋Š” ๋ณต์žกํ•œ ๋กœ์ง์„ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค.


์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์žฅ์ ์€ ๋ฌด์—‡์ผ๊นŒ?

๊นŒ๋‹ค๋กœ์šด ๋กœ์ง๋“ค์ด ๋ณต์žกํ•ด์ง€๋”๋ผ๋„ ์‚ฌ์šฉ์ž๋Š” (์ฝ”๋“œ์ƒ) ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

์ฆ‰ ์ข…์†์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ๊ทธ์— ๋”ฐ๋ผ์˜ค๋Š” ์ด์ ์€ ๋˜ ๋ญ๊ฐ€ ์žˆ์„๊นŒ?

๋ฐ”๋กœ ์žฌ์ปดํŒŒ์ผ์ด ํ•„์š”์—†๋‹ค๋Š” ์ ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋นŒ๋“œ ์†๋„๋„ ์กฐ๊ธˆ์€ ๋‚˜์•„์ง€๊ฒ ์ง€?


์ด๊ฒƒ์ด Facade ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์ด๋‹ค!

๋!