핵심 인사이트 (3줄 요약)

  • 인터페이스 호환성 해결: 서로 다른 인터페이스를 가진 두 객체 사이에서 중간 다리 역할을 하여, 기존 코드를 수정하지 않고도 함께 동작하게 만든다.
  • 재사용성 극대화: 이미 검증된 레거시 시스템이나 외부 라이브러리를 새로운 시스템 규격에 맞춰 손쉽게 재사용할 수 있게 한다.
  • 클라이언트와 구현의 분리: 클라이언트는 어댑터가 제공하는 단일화된 인터페이스만 알면 되므로 결합도가 낮아진다.

Ⅰ. 개요 (Context & Background)

어댑터 패턴은 구조 패턴(Structural Patterns) 중 하나로, 실생활의 220V 전원 어댑터(돼지코)와 유사한 개념이다. 소프트웨어 설계에서 특정 인터페이스를 사용하는 클라이언트가 다른 인터페이스를 제공하는 클래스를 사용하고 싶을 때, 중간에 변환기(Adapter)를 두어 연결하는 방식이다.

Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)

어댑터 패턴은 크게 '클래스 어댑터'와 '객체 어댑터' 두 가지 방식으로 나뉜다. 실무에서는 다중 상속의 제약이 없는 **객체 어댑터(합성/위임 방식)**가 더 널리 사용된다.

[ Architecture of Object Adapter Pattern ]

+----------------+       +-------------------------+
|   Client       |------>|   Target (Interface)    |
+----------------+       +-------------------------+
|                |       | + request()             |
+----------------+       +-------------------------+
                                    ^
                                    | (Implements)
                         +-------------------------+       +-------------------------+
                         |   Adapter (Wrapper)     |------>|   Adaptee (Legacy)      |
                         +-------------------------+       +-------------------------+
                         | - adaptee: Adaptee      |       | + specificRequest()     |
                         +-------------------------+       +-------------------------+
                         | + request() {           |       |                         |
                         |     adaptee.specReq()   |       |                         |
                         |   }                     |       |                         |
                         +-------------------------+       +-------------------------+
                         (Translates request to Adaptee)   (The class to be reused)

핵심 메커니즘:

  1. Target: 클라이언트가 사용하고자 하는 표준 인터페이스이다.
  2. Adaptee: 수정할 수 없거나 수정하기 곤란한, 호환되지 않는 인터페이스를 가진 기존 클래스이다.
  3. Adapter: Target 인터페이스를 구현하면서 내부적으로 Adaptee 객체를 가지고(Composition) 요청을 변환하여 전달한다.

Ⅲ. 융합 비교 및 다각도 분석 (Comparison & Synergy)

비교 항목어댑터 패턴 (Adapter)퍼사드 패턴 (Facade)
주요 목적인터페이스 불일치 해결 및 호환성 제공복잡한 서브시스템의 인터페이스 단순화
인터페이스 수1:1 변환 위주 (Adaptee -> Target)1:N 캡슐화 (복수 서브시스템 -> Facade)
적용 시점기존 클래스를 새 인터페이스에 맞출 때시스템 진입점을 단일화하고 싶을 때
결합도Adaptee와 Client를 분리서브시스템 전체와 Client를 분리

Ⅳ. 실무 적용 및 기술사적 판단 (Strategy & Decision)

실무 적용 사례:

  • JDBC Driver: 각 데이터베이스 벤더가 제공하는 고유의 API를 JDBC라는 표준 인터페이스 어댑터를 통해 자바 애플리케이션에서 동일하게 사용한다.
  • 로깅 프레임워크: SLF4J는 Log4j, Logback 등 다양한 로깅 라이브러리를 어댑터를 통해 단일화된 로그 호출 방식을 제공한다.

기술사적 판단: "어댑터 패턴은 **OCP(Open-Closed Principle)**를 실현하는 핵심 도구이다. 기존의 안정적인 코드를 건드리지 않고(Closed) 새로운 환경에 적응(Open)할 수 있게 함으로써, 유지보수 리스크를 최소화하고 시스템의 수명을 연장시킨다."

Ⅴ. 기대효과 및 결론 (Future & Standard)

어댑터 패턴은 모듈 간의 결합도를 낮추고 유연성을 높여준다. 최근의 MSA(Microservices Architecture) 환경에서는 서로 다른 통신 프로토콜(gRPC, REST, SOAP) 간의 데이터를 변환하는 **안티 코럽션 레이어(ACL)**의 핵심 원리로도 응용되고 있다.

📌 관련 개념 맵 (Knowledge Graph)

  • Bridge Pattern: 추상화와 구현을 분리하여 각각 확장 (구조 설계 중심)
  • Proxy Pattern: 접근 제어를 위한 대리인 (어댑터는 인터페이스 변환 중심)
  • Decorator Pattern: 기능 추가를 위한 래퍼 (어댑터는 호환성 중심)

👶 어린이를 위한 3줄 비유 설명

  1. 외국 여행을 갔는데 우리나라 전기 코드가 안 맞아서 콘센트에 못 꽂는 상황이에요.
  2. 이때 중간에 끼우는 '여행용 변환 플러그(어댑터)'만 있으면 가전제품을 그대로 쓸 수 있죠.
  3. 가전제품을 뜯어서 고치지 않아도 되니까 아주 편리하고 안전한 방법이랍니다.