핵심 인사이트 (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)
핵심 메커니즘:
- Target: 클라이언트가 사용하고자 하는 표준 인터페이스이다.
- Adaptee: 수정할 수 없거나 수정하기 곤란한, 호환되지 않는 인터페이스를 가진 기존 클래스이다.
- 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줄 비유 설명
- 외국 여행을 갔는데 우리나라 전기 코드가 안 맞아서 콘센트에 못 꽂는 상황이에요.
- 이때 중간에 끼우는 '여행용 변환 플러그(어댑터)'만 있으면 가전제품을 그대로 쓸 수 있죠.
- 가전제품을 뜯어서 고치지 않아도 되니까 아주 편리하고 안전한 방법이랍니다.