adapter 패턴이란?

갈아만든배·2023년 6월 16일
0

디자인 패턴 정리

목록 보기
3/3
post-thumbnail

해당 내용은 "JAVA 언어로 배우는 디자인 패턴 입문 3판"을 읽으면서 내용을 정리한 것입니다.

adapter 패턴이 뭔데?

adapter 패턴이란 이미 사용하던 코드를 필요한 형태로 변환하여 사용할 수 있게끔 할 때 사용하는 패턴이다.

다른 이름으로는 wrapper 패턴이라고도 불리는데, wrapper라는 이름처럼 어떤 것을 감싸서 포장하는 것과 비슷하다.

우리가 흔히 노트북이나 모니터 같은 장비의 전원을 연결할 때 쓰는 어댑터라고 불리는 것들 처럼 어떤 것을 용도에 맞게 변환할 때 사용하는 패턴이다.

기존에 사용하던 비슷한 계열의 클래스들을 모아 인터페이스를 만들 때,
기존에 이미 작동하던 코드를 수정하지 않고도 인터페이스의 구조에만 맞춰서 사용하고 싶을 때 흔히 어댑터 클래스를 구현하여 사용한다.

adapter 패턴의 종류

adapter 패턴에는 크게 상속을 통한 구현과 위임을 통한 구현으로 크게 두 가지의 방법으로 분류할 수 있다.

상속은 말 그대로 기존에 사용하던 객체를 상속 받아 필요한 형태로 변환하는 것이고,

위임은 기존에 사용하던 기능은 원래 객체에 위임하고 형태만 동일하게 변환하는 것이다.


설명만 읽으면 무슨 말인지 잘 이해가 되지 않을 수도 있지만, 이는 추후에 예제를 통해 이해하고 넘어가면 될 일이고, 여기서 중요한 핵심은 위에서도 계속 강조하듯이 **기존 객체를 필요한 형태에 맞춰 변환시키는 패턴**이라는 것이다.

노트북 어댑터가 가정용 전기를 노트북을 충전시킬 수 있는 전압으로 변환시켜 노트북에게 제공하듯이,
이 어댑터 패턴도 기존의 사용하던 객체(가정용 전기)를 필요에 맞게 변환시켜(노트북에 맞는 전압으로 변환) 제공하는 패턴이라는 것을 이해하면 된다.

adapter 패턴 예제

이제 위에서 설명했던 상속과 위임을 통한 adapter 패턴을 알아보도록 하자.

우리는 기존 서비스를 운영 하면서 내부 데이터 분석 및 로깅 용으로 로그 데이터들을 저장할 때 Map 객체의 형태를 통해 데이터를 읽고 또 저장하고 있었습니다.

그런데 내부에 다른 서비스를 운영하던 팀과 회의 중 해당 팀은 Map이 아닌 로그 객체를 이용하고 있었다는 이야기를 듣고, 사내의 로그 저장 방식과 인터페이스에 대해 논의한 후,

사내의 모든 로그를 관리할 때는 Log data class를 이용하기로 논의했습니다.

이후 기존의 Map 객체를 이용해 저장하던 방식을 변경된 인터페이스에 맞춰 로그 객체로 수정하는 작업을 진행하는 대신,
로그 인터페이스를 구현한 어댑터 클래스를 만들어 관리하기로 했습니다.

만약 위와 같은 상황이 왔다고 가정할 경우,

이미 팀 내에서 광범위하게 사용하던 로그 생성 객체 자체를 수정하는 것은 해당 로그 객체를 사용하고 있던 모든 부분에 대해서 테스트를 진행해야 하는 상황이 오기 때문에,
이미 잘 작동하고 있었으나 그저 반환 값을 Map으로 제공하던 것이 문제였던 로그 객체의 반환값만 수정하여 인터페이스에 맞추는 어댑터를 제공하는 것이 작업의 양을 줄일 수 있는 방식이다.

이제 예제를 작성해보자.

실제 상세 구현은 하지 않았으니 이런 구조의 객체였을 것이라고 생각하고 넘어가자.

이것은 팀 회의 후 나온 로거 인터페이스의 구조이다.

메소드의 역할을 명확하게 하기 위해서 이름도 기존과 다르게 조금 수정됐다.

그리고 위의 코드가 레거시 로거 코드를 변경된 인터페이스에 맞게 변환한 어댑터이다.

기존에 사용하던 MapLogger 클래스를 사용하되 해당 클래스의 반환값 및 파라미터에 맞게 Log 객체를 Map 객체로, Map 객체를 Log 객체로 변환해주었다.

이를 위임을 통한 방식으로 구현하면 아래와 같다.

기존 클래스를 상속하여 구현하는 대신에 기존 클래스에게 핵심 기능에 대한 것을 위임하고 변환에 대한 것만 처리했다.

이렇게 하면 굳이 기존 클래스를 상속하여 구현하지 않아도 기존 클래스의 사용법만 안다면 효과적으로 변환을 처리할 수 있다.

0개의 댓글