[React] Presentational and Container Components

Presentational and Container Components

재사용성과 유지보수성을 높이기 위해서 컴포넌트를
Container 와 Presentational 컴포넌트라는 두 가지 종류로 나눌 수 있습니다.


Presentational Component


Container Component


이러한 접근 방식의 이점

컴포넌트가 DOM 을 출력하지 않아도 괜찮습니다.
컴포넌트는 UI 와 관련된 여러 관심사들을 나누는 경계선의 역할을 합니다.
컴포넌트를 이용해 관심사를 나눈 뒤에, 이 컴포넌트들을 합성할 수 있습니다.


언제 container 컴포넌트를 작성해야 하나요?

앱을 제작할 때, 먼저 presentational 컴포넌트부터 작성해 보세요.
결국 아주 많은 prop 들을 중간 계층의 컴포넌트에 전달해야 한다는 사실을 깨닫게 될 것입니다.
그 중 어떤 컴포넌트가 props 를 그저 아래로 내려보내주고 있어서,
자식 컴포넌트가 더 많은 데이터를 필요로 할 때 중간 계층에서 일일이 이어주어야 한다면,
그 때가 바로 container 컴포넌트를 적용하기 좋은 시점입니다.
이 방법을 통해, 별로 상관도 없는 중간 계층의 컴포넌트에 부담을 지우지 않고도 맨 아래에 있는 컴포넌트에 데이터를 내려줄 수 있습니다.

이러한 리팩토링 절차는 계속 진행될 것이므로, 처음부터 모든 부분을 정확하게 작성하려고 하지 마세요.
이 패턴을 적용하다 보면, 언제 container 컴포넌트를 추출해야 할지에 대한 감을 잡으실 수 있을 겁니다.


다른 분류법

Presentational 컴포넌트와 container 컴포넌트 간의 차이점이
기술적인 부분에서 오는 것이 아니라는 점을 이해하는 것이 중요합니다.
그보다는 어떤 목적을 가지는지에 따라 분류해야 합니다.

반면에, 비슷하면서도 다른 몇 가지 기술적 분류법들이 있습니다.

어떤 컴포넌트가 presentational 컴포넌트인지 container 컴포넌트인지를 명확히 결정할 수 없는 경우도 있습니다.
저의 경험에 비추어보면, presentational 컴포넌트는 무상태(stateless) 순수(pure) 함수인 경향이 있고,
컨테이너는 상태를 갖는(stateful) 순수(pure) 클래스인 경향이 있습니다.
하지만, 경험상 그렇다는 것이지 반드시 그래야 한다는 것은 아니며, 특정 상황에서는 정확히 반대인 경우도 말이 될 수 있습니다.

Presentational 컴포넌트와 container 컴포넌트 간의 구분을 너무 명확히 하려고 하지 마세요.
그게 별로 중요하지 않을 때도 있고, 또 선을 명확히 긋는 것도 어렵습니다.
어떤 컴포넌트가 presentational 이어야 하는지 아니면 container 여야 하는지 결정하기 어렵게 느껴진다면,
아마도 그 결정을 하기 이른 때일 것입니다. 너무 애쓰지 마세요!