ํ Roam Research๋ ZettelKasten ๋ ๋งค๋ ฅ์ ์ธ๋ฐ ์ด๋ ค์ใ ๊ธ ์ ๋ฆฌํ ๊ฒ ๋๋ฌด ๋ง์์ก๋ค.
์๊ฐ๊ณผ ์๊ฐ์ ์ฐ๊ฒฐํ๋ ์ฃผ์ ๋ ๋๋ฌด ๋ง์์ง๊ณ ์๋ค.
์ฌ์กฑ์ ๊ทธ๋งํ๊ณ , ์ค๋์ ์ฃผ์ ๋ Facade Pattern ์ด๋ค.
SOLID ์์น์ ํด๋ณด๋ ค ํ๋๋ฐ, ๊ธ์ ์ฐ๋ ค๋ฉด ์ด๊ฒ ๋จผ์ ๋์ด์ผ ํ ๊ฒ ๊ฐ์๋ค.
์ฐ์ Facade
๋ผ๋ ๋ง์ ๋ป์ ๋จผ์ ๋ณด์
- ํ๊ธ: ์ ๋ฉด
- ์์ด ์ค๋ช : The face or front of building
๋ญ๊ฐ๊ฐ ๋จผ์ ๋ค๋ฅผ ์๊ธฐ์ ์ ๋ง์ด๋ฅผ ํ๋ ์ญํ ์ ํ๋ค๋ ๊ฒ์ด๋ค.
์ด ๊ธ์ ๋ณด๊ฒ ๋๋ฉด ์๋ง
์ด๊ฒ ์ด๋ฆ์ด Facade๊ฐ ๋ ์ ๋ฐ์ ์๊ตฌ๋! ์ฐฐ๋ก์ด๋ค! ์ถ์ ๊ฒ์ด๋ค
์์
์ ๋นํ ์๋ก ๋ด๊ฐ ํ๋ฐฐ๋ฅผ ๋ถ์ด๋ฌ ์ฐ์ฒด๊ตญ์ด๋ ํธ์์ ์ ๊ฐ๋ค๊ณ ํด๋ณด์.
๊ทธ๋ฆฌ๊ณ ์ ๋ถ์ฆ๊ณผ ์ฌ๋ฌ๊ฐ์ ๋ฌผ๊ฑด์ ๊ฐ์ง๊ณ ์๋ค.
๊ทผ๋ฐ ๋๋๋ฌ ์์์ ์ ์ ํ์ธํ๊ณ ,
์นด๋๋ก ํ ์ง ํ๊ธ์ผ๋ก ํ ์ง ์์์ ๊ฒฐ์ ํ๊ณ
์์์ ํ๋ฐฐ์ฌ๋ ์ง์ ํ๊ณ
๋ฐฐ์ก ๋ด๋น ์ง์ ๋ ๋๊ฐ ํด ๋ผ๊ณ ํ๋ค๋ฉด ์ด๋จ๊น?
์์๋งํด๋ ๋์ฐํ๋ค.
์ค์ ๋ก๋ ์๋น์ค๋ฅผ ์ด์ฉํ๊ธฐ ์ํด
์ฐ๋ฆฌ๋ฅผ ๋ง์ดํด์ฃผ๋ ์ฌ๋๋ค์ด ์๋ค.
ํ๋ก ํธ ๋ฐ์คํฌ๊ฐ ๊ทธ๋ฐ ์ญํ ์ ํ๊ฒ ์ง?
ํ๋ก ํธ ๋ฐ์คํฌ์ ์ ๋ถ์ฆ์ ์ ์ํ๊ณ ๋ณด๋ผ ๋ฌผ๊ฑด๋ค๊ณผ ๋์ฐฉ์ง๋ฅผ ๊ฑด๋ด์ฃผ๋ฉด
์์์ ์ง์์ด ์ ์ํ์ธ, ๊ฒฐ์ , ํ๋ฐฐ์ฌ ์ง์ , ๋ด๋น ๊ธฐ์ฌ ์ง์ ๋ฑ๋ฑ ๋ค ํด์ค๋ค
(์ ์ํ์ธ์,, ์ ๊ทธ๋ฅ ํ๋ค๊ณ ํ์!)
์๋ฌดํผ, ์ด์ฒ๋ผ ์ฐ๋ฆฌ๋ฅผ ํธํ๊ฒ ํด์ฃผ๋ ์ฌ๋๋ค์ด ์๋ค. ์ด๊ฒ Facade
๋ค
๋ท ๊ธฐ๋ฅ์ ์ด์ฉ์ ํ์ง๋ง ์ฌ์ฉ์๋ก์ ๋จ์ํ ๊ธฐ๋ฅ๋ง ํ์ํ ์ ๋ณด๋ง ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
๊ทธ ๋ค์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง๋ ๋ชฐ๋ผ๋ ๋๋ค.
์ฝ๋ ์ ์ฉ
์ด๊ฒ์ ์กฐ๊ธ๋ ๋จ์ํ ํด๋ณด์
โ๋๋
A
,B
,C
๋ผ๋ ์ ๋ณด๋ฅผ ์ด์ฉํ ๊ฑฐ์ผ, ๋จผ์ B
๋ก๋ ์ด๊ฑฐ๋ฅผ ํ๋ค์์A
๋ฅผ ์คํํ๊ณ ๋๋๋ฉดC
์ ๋ณด๋ฅผ ์ด์ฉํด์ ๋ง๋ฌด๋ฆฌ๋ฅผ ์ง์ด!โ
์ด๊ฒ์ ๋๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
- ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ถ๋ถ
- ์ ๋ณด๋ฅผ ์ด์ฉํ๋ ๋ถ๋ถ
๊ทธ๋ฆฌ๊ณ , 2์ ๋ํด์ ๋์ ํด์ฃผ๋ ๊ฒ์ด ์์ด์ผ ์ฌ์ฉ์ ์ ์ฅ์์ ํธํ๋ฏ๋ก
์ด๋ ๊ฒ ์์ ํด๋ณด์.
Facade
๋ฅผ ์ด์ฉํ์ฌ ์ ๋ณด๋ฅผ ์ ๊ณต
์์ค์ฝ๋ ์์ผ๋ก๋ ํ ์ด์ผ์ฌ ๊น๋ํด์ง๊ฒ ์ง?
์ฝ๋๋ก ํ๋ฒ ๋ด๋ณด์ (๋ง๋ ์๋๋ ์ฝ๋๋ฅผ ์ธ ์์ , ๋๋๋ง ์์ ใ )
์ฐ์ a,b,c๋ก ์ด๋ฐ ์ก์ ๋ค์ ํ ์ ์๋ค.
func aAction(item: Int) {
print(item)
}
func bAction(item: [Int], handler: (()->())) {
print(item)
handler()
}
func cAction(item: String) {
print(item)
}
๊ทธ๋ฆฌ๊ณ
- ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ถ๋ถ
- ์ ๋ณด๋ฅผ ์ด์ฉํ๋ ๋ถ๋ถ
๋ฅผ ์ฝ๋๋ก ๋ณด์
// ์ ๊ณตํ 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
ํจํด์ ์ฌ์ฉํ๋ ์ด์ ์ด๋ค!
๋!