[디자인 패턴] 어댑터 패턴_Adapter pattern (JavaScript)
2024. 11. 17. 21:19ㆍWeb_Programming
어댑터 패턴이란?
서로 다른 인터페이스를 가지는 두 객체를 연결하여 사용할 수 있도록 하는 구조적인 패턴입니다.
- 클라이언트 코드와 레거시 클래스, 타사 클래스(라이브러리) 또는 특이한 인터페이스가 있는 다른 클래스 간의 변환기 역할을 하는 중간 레이어 클래스를 두어 호환되도록 처리
- Adaptee: 레거시 또는 외부 시스템
- Adapter: 변환 작업을 수행하는 어댑터
- Client: 어댑터를 사용하는 클라이언트 코드
주요 특징
- 서비스 객체에 작업 위임: 어댑터 클래스는 대부분의 작업을 실제 서비스 객체에 위임해야 하며, 변환 또는 중재 역할만 수행합니다.
- MVC (Model-View-Controller) 패턴에서의 활용
- MVC 디자인 패턴에서 모델과 뷰 사이에 컨트롤러를 두어 모델과 뷰를 연결합니다. 이때, 어댑터 패턴을 이용하여 모델과 뷰의 인터페이스를 변환하면, 컨트롤러에서 모델과 뷰를 쉽게 연결할 수 있습니다.
예시 코드
- 프론트엔드에서 백엔드 응답 데이터를 컴포넌트에서 사용할 props로 변환해야 할 때, 어댑터 패턴을 활용할 수 있습니다.
export const ViewerDataAdapter = {
makeReceptorData: (receptorQueryData: DownloadProteinStructureData) => {
return {
id: "0",
type: "pdb",
rawData: receptorQueryData?.receptor,
meta: {
name: receptorQueryData?.protein.name || "",
cofactors:
receptorQueryData?.protein.options.selected_receptor.cofactors,
},
};
},
makeBindingSiteData: (
bindingSiteQueryData: DownloadProteinStructureData["protein"]["options"]["binding_site"],
) => {
return {
id: "0",
type: bindingSiteQueryData.file_type
meta: {
moleculeName: bindingSiteLigandName,
smiles: "",
bindingScore: null,
display: "OFF",
},
};
},
makeLigandsData: (ligandsQueryData: GetSdfDataWithMolecule[]) => {
return [...ligandsQueryData]
.map(({ molecules, representaiveMolecule }, index) =>
molecules.map((mol, _index) => ({
id: `${representaiveMolecule.molecule_id}_${mol.conformer_id}`,
type: "sdf",
meta: {
moleculeName: representaiveMolecule.name,
smiles: representaiveMolecule.smiles,
bindingScore: mol.binding_score,
display: "ON",
},
})),
)
.flat();
},
};
어댑터 패턴의 장단점
장점
- 단일 책임 원칙 준수
어댑터는 비즈니스 로직에서 데이터 변환 및 인터페이스 연결 작업을 분리하여 코드 가독성과 유지보수성을 높입니다. - 재사용성 증가
동일한 어댑터를 다양한 클라이언트 코드와 함께 사용할 수 있습니다.
단점
- 코드 복잡도 증가
어댑터 클래스 추가로 인해 전체 코드의 복잡성과 코드량이 늘어날 수 있습니다. - 성능 저하 가능성
데이터 변환이 빈번히 발생하면 성능이 다소 저하될 수 있습니다.
반응형
'Web_Programming' 카테고리의 다른 글
[디자인 패턴] 플라이웨이트 패턴_ Flyweight pattern (JavaScript) (0) | 2024.11.17 |
---|---|
[디자인 패턴] 관찰자 패턴_Observer pattern (JavaScript) (0) | 2024.11.17 |
[우아한 테크러닝 4기] redux 구현해보기 (0) | 2021.07.02 |
[자바스크립트] 클로저 (Closure) 함수&커링 (0) | 2021.06.28 |
d3.js csv파일로 table만들기 (0) | 2021.03.30 |