develop/Sprint

[React] Presentational & Container 디자인 패턴이란?

온몸비틀기 2024. 2. 25. 23:43

1. Presentational & Container 디자인 패턴이란?

  • 로직을 수행하는 컴포넌트와, markup을 통해 ui를 보여주는 컴포넌트가 분리된 패턴입니다.
    그에 따라 앱의 기능과 ui에 대한 구분이 쉬워집니다.
  • 같은 state를 다른 container에게 props 내림으로 상태를 공유 할 수 있습니다.
  • 로직수행, markUp이 다른 컴포넌트에서 하기 때문에 유지보수가 쉽고, 재사용성이 뛰어납니다. 특히, markup 변경에 매우 유연합니다.
  • 동일한 마크업, 컨테이너 레이아웃 (header, footer)는 반복해서 작성하지 않아도 this.props.children 구현 할 수 있습니다.

리액트를 사용하고 redux, recoil과 같은 상태관리 라이브러리를 같이 사용하다보면 필연적으로 마주하는 디자인 패턴이 이 Presentational & Container 디자인 패턴이다. custom hook이 나오면서 이 디자인 패턴의 container가 custom hook으로 대체될 수 있어 이전과 같은 P&C Pattern이 사용되지는 않는다. 하지만 명확한 것은 데이터의 처리와 view를 분리시키려는 노력의 산물이 이 디자인 패턴이라는 것이다.

1-1. Presentational component

  • UI와 관련된 component
  • state를 직접 조작하지 않으며 container component에서 받은 props를 통해 로직을 구현합니다.
  • 그에 따라 useState, useCallback, dispatch등 state관련된 훅이 하나도 없습니다.
  • 상태를 거의 가지지 않으며, 상태를 가진다면 데이터에 관한것이 아닌 ui 상태에 관한 것입니다.
    종종, this.props.children을 통해 컴포넌트가 렌더됩니다.

1-2. Container component

  • 어떻게 동작하는지, 어떤 로직을 수행하는지에 관련있습니다.
  • markup을 사용하지 않습니다. 스타일을 사용하지 않습니다.
  • 데이터와 데이터 조작에 관한 함수를 만들고 present component에 제공합니다.

Presentation & Container 디자인 패턴 특징

  • 컴포넌트간 의존도가 낮고, Presentation 컴포넌트를 재사용할 수 있습니다.
  • 컴포넌트별 역할이 명확하여 코드 구조를 이해하기 쉽습니다.
  • state를 여러 컴포넌트에 props로 전달하여 상태를 공유할 수 있습니다.