[디자인 패턴] 어댑터 패턴_Adapter pattern (JavaScript)

2024. 11. 17. 21:19Web_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();
  },
};
  •  

어댑터 패턴의 장단점

장점

  1. 단일 책임 원칙 준수
    어댑터는 비즈니스 로직에서 데이터 변환 및 인터페이스 연결 작업을 분리하여 코드 가독성과 유지보수성을 높입니다.
  2. 재사용성 증가
    동일한 어댑터를 다양한 클라이언트 코드와 함께 사용할 수 있습니다.

단점

  1. 코드 복잡도 증가
    어댑터 클래스 추가로 인해 전체 코드의 복잡성과 코드량이 늘어날 수 있습니다.
  2. 성능 저하 가능성
    데이터 변환이 빈번히 발생하면 성능이 다소 저하될 수 있습니다.
반응형