어댑터 패턴(Adapter Pattern)은 서로 호환되지 않는 두 인터페이스(클래스)를 연결하여 함께 동작할 수 있도록 변환기(Adapter) 역할을 제공하는 구조 패턴입니다.
한국의 220V 플러그가 달린 가전제품을 일본에 가져가서 110V 콘센트에 꽂으려면 돼지코(변환 어댑터)가 필요합니다. 소프트웨어에서도 기존에 잘 작성된 레거시 클래스를 수정하지 않고, 새로운 시스템(인터페이스) 규격에 맞춰 끼워넣어야 할 때 매우 강력한 힘을 발휘합니다.
📐 Adapter Pattern UML
호환되지 않는 인터페이스(Adaptee)를 클라이언트가 기대하는 인터페이스(Target)로 변환(Adapter)해줍니다.
// 1. 클라이언트가 기대하는 동작 (Target)
// JS에는 interface가 없으므로 duck typing을 사용합니다.
// 2. 외부 라이브러리나 기존 시스템 (Adaptee - 220V 가전)
class Appliance220V {
powerOn220V() {
console.log("220V 전원이 공급되어 작동합니다. 위잉~!");
}
}
// 3. 어댑터 클래스 (돼지코)
class SocketAdapter {
constructor(appliance) {
this.appliance = appliance;
}
powerOn110V() {
console.log("어댑터 동작: 110V 입력을 220V로 변환합니다.");
this.appliance.powerOn220V();
}
}
// 4. Client (사용 예시)
function connectToJapanSocket(socket) {
socket.powerOn110V();
}
const koreanHeater = new Appliance220V();
const adapter = new SocketAdapter(koreanHeater);
connectToJapanSocket(adapter);