나만의공간

🧱 1. 어댑터 패턴이란? 본문

IT/JAVA

🧱 1. 어댑터 패턴이란?

밥알이 2025. 5. 31. 23:49

어댑터 패턴(Adapter Pattern)이란? 구조가 다른 코드를 연결하는 스마트한 방법

소프트웨어를 개발하다 보면 기존 시스템은 그대로 유지하면서도 새로운 외부 라이브러리나 코드 구조를 통합하고 싶을 때가 있습니다. 이런 상황에서 어댑터 패턴(Adapter Pattern)이 큰 도움이 됩니다.

🧱 어댑터 패턴의 핵심 목적

어댑터 패턴은 서로 호환되지 않는 두 인터페이스를 중간에서 변환해주는 구조적 디자인 패턴입니다. 마치 220V 콘센트에 110V 노트북 충전기를 연결할 때 사용하는 전압 어댑터처럼, 기존 시스템을 수정하지 않고도 새로운 코드를 유연하게 통합할 수 있습니다.

[기존 코드]        = 콘센트 (220V)
[새 코드]          = 노트북 충전기 (110V)
[중간 어댑터]      = 전압 변환기 (어댑터 패턴)

즉, 새로운 코드만 어댑터를 통해 기존 시스템과 연결하면 되는 것이죠.

📌 어댑터 패턴은 언제 사용하나요?

  • 기존 클래스를 변경하지 않고 새로운 클래스를 기존 구조에 맞춰 사용하고 싶을 때
  • 레거시 시스템이나 외부 라이브러리를 새로운 인터페이스로 감싸고 싶을 때
  • 유지보수는 최소화하면서, 새 기능을 추가하려는 상황

🎯 시나리오 예시

회사에서는 모든 로그를 LogSaver 인터페이스를 통해 저장합니다. 그런데 외부 시스템에서 제공하는 SlackLogger는 구조가 달라서 바로 쓸 수 없습니다.

이때, 어댑터 패턴을 사용해 SlackLogger를 LogSaver 인터페이스에 맞춰 감싸면 기존 시스템에 자연스럽게 통합할 수 있습니다.

 

🔧 어댑터 패턴 실전 예제 (Java)

📁 1) 기존 시스템 인터페이스


public interface LogSaver {
    void save(String message);
}

📁 2) 새로운 외부 클래스 (인터페이스가 다름)


public class SlackLogger {
    public void sendToSlack(String channel, String message) {
        System.out.println("#SLACK [" + channel + "] " + message);
    }
}

📁 3) 어댑터 클래스


public class SlackLogAdapter implements LogSaver {
    private SlackLogger slackLogger;
    private String defaultChannel = "#payment-log";

    public SlackLogAdapter(SlackLogger slackLogger) {
        this.slackLogger = slackLogger;
    }

    @Override
    public void save(String message) {
        slackLogger.sendToSlack(defaultChannel, message);
    }
}

📁 4) 클라이언트 코드


public class Main {
    public static void main(String[] args) {
        LogSaver dbLogger = new LogSaver() {
            @Override
            public void save(String message) {
                System.out.println("DB에 저장: " + message);
            }
        };

        dbLogger.save("결제 완료");

        SlackLogger slackLogger = new SlackLogger();
        LogSaver slackAdapter = new SlackLogAdapter(slackLogger);

        slackAdapter.save("슬랙 로그 전송 완료");
    }
}

✅ 실행 결과

DB에 저장: 결제 완료
#SLACK [#payment-log] 슬랙 로그 전송 완료

💡 실무에서 어댑터 패턴이 활용되는 예

  • Spring FrameworkHandlerAdapter: 다양한 컨트롤러를 동일한 방식으로 처리
  • 외부 API 응답 구조가 내부 도메인 모델과 다를 때 → 어댑터 또는 매퍼 활용
  • 레거시 클래스에 새 인터페이스를 맞춰 사용할 때

🎓 어댑터 패턴과 다른 패턴의 차이점

패턴 주요 용도
어댑터 구조가 다른 두 객체 연결
데코레이터 기능을 동적으로 확장
프록시 접근 제어, 캐싱, 로깅
브리지 인터페이스와 구현 분리

✅ 어댑터 패턴 요약 정리

항목 설명
목적 호환되지 않는 인터페이스를 연결
핵심 구성 기존 인터페이스, 대상 클래스, 어댑터
장점 기존 코드 수정 없이 새 클래스 통합 가능
단점 클래스 수 증가, 간접 호출 복잡도 증가

🔚 마무리: 어댑터 패턴은 실무에서 꼭 알아야 할 필수 디자인 패턴입니다

어댑터 패턴은 코드 재사용성을 높이고, 기존 시스템의 안정성을 유지하면서도 새로운 기능을 유연하게 통합할 수 있는 매우 유용한 패턴입니다. 특히 외부 라이브러리와 통합하거나, 레거시 시스템과 새 시스템을 연결할 때 매우 큰 효과를 발휘합니다.

Comments