Replies: 5 comments 5 replies
-
저라면 개인적으로 2안을 선택할 것 같습니다. 데이터 페칭 훅인 usePost는 Post 컴포넌트에서 분리가 가능해 보입니다. 만약 Post 컴포넌트를 다른 사용처에서 재사용 할 때 부모 컴포넌트에서 데이터를 이미 들고 있다면, username, comment, likeCount를 props로 주입해야 하는 경우가 생길 수 있겠다는 생각이 듭니다! |
Beta Was this translation helpful? Give feedback.
-
이에 맞춰서 2안이 조금 더 유연한 사고 및 확장이 가능하다고 생각이 드네요! |
Beta Was this translation helpful? Give feedback.
-
저도 1안을 선호합니다. react hook 이 나온뒤 dan abramov 는 아래 코멘트와 함께 글을 업데이트했습니다.
즉 Custom hook 으로 비즈니스 로직을 충분히 잘 분리하면 컴포넌트 하나에서 props 로 모두 내려주는것과 거의 동일하게 관심사가 분리된다고 생각해요
function Post({ postId }: { postId: string }) {
const { username, comment, likeCount } = usePost(postId); // <- Container component 의 역할
// Presentational component 의 역할
return (
<div>
<h1>{username}</h1>
<p>{comment}</p>
<p>{likeCount}</p>
</div>
);
} 특히 swr, react-query 같은 data fetching, global state 역할을 어느정도 같이 할 수 있는 좋은 라이브러리를 많이 사용할 때에는 더욱 유용하다고 생각해요. |
Beta Was this translation helpful? Give feedback.
-
저는 배열을 순회하는 경우인지, 단일 컴포넌트를 렌더링하는 경우인지에 따라 데이터 전달 방식이 달라져야 한다고 생각합니다. 배열을 순회하는 경우에는, 데이터 페칭의 책임이 Posts(또는 PostList) 컴포넌트에 있다고 보기 때문에, 반면, Post 목록을 렌더링할 때 id만 전달하는 방식처럼 Post 컴포넌트 내부에서 데이터를 다시 가져오게 되면, 하지만 상세 페이지처럼 단일 컴포넌트를 렌더링하는 경우에는, id만 전달하고 내부에서 데이터를 조회하는 방식이 더 자연스럽게 느껴집니다. ( 해당 게시글 내의 댓글과 동일하게 생각합니다. ) |
Beta Was this translation helpful? Give feedback.
-
약간 React Server Component에서 Data Fetching을 어느 단계에서 해야 할 지 고민입니다랑 비슷한 고민으로 바라봤는데요! 저는 컴포넌트를 추상화하지 않아야 할 때, 즉 부모 컴포넌트가 더 직접적인 제어권을 가져야 하는 상황 에서는 2안을 고려해볼 만하다고 생각해요. 다만 이 중앙에 배치하는 관점이 @ysm-dev님이 언급해주셨듯이 훅이 도입된 이후로 컴포넌트 단위의 엄격한 Presentational-Container 패턴을 중시하지 않게 된 거 같아요. 컴포넌트 재사용성 관점에서 설계를 바라보는 경향을 데이터 패칭과 묶어서 바라보는 관점으로 바뀌어 가고 있다고 봅니다. 개인적으론 1번 방식을 선호합니다! 비즈니스 로직과 View 응집도를 부모단에서 관리하기보단 내부로 캡슐화 하는게 더 관리적인 측면에서 좋다고 느껴요. 2안을 사용한 컴포넌트를 수정한다면 어느 부모 컴포넌트까지 수정 범위에 들어가는지 판단하는 게 어려움을 느낀 적이 많았어요. 훅으로 관리하게 된다면 훨씬 수정하기에 쉬울 수 있습니다. 누구는 전역 상태로, 혹은 데이터 패칭을 묶어서 커스텀 훅을 만들어서 사용할 수도, 누구는 그냥 부모단에서 지역적인 Context 훅을 만들어 내려줄 수도 있구요. 어떤 방법을 쓰든 비즈니스 로직 자체가 훅에 묶여 관리되기에 이점이 있다 생각합니다. 다만 이제 구현할 당시의 유행하는 디자인 패턴도 어느 정도 영향이 있다 생각이 듭니다. 리액트의 자유분방함으로 인해 여러 패턴이 뜨고 지지만 또 몇 년 뒤엔 앵귤러처럼 엄격히 관심사를 분리하고 의존성을 주입하는 형태로 갈 수도 있으니까요! |
Beta Was this translation helpful? Give feedback.
-
비즈니스 데이터를 사용하는 컴포넌트를 만들 때, 데이터 패칭의 책임을 어디에 둘지 고민이 됩니다.
특히, 비즈니스 데이터와 관련된 컴포넌트를 만들 때 다음 두 가지 패턴이 있는데요.
1안: 부모로부터 id만을 전달받고, Global Store에서 꺼내오기
2안: 부모로부터 데이터를 직접 전달받기
두개의 컴포넌트는 같은 컴포넌트이지만, 다른 Prop을 가지고 있습니다.
저는 GraphQL을 사용해 온 경험이 있어서인지 서버에서 오는 데이터와 관련된 컴포넌트라면 1안을 선호하는 편입니다. 하지만 2안을 선택해야 하는 경우가 있을 것 같은데, 어떤 상황에서 2안이 더 적합한 경우일까요 ?
44 votes ·
Beta Was this translation helpful? Give feedback.
All reactions