오늘은 퍼싸드 패턴이오~!
3학년 1학기 패턴 수업을 들을 때 Facade Pattern 이라는 단어를 처음 보고 '패케이드 패턴? 그게 뭐람?' 이라고 읽었던 기억이 난닼ㅋㅋㅋㅋ
저렇게 읽자 마자 교수님이 "자 오늘은 퍼싸드 패턴에 대해서~" 라고 하셔서 내적 민망함,, 있었는데ㅋㅋㅋㅋ 머 암튼
퍼싸드 패턴은, 'Facade' 라는 단어로 그 의도와 형태가 쉽게 유추되는 패턴이다!
Facade : 퍼사드란, 프랑스어 Façade 에서 유래된 단어로 건물의 외관이라는 뜻을 가지고 있습니다. 건물의 외벽에서 보면 안의 구조는 보이지 않습니다.
마치 커다란 경복궁을 크게 감싸고 있는 광화문과 그 성벽? 처럼 내부의 다양한 서브 시스템들을 감싸 클라이언트에게 인터페이스를 제공하여 쉽게 접근, 사용할 수 있도록 하는 패턴이다!
세탁기를 떠올려 보자!
빨래를 하려 할 때 우리는 드럼통 문을 열고, 빨래를 넣고, 세제 좀 넣고, 버튼을 눌러 디리링~ 하는 소리와 함께 빨래를 시작한다
정확히 말하면 빨래는 저 친구가 할 뿐 우리는 제공되어 있는 편한 인터페이스를 몇가지 건드릴 뿐이다!
근데 사실 저 버튼을 누른다고 빨래가 되는가?!
버튼을 누르면 물이 나올것이고, 세제가 들어갈 것이고, 드럼통이 신나게 돌아가고, 딴 따라라라 따라라 따라라라 딴 따라라라 따안 따라라따라라라~ 하는 소리를 내어 빨래가 다 되었다고 알려주면! 우리는 이 모든 과정을 '빨래를 했다' 라고 말하겠지
(설명이 너무 거창하다면 미안합니다,,ㅎ)
이처럼, 물이 나오고, 세제를 섞고, 돌리고 하는 복잡한 내부 과정들을 알 필요 없이 이 모든 과정들을 하나의 큰 인터페이스로 감싸 (wrap) 외부의 간단한 인터페이스로 제공하여 클라이언트는 이 외부 인터페이스만을 이용해 내부의 복잡한 메소드를 사용할 수 있도록 한 것이 퍼싸드 패턴 이다!!
코드를 통해 좀 더 확실히 이해해보자!
// 세탁 세제 퍼씰
class Persil {
func goOut(about : Int) -> Void {
print("persil \(about)g is going out~")
}
}
// 물
class Water {
func flow(about : Int) -> Void {
print("water \(about)ml is flowing out~")
}
}
// 드럼통
class Drum {
func startWorking(rate : Int) -> Void {
print("drum starts working with rate \(rate)!")
}
func stopWorking() -> Void {
print("drum stops working!")
}
}
만약 제공되는 인터페이스가 없다면 우리는 직접 water, persil, drum 객체를 각각 다루며 물을 뿌리고 (water.flow(1000)), 세제를 뿌리고 (persil.goOut(30)), 드럼을 돌려(drum.startWorking(30)) 세탁을 해야 할 것이다!
하지만 이를 커다란 인터페이스 Washer 로 감싸 보면,
class Washer {
private var water : Water!
private var persil : Persil!
private var drum : Drum!
init(water : Water, persil : Persil, drum : Drum) {
self.water = water
self.persil = persil
self.drum = drum
}
func On(w : Int, p : Int, d : Int) -> Void {
print("표준 세탁을 시작합니다~")
water.flow(about: w)
persil.goOut(about: p)
drum.startWorking(rate: d)
}
func complete() -> Void {
drum.stopWorking()
print("세탁이 완료되었습니다~")
}
}
사용자는 버튼 하나만을 간단히 눌러 (washer.on()) 세탁기를 돌리고 눈누난나 유툽을 보며 세탁이 다되기를 기다리면 되는 것이다!
코드를 실행시켜 보면,
let washer = Washer(water: Water(), persil: Persil(), drum: Drum())
washer.on(w: 2000, p: 50, d: 40)
washer.complete()
야무지게 돌아가는 세탁기!
예시를 생각하다보니 우리가 사용하는 모든 가전, 전자제품, 뭐 이것저것 다! 퍼싸드로 감싸져 있구나~ 싶어서 새삼 신기했당 ㅎ
퍼싸드 패턴은 클라이언트 어플리케이션의 헬퍼 역할을 하는 것이지, 서브시스템 인터페이스를 숨기는 것은 아니다!
서브 시스템도 필요하면 접근이 당연히 가능하겠지!
퍼사드 패턴은 특정 기능에 대해 인터페이스의 수가 확장되고 시스템이 복잡해질 수 있는 상황에서 사용하기 적합하다!
만약 세제 종류가 늘어난다거나, 건조기능이 추가 된다거나 해도, 클라이언트는 동일하게 washer 만을 통해서 이용하면 되니까~?
퍼싸드 패턴 끄읏~!
비유적으로 표현하니 이해하기 편하네요 :)