이번 프로젝트를 경험하면서 가장 머리가 아팠던 부분이 바로 '공통 컴포넌트' 이다.
'공통 컴포넌트' 에 대해 여러가지 레퍼런스를 참조하고 공부를 하면서 깨닫게 된 부분이 있었지만, 사실 '공통 컴포넌트' 라는 그 방법론이 가리키는게 정확히 하나를 가리키는건 아니었다.
(적어도 난 이렇게 이해했다)
우선 이 글에는, 우리 팀에서 기획했던 공통컴포넌트 시스템에 대한 아주 기본적인 개념에 대해 작성해 보았다.
실제로 규모가 있는 프로젝트에서, 완벽한 디자인 시스템이 갖춰져 있을 경우이다
여기서 말하는 디자인 시스템이 제대로 갖춰진 경우는
프로젝트에 사용되는 모든 버튼에 대한 크키, 색상 등의 값들이 모두 상세히 갖춰진 경우이다.
각 사용처에 따른 디자인 정보가 아니라 모든 디자인의 경우를 통틀어서 말하는 것이다.
로그인 버튼은 m사이즈, 메인 메뉴 모달버튼은 s사이즈, 저장하기 버튼은 l 사이즈 - ❌
프로젝트에서 버튼이 가지는 크기는 s, m, l 이다 - ⭕
답을 알아보기 위해 공통 컴포넌트로 버튼을 사용할 경우를 예로 들어보자
Button.tsx를 만들 때, props로 크기, 색상 등의 정보를 각각 받고
이걸 프로젝트에 맞게 렌더링 할 수 있도록 세팅 해둔다.
즉 Button.tsx는 props로 크기와 색같은 정보들을 받았을 때
props를 기반으로 완성된 버튼을 반환해주면 된다
버튼을 사용하는 사람은 Button.tsx를 import해서 사용한다
이 때, 사용하는 사람은 Button.tsx 내부에 세팅돼있는 클래스명을 몰라야 한다.
오직 사용자는 라이브러리처럼 import한 뒤, props로 각종 크기나 색상같은 각 옵션만 조합해서 사용하는 것이다.
주의할 점은 props를 넘겨줄 때
미리 사용될 스타일에 대한 값들을 지정해 두고
그걸 호출하는게 아니라- 사용자가 독립된 props를 조합해서 원하는 버튼을 만드는 것이다
각 사용처에 해당하는 버튼의 테마나 스타일을 정해놓고 그걸 가져다 쓰는 게 아니다.
그렇지만 보통 디자인시스템은 어떤 팀에서 만드는 모든 서비스를 대상으로 하는 경우가 많아서
컴포넌트는 완전 독립된 라이브러리처럼 import 해서 가져다 쓰는 형태로 만들어야 한다.
만약 로그인 버튼의 사이즈가 200px 에서 250px로 변경되었다면?
만약 로그인 버튼의 사이즈가 A페이지에서는 기존 200px을 사용하지만, B페이지에서는 250px을 사용하게 되면?
위의 경우, 실제 스타일의 정의를 직접 수정하면서 A,B페이지별 className을 또 다시 분리해야 한다.
만약 공통 컴포넌트 시스템이 갖춰져 있다면, 기존 Button.tsx에 넘겨주던 props 조합만 s를 m 으로 변경만 해주면 되는데 말이다.
해당 시스템은 그만큼 초기 단계에서 완벽한 디자인 시스템이 뽑혀야만 한다.
❗이 경우, Button.tsx 내부에 {children}을 ReactNode타입으로 받아서 버튼의 컨텐츠로 사용할 수 있는 옵션으로 예상치 못한 디자인에 대응 할 수 있다.
어쨌든 초기 디자인 시스템이 필수적이라는 조건 때문에 규모가 작은 사이드프로젝트의 경우 위와 같은 방식이 오히려 복잡성을 증가하거나 오버엔지니어링이 될 수도 있다.
이 프로젝트에는 적용을 하지 않기로 했다