Facade

DongHeon·2022년 11월 29일
0

디자인 패턴

목록 보기
9/12

오늘은 Facade 패턴에 대해 알아보겠습니다.

Facade 패턴은 저도 모르게 많이 사용하고 있었습니다.

Facade?

Facade 패턴은 내부의 layer를 숨기기 위해 사용하는 패턴입니다.

우리는 평소에 라이브러리나 프레임워크를 사용해 개발을 합니다. 라이브러리를 사용하다 보면 다양한 객체들의 관계를 파악하고 사용해야 합니다. 즉 객체들의 관계 메서드의 순서에 주의해 사용해야 합니다.

UML을 보면 알겠지만 Client 입장에서는 사용하는 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화 할 수 있습니다.

코드

패턴 적용 전

Swift의 Foundation 프레임워크 내부에는 날짜를 확인하기 위해서는 Date, DateFormatter, TimeZone, Locale 등 여러 타입들을 사용해야 합니다.

아래 작성하는 코드는 예시입니다. 반드시 아래 모든 타입들이 필요하지 않습니다.

import Foundation

class Client {
    func checkToday() {
        let date = Date()
        let formatter = DateFormatter()
        formatter.dateStyle = .long
        formatter.timeStyle = .medium
        formatter.timeZone = TimeZone(identifier: "Asia/Seoul")
        formatter.locale = Locale(identifier: "ko_KR")
        print(formatter.string(from: date))
    }
}

현재 대한민국 시간을 알기 위해서는 위와 같은 코드를 작성해야 합니다. 현재 시간을 알기 위해 Date, DateFormatter, TimeZone, Locale 타입을 생성하고 formatterdateStyle, timeStyle, timeZone, locale을 설정해 주어야 합니다.

Client는 4가지 객체에 대한 관계를 확인하고 생성해 사용해야 합니다. 만약 더 복잡한 라이브러리나 프레임워크를 사용해야 한다면 그때마다 복잡한 과정을 거쳐 사용해야 합니다.

패턴 적용

  • Facade
final class DateFormatterManager {
    private let formatter = DateFormatter()
    
    var dateFormatter: DateFormatter {
        self.formatter.timeStyle = .medium
        self.formatter.dateStyle = .long
        return formatter
    }
    
    func checkKoreaTime() -> String {
        let date = Date()
        self.dateFormatter.timeZone = TimeZone(identifier: "Asia/Seoul")
        self.dateFormatter.locale = Locale(identifier: "ko_KR")
        
        return dateFormatter.string(from: date)
    }
}

DateFormatterManager를 생성해 복잡한 과정들을 따로 관리할 수 있습니다. 그렇다면 Client에서는 DateFormatterManager만 알고 있다면 쉽게 현재 시간을 알 수 있습니다.

  • Client
class Client {
    let manager = DateFormatterManager()
    
    func checkToday() {
        print(manager.checkKoreaTime())
    }
}

Facade 패턴을 사용하면 추상화한 인터페이스만 알고 있다면 쉽게 사용할 수 있습니다. 또 한 시간을 확인해야 하는 코드가 여러 곳에서 필요하다면 그때마다 많은 타입을 생성하지 않고 추상화한 타입만 생성해 사용하면 되기 때문에 재사용 측면에서 유리하다고 생각합니다.

장단점

  • 장점
    1. 서브 시스템에 대한 의존성을 한곳으로 모을 수 있다.
    2. 코드의 가독성이 좋아진다.

  • 단점
    1. Facade 클래스가 서브 시스템에 대한 모든 의존성을 가지게 된다.
    2. 서브 시스템에 대한 이해가 필요하다.

해당 글은 인프런의 코딩으로 학습하는 GoF 디자인 패턴 강의를 참고해 작성했습니다.

⭐️ 부족하거나 잘못된 부분이 있다면 댓글은 언제나 환영입니다!! ⭐️

참고 자료
Refactoring.Guru

0개의 댓글