백엔드

디자인 패턴 : 어댑터 패턴(Adapter Pattern)

Newbie Developer 2025. 5. 6. 13:53

 

프로그래밍을 하다 보면 이미 만들어진 코드(라이브러리, 시스템, 클래스 등) 새로운 코드 사이에 인터페이스가 맞지 않아 바로 사용할 없는 경우자주 생깁니다. 이럴 유용하게 사용할 있는 디자인 패턴이 바로 어댑터 패턴(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 연동 매우 유용한 패턴입니다.

디자인 패턴은 문제 해결을 위한 도구입니다. 상황에 맞게 유연하게 적용하세요.