프로그래밍을 하다 보면 이미 만들어진 코드(라이브러리, 시스템, 클래스 등) 와 새로운 코드 사이에 인터페이스가 맞지 않아 바로 사용할 수 없는 경우가 자주 생깁니다. 이럴 때 유용하게 사용할 수 있는 디자인 패턴이 바로 어댑터 패턴(Adapter Pattern) 입니다.
🔧 어댑터 패턴이란?
어댑터 패턴(Adapter Pattern) 은 서로 다른 인터페이스를 가진 클래스들이 같은 방식으로 동작할 수 있도록 중간에 어댑터(Adapter)를 끼워 맞추는 구조적 디자인 패턴입니다.
쉽게 말해, 전원 콘센트 어댑터처럼 두 시스템 간의 호환성을 맞춰주는 역할을 합니다.
👨💻 언제 사용하나요?
- 기존 클래스를 변경하지 않고 새 시스템에 맞춰 사용해야 할 때
- 라이브러리나 외부 API와 내부 로직 간 인터페이스가 다를 때
- 레거시 시스템을 유지하면서 신규 코드와 연결할 때
🧱 구조 다이어그램
Client --> Target
▲
│
Adapter
│
Adaptee
- Target: 클라이언트가 기대하는 인터페이스
- Adaptee: 기존에 존재하는 클래스 (인터페이스가 다름)
- Adapter: Target 인터페이스를 구현하고, 내부에서 Adaptee를 사용하여 호환되게 만듦
- Client: Target 인터페이스를 사용하는 코드
🧑💻 코드 예제 (Java 기준)
기존 클래스 (Adaptee)
public class LegacyPrinter {
public void printText(String message) {
System.out.println("LegacyPrinter: " + message);
}
}
타겟 인터페이스
public interface Printer {
void print(String message);
}
어댑터 클래스
public class PrinterAdapter implements Printer {
private LegacyPrinter legacyPrinter;
public PrinterAdapter(LegacyPrinter legacyPrinter) {
this.legacyPrinter = legacyPrinter;
}
@Override
public void print(String message) {
legacyPrinter.printText(message);
}
}
사용 코드 (Client)
public class Main {
public static void main(String[] args) {
LegacyPrinter legacy = new LegacyPrinter();
Printer printer = new PrinterAdapter(legacy);
printer.print("Hello, Adapter Pattern!");
}
}
📦 어댑터 패턴의 장점
✅ 재사용성 향상: 기존 코드를 변경하지 않고 재사용할 수 있음
✅ 유연성 증가: 서로 다른 인터페이스를 가진 객체들도 쉽게 호환 가능
✅ 단일 책임 원칙 준수: 변환 책임을 어댑터 클래스에 위임
⚠️ 주의할 점
- 구조가 많아지면 복잡도 증가: 너무 많은 어댑터가 생기면 유지보수가 어려울 수 있음
- 런타임 오류 주의: 인터페이스 불일치를 런타임까지 넘기면 문제 발생 가능
📌 마무리
어댑터 패턴은 기존 시스템과 새로운 시스템을 유연하게 연결해주는 다리 역할을 합니다. 특히 레거시 시스템과 통합이 필요한 상황, 외부 API 연동 시 매우 유용한 패턴입니다.
디자인 패턴은 문제 해결을 위한 도구입니다. 상황에 맞게 유연하게 적용하세요.
'백엔드' 카테고리의 다른 글
디자인 패턴 : 싱글톤 패턴(Singleton Pattern) (1) | 2025.05.08 |
---|---|
트랜잭션이란 무엇이고, ACID는 무엇인가요? (0) | 2025.05.06 |
메모리 누수: Memory Leak (1) | 2025.02.23 |
객체지향 설계 원칙 (SOLID) 개념과 적용 방법 (0) | 2025.02.17 |
Java의 Error와 Exception 차이점 (1) | 2025.02.15 |