- Notifications
You must be signed in to change notification settings - Fork173
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
-
비즈니스 데이터를 사용하는 컴포넌트를 만들 때, 데이터 패칭의 책임을 어디에 둘지 고민이 됩니다. 1안: 부모로부터 id만을 전달받고, Global Store에서 꺼내오기functionPost({ postId}:{postId:string}){const{ username, comment, likeCount}=usePost(postId);return(<div><h1>{username}</h1><p>{comment}</p><p>{likeCount}</p></div>);} 2안: 부모로부터 데이터를 직접 전달받기functionPost({ username, comment, likeCount}:{username:string;comment:string;likeCount:number}){return(<div><h1>{username}</h1><p>{comment}</p><p>{likeCount}</p></div>);} 두개의 컴포넌트는 같은 컴포넌트이지만, 다른 Prop을 가지고 있습니다. 저는 GraphQL을 사용해 온 경험이 있어서인지 서버에서 오는 데이터와 관련된 컴포넌트라면 1안을 선호하는 편입니다. 하지만 2안을 선택해야 하는 경우가 있을 것 같은데,어떤 상황에서 2안이 더 적합한 경우일까요 ? |
컴포넌트에서 책임 분리: id만 넘기기 vs 데이터 직접 전달하기 부모로부터 id만을 전달받고, Global Store에서 꺼내오기 51% 부모로부터 데이터를 직접 전달받기 48% 94 votes· |
BetaWas this translation helpful?Give feedback.
All reactions
👀 1
Replies: 5 comments 5 replies
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
-
저라면 개인적으로 2안을 선택할 것 같습니다. 데이터 페칭 훅인 usePost는 Post 컴포넌트에서 분리가 가능해 보입니다. 만약 Post 컴포넌트를 다른 사용처에서 재사용 할 때 부모 컴포넌트에서 데이터를 이미 들고 있다면, username, comment, likeCount를 props로 주입해야 하는 경우가 생길 수 있겠다는 생각이 듭니다! |
BetaWas this translation helpful?Give feedback.
All reactions
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
-
Post가 재사용이 된다고 가정했을 때, 추가로 설명 파트를 그리는 요구사항이 들어온다고 가정한다면, description이라는 추가 필드가 생길 수 있을텐데요. 2안의 경우 해당 컴포넌트를 사용하는 모든 곳에 Prop을 바꿔줘야하는 경우가 생기지 않을까요? 1안에선 Post 컴포넌트 안에서 usePost 훅에서 description 필드를 가져와 재사용되는 컴포넌트는 id만 넘기고 신경 쓰면 될 것 같다고 생각했어요 ! |
BetaWas this translation helpful?Give feedback.
All reactions
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
-
Post 컴포넌트는 어떻게 보면 비즈니스 로직 컴포넌트인데, Post 컴포넌트가 usePost에서 오는 데이터 없이 (서버에서 주는 데이터 없이) 사용할 일이 있을까 ? 에 대한 관점도 존재하는 것 같아용 |
BetaWas this translation helpful?Give feedback.
All reactions
-
이에 맞춰서 2안이 조금 더 유연한 사고 및 확장이 가능하다고 생각이 드네요! |
BetaWas this translation helpful?Give feedback.
All reactions
-
결국, Post는 “Post를 책임지는 컴포넌트”이니, 데이터를 가져오는 것까지 맡는 게 자연스럽지 않을까요? |
BetaWas this translation helpful?Give feedback.
All reactions
❤️ 9
-
저도 1안을 선호합니다. react hook 이 나온뒤 dan abramov 는 아래 코멘트와 함께 글을 업데이트했습니다.
즉 Custom hook 으로 비즈니스 로직을 충분히 잘 분리하면 컴포넌트 하나에서 props 로 모두 내려주는것과 거의 동일하게 관심사가 분리된다고 생각해요
functionPost({ 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 역할을 어느정도 같이 할 수 있는 좋은 라이브러리를 많이 사용할 때에는 더욱 유용하다고 생각해요. |
BetaWas this translation helpful?Give feedback.
All reactions
-
저도 정확히 이렇게 생각했어요. |
BetaWas this translation helpful?Give feedback.
All reactions
-
저는 배열을 순회하는 경우인지, 단일 컴포넌트를 렌더링하는 경우인지에 따라 데이터 전달 방식이 달라져야 한다고 생각합니다. 배열을 순회하는 경우에는, 데이터 페칭의 책임이 Posts(또는 PostList) 컴포넌트에 있다고 보기 때문에, 반면, Post 목록을 렌더링할 때 id만 전달하는 방식처럼 Post 컴포넌트 내부에서 데이터를 다시 가져오게 되면, 하지만 상세 페이지처럼 단일 컴포넌트를 렌더링하는 경우에는, id만 전달하고 내부에서 데이터를 조회하는 방식이 더 자연스럽게 느껴집니다. ( 해당 게시글 내의 댓글과 동일하게 생각합니다. ) |
BetaWas this translation helpful?Give feedback.
All reactions
👍 2
-
저도 이 의견에 동의합니다! 데이터 패칭의 책임이 Post의 부모에 있을 경우, 아래처럼 PostList에서 usePostList를 사용하여 데이터를 가져오고, Post 컴포넌트에 개별 데이터를 props로 전달하는 방식이 적절합니다. functionPostList(){const{ posts}=usePostList();return(<div>{posts.map((post)=>(<Postkey={post.id}username={post.username}comment={post.comment}likeCount={post.likeCount}/>))}</div>);} 즉, 게시물 목록을 보여주는 페이지에서는 2안처럼 부모에서 데이터를 패칭하고 자식 컴포넌트로 전달하는 방식이 적합하다고 생각합니다. 정리하자면
|
BetaWas this translation helpful?Give feedback.
All reactions
👍 2
-
약간React Server Component에서 Data Fetching을 어느 단계에서 해야 할 지 고민입니다랑 비슷한 고민으로 바라봤는데요! 저는 컴포넌트를 추상화하지 않아야 할 때, 즉부모 컴포넌트가 더 직접적인 제어권을 가져야 하는 상황 에서는 2안을 고려해볼 만하다고 생각해요. 다만 이 중앙에 배치하는 관점이@ysm-dev님이 언급해주셨듯이 훅이 도입된 이후로 컴포넌트 단위의 엄격한 Presentational-Container 패턴을 중시하지 않게 된 거 같아요. 컴포넌트 재사용성 관점에서 설계를 바라보는 경향을 데이터 패칭과 묶어서 바라보는 관점으로 바뀌어 가고 있다고 봅니다. 개인적으론 1번 방식을 선호합니다! 비즈니스 로직과 View 응집도를 부모단에서 관리하기보단 내부로 캡슐화 하는게 더 관리적인 측면에서 좋다고 느껴요. 2안을 사용한 컴포넌트를 수정한다면 어느 부모 컴포넌트까지 수정 범위에 들어가는지 판단하는 게 어려움을 느낀 적이 많았어요. 훅으로 관리하게 된다면 훨씬 수정하기에 쉬울 수 있습니다. 누구는 전역 상태로, 혹은 데이터 패칭을 묶어서 커스텀 훅을 만들어서 사용할 수도, 누구는 그냥 부모단에서 지역적인 Context 훅을 만들어 내려줄 수도 있구요. 어떤 방법을 쓰든 비즈니스 로직 자체가 훅에 묶여 관리되기에 이점이 있다 생각합니다. 다만 이제 구현할 당시의 유행하는 디자인 패턴도 어느 정도 영향이 있다 생각이 듭니다. 리액트의 자유분방함으로 인해 여러 패턴이 뜨고 지지만 또 몇 년 뒤엔 앵귤러처럼 엄격히 관심사를 분리하고 의존성을 주입하는 형태로 갈 수도 있으니까요! |
BetaWas this translation helpful?Give feedback.
All reactions
👍 1