[Design Pattern] 퍼싸드 패턴, Facade Pattern

nnnyeong·2021년 6월 15일
1

DesignPattern

목록 보기
6/9

오늘은 퍼싸드 패턴이오~!

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 만을 통해서 이용하면 되니까~?


퍼싸드 패턴 끄읏~!




참고자료 1
참고자료 2

profile
주니어 개발자까지 ☄️☄️

1개의 댓글

comment-user-thumbnail
2023년 4월 20일

비유적으로 표현하니 이해하기 편하네요 :)

답글 달기