설계패턴 14. Facade Pattern

LSDrug·2024년 6월 11일

설계패턴(完)

목록 보기
14/26

1. 정의

점점 커지는 경향으로 많은 클래스가 서로 관계를 맺으며 복잡하게 되는 클래스를 적절히 제어하기 위한 창구 역할을 하는 별도의 고수준 인터페이스를 두는 패턴을 의미한다.

'건물의 앞면을 의미하는 것처럼 그 뒤쪽의 복잡함은 내부에 숨기고 간단한 인터페이스만 제공하는 패턴이다.

이때, Client는 여러 라이브러리와 클래스를 필요로 하는 상태이다. 이런 경우, 여러 클래스나 라이브러리를 조합해서 더 간단한 인터페이스를 제공해주는 클래스(Facade Pattern)를 만들 수 있다.

Client는 복잡한 클래스와 라이브러리를 상대할 필요 없이 간단한 인터페이스를 제공하는 해당 패턴을 사용해서 더 쉽게 개발할 수 있다.

해당 패턴은 데이터 처리를 하는 곳에 자주 쓸 수 있다.

2. 역할

  • Facade는 복잡한 것을 단순하게 보여준다.
  • 핵심은 인터페이스를 적게 하는 일이다. 클래스나 메소드가 많이 보이면, 프로그래머는 무엇을 사용하면 좋을지 망설이게 되고, 호출하는 순서에도 주의 해야만 한다. 이는 곧, 틀리기 쉽다는 것을 의미한다.

3. 재귀적 사용

해당 패턴은 재귀적으로 사용이 가능하다.

상당히 큰 시스템이 다수의 클래스, 다수의 패키지를 포함하고 있을 때, 요소요소에 Facade 패턴을 적용하면 시스템은 보다 편리하게 관리될 수 있다.

4. 프로그래머가 Facade를 만들지 않는 심리적 요인

  • 복잡한 프로그램 내부를 숙지하고 있는 프로그래머는 Facade 역할을 만들고 싶어하지 않으며, 무의식적으로 피하는 것일 수 있다.

  • 숙련된 프로그래머의 머리 속에는 시스템의 내용이 모두 들어있고 많은 클래스의 상호관계를 손에 잡힐 듯 알고 있기 때문일지도 모른다. 또른 자신의 기술을 자랑하며 다른 프로그래머에게 '아는 척' 하고 싶을 수도 있다.

  • 어떤 프로그래머가 'A 클래스를 호출하기 전에는 B를 호출하고, B를 호출하기 전에는 C에 등록해둘 필요가 있다'는 식의 말을 한다면 이는 Facade 패턴을 도입할 필요가 있다는 것을 시사하고 있다.

  • 확실하게 언어로 표현할 수 있는 노하우는 프로그래머에 머리 속에 숨겨두는 것이 아니라 코드로서 표현해야 하는 것을 시사한다.

5. 예시

  • 우주로켓을 만들어보자. Stage1, Stage2, Capsule이 있고 우주선 목적지까지 보낼 때 복잡한 과정이 필요하다.
  • Stage1: 점화, 이륙, 분리
  • Stage2: 점화, 분리
  • Capsule: 점화, 착륙의 과정

이를 Facade Pattern으로 사용한 코드는 다음과 같다.

class Stage1:
  def ignite(self):
    print('1st stage ignation')
  def liftOff(self):
    print('1st stage liftOff')
  def eject(self):
    print('1st stage eject')
  def comeBack(self):
    print('1st stage return')

class Stage2:
  def ignite(self):
    print('2nd stage ignition')
  def eject(self):
    print('2nd stage eject')

class Capsule:
  def ignite(self):
    print('capsule ignition')
  def landing(self):
    print('capsule landing/deploy')

class Rocket:
  def __init__(self):
    self.stage1 = Stage1()
    self.stage2 = Stage2()
    self.capsule = Capsule()

  def launch(self):
    self.stage1.ignite()
    self.stage1.liftOff()
    self.stage1.eject()
    self.stage2.ignite()
    self.stage1.comeBack()
    self.stage2.eject()
    self.capsule.ignite()
    self.capsule.landing()

rocket = Rocket()
rocket.launch()

profile
마약같은 코딩, 마약같은 코딩러

0개의 댓글