👉 컴포넌트, 다시 생각하기 영상을 보고 정리한 내용입니다.
page
기반 라우팅를 한다면 루트 컴포넌트에 대한 의존성을 가지게 된다. 컴포넌트에 새로운 정보를 추가할 경우 하위 컴포넌트의 props
, useEffect
등을 수정해야 할 수 있다.
예시 : Article 컴포넌트에 새로운 정보 추가
Component
폴더Component.tsx
or index.tsx
(컴포넌트 렌더링)Component.styles.ts
(컴포넌트 스타일)useComponent.ts
(컴포넌트 로직)👀 지금까지
styled component
가 많아져도 컴포넌트와 한 파일 내에 두었는데 앞으로는 스타일 관련 파일을 따로 만들어 한 폴더 내에 두도록 해야겠다. 그리고custom hook
은hook
폴더에 넣어 일괄적으로 관리했는데 앞으로는 공통으로 사용되는 훅만hook
폴더에 넣고, 특정 컴포넌트에서만 사용되는 훅은 해당 컴포넌트 폴더에서 관리해야겠다.
props
로 id
만 전달하면 하위 컴포넌트는 id
를 이용해 데이터에 바로 접근할 수 있다.👀
React Query
와 접목시켜보자! 상위 컴포넌트에서data
가 아닌queryKey
를props
로 전달하면 하위 컴포넌트에서는queryClient.getQueryData(queryKey)
를 이용하여 전역에서queryKey
로 관리되는 데이터를 바로 가져올 수 있다.
props namimg
에 드러내면 컴포넌트 간 의존성이나 모델에 대한 의존성을 명확히 파악할 수 있고 어떻게 의존성을 느슨하게 만들어야 하는지 눈에 보인다.// 1. Bad 👎
interface UserCardProps {
leftImageThumbnailUrl: string;
title: string;
title2: string;
caption: string;
rightDotColor: string;
rightCaption: string;
}
// 2. 의존하는 모델을 그대로 드러내기 (User와 Image 모델)
interface UserCardProps {
userImageThumbnailUrl: string;
userName: string;
userNickname: string;
userTotalFollwerCount: number;
userLastActivityAt: Date
}
// 3. 모델 간의 연결 정보를 그래도 드러내기 (User -> Image)
interface UserCardProps {
user : {
name: string;
nickname: string;
totalFollwerCount: number;
lastActivityAt: Date;
image : {
thumbnailUrl: string;
}
}
}
// 한 컴포넌트에서 여러 모델을 사용하는 것은 관심사 분리가 안되는 것이다. 👎
// 4. 의존하는 모델에 따라 컴포넌트 분리하기
interface UserCardProps {
user : {
name: string;
nickname: string;
totalFollwerCount: number;
lastActivityAt: Date;
image : {
thumbnailUrl: string;
}
}
}
interface AvatarProps {
image : {
thumbnailUrl: string;
}
}
// 컴포넌트 간의 의존성이 크다. (컴포넌트의 재사용성이 낮다) 👎
// 5.
// user와 image 데이터가 아닌 데이터 ID를 props로 받아온다면 컴포넌트 간 의존성이 느슨해질 것이다.
interface UserCardProps {
userId: string;
}
interface AvatarProps {
imageId: string;
}
👀
props naming
이 중요하다는 것을 알고 있었지만, 어떻게 이름을 지어야 할지 항상 고민이 있었다. 하지만, 이제는 의존하는 모델을 드러내는 이름을 사용해야 겠다. 또한, 모델의 연결 정보도props naming
에 드러낼 수 있다는 것을 새롭게 배웠다. 하지만, 중요한 것은 관심사를 분리하는 것과 컴포넌트 간의 의존성을 느슨하게 하는 것이다. 한 컴포넌트에서 여러 모델을 사용하지 않도록 관심사를 분리하고, 컴포넌트를 분리하면서 생긴 의존성을 느슨하게 하면 훨씬 재사용성이 높아진 컴포넌트를 만들 수 있다.
👀 지금까지 UI에 따라 컴포넌트를 재사용했는데, 모델 기준으로 컴포넌트를 분리해야 한다는 새로운 인사이트를 얻었다. 모델이 다르지만, 현재 UI가 같다고 컴포넌트를 재사용하게 되면, 추후 모델에 따라 UI 변경사항이 생기면 아주 곤란해진다.