학습 목표
- 어댑터 패턴의 개념과 목적을 간략하게 설명할 수 있다.
- 어댑터 패턴을 활용한 코드를 작성하고, 동작 방식을 설명할 수 있다.
- 어댑터 패턴의 실무 활용 사례를 이해하고 설명할 수 있다.
사전 기반 지식
- 객체지향 프로그래밍(OOP): 클래스와 객체, 상속과 인터페이스에 대한 이해
- 다형성: 상위 인터페이스 타입으로 다양한 하위 구현 객체를 다루는 능력
1. 어댑터 패턴이란? (돼지코를 떠올리세요!)
어댑터 패턴은 호환되지 않는 인터페이스를 가진 클래스들을 함께 작동할 수 있도록
중간에서 '번역' 또는 '변환'해주는 디자인 패턴입니다.
해외여행 갈 때 사용하는 '돼지코' (여행용 어댑터)**를 생각하면 가장 쉽습니다.
우리나라 220V 전자제품을 해외 110V 콘센트에 그냥 꽂을 수는 없죠.
이때 '돼지코' 어댑터가 220V 규격의 플러그를 110V 콘센트 규격에 맞게 변환해주는 역할을 합니다.
- 기존 코드 (Adaptee): 110V 전자제품
- 사용하려는 환경 (Client): 220V 콘센트
- 어댑터 (Adapter): '돼지코'
이처럼 어댑터 패턴은 기존 코드를 전혀 수정하지 않고도, 새로운 환경의 요구사항에 맞게
인터페이스를 변환하여 둘을 연결해줍니다.
2. 코드로 보는 어댑터 패턴
친구가 해외에서 110V짜리 헤어드라이기와 청소기를 선물해줬지만,
우리 집 콘센트는 모두 220V인 상황을 코드로 구현해 보겠습니다.
package ch02;
// Taget, 인터페이스로 설계
interface IElectronic220v {
void connect();
}
interface IElectronic110v {
void connect();
}
// 일본에서 선물 받은 헤어 드라이기
class HairDryer implements IElectronic110v {
@Override
public void connect() {
System.out.println("헤어드라이기 연결 110v On");
}
}
class AirConditioner implements IElectronic220v {
@Override
public void connect() {
System.out.println("에어컨 연결 220v on");
}
}
// 어댑터 패턴에 핵심 -
class ElectronicAdapter implements IElectronic220v {
IElectronic110v iElectronic110v;
// 생성자를 통해서 연결할 가전제품(즉, 110v 을 전달 받습니다)
public ElectronicAdapter(IElectronic110v iElectronic110v) {
this.iElectronic110v = iElectronic110v;
}
// 외부적으로 220v 을 연결 시킬 수 있음 (내부에서 사실 110v이 연결된 상태 입니다)
@Override
public void connect() {
iElectronic110v.connect();
}
}
// 우리집 : 클라이언트
public class MyHouse {
// 220v 콘센트를 연결하는 메서드
public static void plugIn(IElectronic220v iElectronic220v) {
iElectronic220v.connect();
}
public static void main(String[] args) {
AirConditioner airConditioner = new AirConditioner();
HairDryer hairDryer = new HairDryer();
ElectronicAdapter electronicAdapterHairDryer = new ElectronicAdapter(hairDryer);
// 나는 전기 설비가 되어 있어 (집)
plugIn(airConditioner);
plugIn(electronicAdapterHairDryer);
}
}
실제 활용 사례
어댑터 패턴은 기존에 잘 동작하던 코드를 수정하고 싶지 않을 때 외부의 새로운 요소와 통합하기 위해 널리 사용됩니다.
외부 API 응답을 내부 모델로 변환 (가장 흔한 사례)
레거시 시스템과의 통합
오래된 라이브러리나 외부 시스템의 API가 현재 시스템의 인터페이스와 다를 때, 어댑터를 만들어 두 시스템이 원활하게 통신하도록 합니다. (예: 구 버전 결제 모듈을 새 주문 시스템에 연동)
외부 라이브러리/프레임워크 연동
외부 라이브러리(예: 데이터 포맷 변환, 로깅)를 도입할 때, 시스템이 특정 라이브러리에 너무 의존하지 않도록 어댑터로 감싸서 사용합니다. 나중에 다른 라이브러리로 교체하더라도 어댑터만 수정하면 되므로 유연해집니다.
데이터 모델 변환
한 시스템에서 사용하는 데이터 객체(DTO)를 다른 시스템(예: 외부 API)이 요구하는 데이터 객체(Request/Response 모델)로 변환해야 할 때, 어댑터(또는 변환기)를 사용하여 두 데이터 구조를 매핑합니다. JSON ↔ XML 변환이 대표적인 예입니다.
'JAVA' 카테고리의 다른 글
| 프로젝트생성 (0) | 2025.10.15 |
|---|---|
| 디자인 패턴 - 전략 패턴 (0) | 2025.10.02 |
| 디자인 패턴 - 팩토리 패턴 (0) | 2025.10.02 |
| 디자인 패턴 - 싱글톤 (0) | 2025.09.30 |
| 성능 최적화(HikariCP) 와 커넥션 풀이란? (0) | 2025.05.27 |