이 시리즈는 저만의 FE 컨벤션, 코드 스타일 등을 만들고자 Toss의 SLASH 영상과 기술 블로그 등을 참고하여 만들었습니다.
SLASH 22에서 한재엽님께서 발표하신 "Effective Component 지속 가능한 성장과 컴포넌트" 영상을 분석하였습니다.
주니어 FE 개발자로서 회사에서 프로젝트할 때, 가장 어려웠던 부분은 바로 "컴포넌트 적절히 나누기" 였습니다. 재엽님의 영상을 통해서 컴포넌트를 "적절히" 나누는 기준을 배웠고 다음 프로젝트 때, 잘 써먹어 보려고 합니다. 좋은 내용 감사합니다🙇🏻♂️
[기존 코드]
function ReactFramerworkSelector({ defaultValue }) {
const [isOpen, openk, close] = useBoolean();
const [selected, change] = useState(defaultValue);
return (
<>
<InputButton label="React Framework" value={selected} onClick={open} />
{isOpen ? (
<Options onClose={close}>
{options.map((value) => {
return (
<Button
selected={selected === value}
onClick={() => change(value)}
>
{value}
</Button>
);
})}
</Options>
) : null}
</>
);
}
[개선]
// Select 라는 함수 만들어서 컴포넌트 분리
function Select({ label, trigger, value, onChange, options }: Props) {
return (
<Dropdown label={label} value={value} onChange={onChange}>
<Dropdown.Trigger as={trigger} />
<Dropdown.Menu>
{options.map(option => (
<Dropdown.Item>{option}</Dropdown.Item>
})}
</Dropdown.Menu>
);
}
// Select 함수가 필요한 컴포넌트에서 활용
function FrameworkSelect() {
const {
data: { frameworks },
} = useFrameworks();
const [selected, change] = useState();
return (
<Select
trigger={<InputButton value={selected} />}
value={selected}
onChange={change}
options={frameworks}
/>
);
}
위에서 구현한 FrameworkSelect 컴포넌트에는 "Framework" 라는 특정 도메인이 포함되어 있기 때문에 재사용하는 데 한계가 있다.
// 특정 도메인을 제거하고 일반적인 역할을 할 수 있도록 인터페이스 변경한 코드
interface Props {
options: Array<{ label: string }>;
value?: string[];
onChange?: (selecteds: string[]) => void;
valueAs?: (value?: string[]) => string;
}
구현하는 것보다 제대로 고민하는 것이 훨-씬 중요하다는 것 명심하자.
어떠한 단 하나의 기능을 할지 정하기
도메인 맥락을 제거하여 최대한 일반적으로 만들기
한 번 잘 만든 컴포넌트는 미래의 나와 동료들에게 큰 도움이 된다는 생각 항상 인지하기
UI에 속지 않고 데이터 흐름을 파악하여 쉽게 구조를 잡기
저의 궁극적인 목표는...
단순히 개발만 잘하는 사람이 아니라, Problem Solver로서 특정 문제를 잘 풀어내는 사람이 되는 것입니다.
그렇기에 "변경"은 제가 만들고 있는 제품의 성장을 뜻한다는 것이고 이는 문제를 조금씩 잘 풀어내고 있다는 것을 의미합니다.
따라서, "변경"을 반가워하고 오히려 기분 좋게 받아들이는 자세를 갖고자 합니다.
최근 글 올리시는것들 흥미롭게 보고 있습니다! 응원합니다!!