halang-log
🧵 Design Pattern

디자인 패턴 - Adapter 패턴과 Facade 패턴

date
Oct 22, 2022
slug
adapter-pattern-facade-pattern
author
status
Public
tags
디자인패턴
Adapter 패턴
Facade 패턴
summary
Adapter 패턴과 Facade 패턴에 대해 알아보자
type
Post
thumbnail
category
🧵 Design Pattern
updatedAt
Nov 22, 2023 01:14 AM
언어

개요

소프트웨어 마에스트로 과정에서 멘토님, 팀원들과 디자인패턴 세미나를 진행하고 있습니다. 이번에는 Adapter 패턴과 Facade 패턴에 대해 설명드리겠습니다.
💡 헤드퍼스트 디자인패턴 책을 참고하여 포스팅하였습니다.

어댑터?

notion image
어댑터는 우리 주변에서도 쉽게 볼 수 있습니다. 한국에서 사용하던 충전기를 해외에서 사용하려면 플러그 모양을 바꿀 어댑터가 필요합니다. 이처럼 어댑터는 내가 가지고 있는 인터페이스를 다른 곳에 적용할 인터페이스로 바꿔 주는 역할을 합니다.

Adapter Pattern이란?

Adapter Pattern은 이미 제공되어 있는 것과 필요한 것 사이의 차이를 없애주는 디자인 패턴입니다. 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환합니다. Wrapper 패턴이라고도 부릅니다.
notion image
위 사진처럼 클라이언트에서는 Target Interface를 호출하는 것처럼 보입니다. 하지만 클라이언트의 요청을 받은 Adapter는 자신이 감싸고 있는 Adaptee에게 실질적인 처리를 위임합니다. Adapter가 Adaptee를 감싸고 있는 것 때문에 Wrapper 패턴이라고도 불립니다.

Adapter Pattern 예시

notion image
어댑터 패턴을 실제 사용하는 예시를 들어보겠습니다.
어떤 회사에서 파일 읽기 코드를 개발했습니다. 레거시 코드(옛날 버전의 코드들)가 너무 많아 다시 개발을 했었는데 갑자기 알 수 없는 곳에서 에러가 생겼습니다. 결국 기존 시스템을 사용하기 위해 어댑터를 사용합니다. 이처럼 기존 시스템의 인터페이스를 바꾸는 것이 힘들 경우가 생깁니다. 결국 어댑터 패턴은 프로그램의 완결성은 높지만 재사용성은 떨어질 때 사용합니다.

Adapter Pattern 등장인물

notion image
  1. ClientTarget 역할의 메소드를 사용해서 일을 합니다.
  1. TargetClient는 Target을 통해 Adaptee를 사용할 수 있습니다. 또한 지금 필요한 메소드를 결정합니다.
  1. Adapter
    1. Client가 사용하려는 Target Interface와 Adaptee 중간에서 둘을 연결해주는 역할입니다.
      Adaptee 역할의 메소드를 사용해서 어떻게든 Target 역할을 만족시키기 위한 것이 Adapter 패턴의 목적입니다.
  1. Adaptee
    1. 이미 준비되어 있는 메소드를 가지고 있는 역할입니다.

Facade Pattern?

이번엔 비슷하지만 조금 다른 패턴을 배워봅시다. (참고로 facade란 겉모양이나 외관 이라는 뜻입니다)
지금까지 어댑터 패턴을 사용하여 어떤 클래스의 인터페이스를 클라이언트가 원하는 인터페이스로 변환하는 방법을 배웠습니다. 이번에 배울 퍼사드 패턴은 비슷하지만 다른 목적으로 인터페이스를 변경합니다.
우선 퍼사드 패턴이란 서브시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어주는 역할을 하며 서브시스템을 더 편리하게 사용하기 위해 사용합니다.
notion image
예를 들어, 홈시어터를 구축한다고 가정해봅시다. 스트리밍 플레이어, 프로젝터, 자동 스크린, 서라운드 음향, 그리고 팝콘 기계까지 갖춘 시스템을 구성해 두었습니다. 이들은 클래스가 굉장히 많으며 서로 복잡하게 얽혀있습니다. 영화를 보려면 굉장히 많은 작업들을 처리해주어야 합니다. 이런 복잡한 일을 퍼사드 패턴으로 간단하게 처리할 수 있습니다.
notion image
이로써 클라이언트는 서브시스템이 아닌 홈시어터 퍼사드에 있는 메소드를 호출할 수 있습니다.
사용자는 watchMovie()만 호출하면 조명, 스트리밍 플레이어, 프로젝터 등이 알아서 준비됩니다.

결론

  1. 퍼사드 패턴은 main이 쉽게 프로그래밍 하기 위해 사용합니다.
  1. 퍼사드 패턴에서 이야기하는 서브시스템(sybsystem)은 써드파티 모듈이나 다른 패키지를 말합니다. (넓은 단위로 봐야 합니다.) 예를 들어, 오픈 소스를 사용하면서 버전업 할 때마다 이를 반영해야 한다면 퍼사드 패턴을 이용해 귀찮은 일들을 덜어줄 수 있습니다.
  1. 이렇게 퍼사드는 써드파티에 대해 단순화 시키면서 운영 책임을 가지게 됩니다. 따라서 클라이언트는 써드파티의 복잡도를 모르고 운영해도 문제가 되지 않습니다.
  1. 어댑터 같은 경우 기능이 바뀌었고 버전업이 되었는데 과거 레거시 코드를 바꾸는 행위가 리스크가 있을 때 어댑터로 새로운 기능으로 전환할 때 사용합니다.