본문 바로가기

웹개발 - Back 관련/Architecture

[ GOF ] 파사드 패턴 - Facade Pattern with Kotlin

Topic =  Facade 패턴의 의도와 개념에 대해서 정리해보기

 

🔑 Purpose

  • 복잡한 서브시스템의 단순화 ⇒ 구성과 사용의 분리
    • 여러 개의 객체가 복잡하게 상호작용 하는 경우, 이러한 상호작용을 관리하는 하나의 간단한 객체로 분리하여 클라이언트 단에서 복잡한 상호작용을 제어하지 않고 파사드 객체를 통해 기능을 간단하게 사용할 수 있다.

왜 Facade 패턴을 사용해야 할까?

 

 

[ 요구사항 ]

  1. 주문 요청 로직
  2. 결제 로직
  3. 관리자 - 신규 주문 알림

[ Facade 패턴 미적용 예시 코드 ]

class Order {
    fun startOrder() {
        // 주문 요청 로직
    }
}

class Purchase {
    fun startPurchase() {
        // 결제 로직
    }
}

class OrderMessage {
    fun sendNewOrderMessage() {
        // 신규 주문 알림 로직
    }
}

fun main () {
    val order = Order()
    val purchase = Purchase()
    val orderMessage = OrderMessage()

    fun newOrder() {
        order.startOrder()
        purchase.startPurchase()
        orderMessage.sendNewOrderMessage()
    }
}
  • main 함수, 즉 클라이언트 단에서 여러 객체 메서드를 제어하는 모습이다.

 

[ Facade 패턴 적용 예시 코드 ]

class Order {
    fun startOrder() {
        // 주문 요청 로직
    }
}

class Purchase {
    fun startPurchase() {
        // 결제 로직
    }
}

class OrderMessage {
    fun sendNewOrderMessage() {
        // 신규 주문 알림 로직
    }
}

class OrderService(
    private val order: Order,
    private val purchase: Purchase,
    private val orderMessage: OrderMessage
    ) {
    
    fun startOrderProcess() {
        order.startOrder()
        purchase.startPurchase()
        orderMessage.sendNewOrderMessage()
    }
}

fun main () {

    val order = Order()
    val purchase = Purchase()
    val orderMessage = OrderMessage()

    val orderService = OrderService(order,purchase,orderMessage)

    fun newOrder() {
        orderService.startOrder()
    }
}
  • 클라이언트 단에서는 startOrder 메서드만 사용하게 된다.

 

🧹정리

Facade 패턴을 적용했을 때, 단순히 코드가 더 복잡해져 보일 수 있다. 하지만, 일반적인 웹, 앱 애플리케이션 서비스의 경우 하나의 화면에는 다양한 기능들로 구성되어져 있다. 때문에 클라이언트 단 ( 예시 코드의 main 함수 ) 의 코드가 더 많아지게 된다.

 

클라이언트 단 내부에서 여러 클래스 객체의 상호작용을 제어하는 경우, 비동기 관리 등 객체들의 상호작용에 대한 제어의 책임이 생기게 된다. 즉, 단일 책임 원칙을 위반하면서 클라이언트 단의 코드가 비대지므로 유지보수성 저하, 코드의 가독성 저하 등의 문제를 초래한다.

 

Facade 패턴은 단순히 클라이언트 단에 존재하는 여러 클래스 상호작용을 별도의 클래스나 인터페이스로 분리하는 것으로 매우 간단한 패턴.

 

GOF에 대해서 학습할 때 가장 먼저 접하게 된 패턴이다. 네이밍도 파사드로 정의되어서 익숙치 않은 네이밍이라 뭔가 대단한 게 있을 줄 알았던 패턴이었지만, 단순하게 클라이언트 단에서의 실행되는 여러 기능들의 구성을 별도로 분리하는 것이다.

 

 

 

 

 

 

 


 

[ A. 오늘 복습한 내용 / B. 다음에 학습할 내용 ]

A. GOF 정리하며 기본기 다지기...

 

B.브릿지 패턴

 

 

 

 


[Reference]