개발자
현재까지 React를 사용하다가 SEO측면이나 사용자 경험 등 여러 방면에서 서버 사이드 렌더링이 갖는 장점이 크다 생각하여, Next로 프로젝트를 하면서 공부하는 중입니다. 지금까지 Next로 프로젝트를 진행하면서, 구글에 찾아봐도 명쾌하게 답을 얻지 못한 문제가 있어서 질문드립니다! 공식문서에서는 최대한 서버 컴포넌트로 만들고, 상호작용이 필요한 부문만 최대한 작게 클라이언트 컴포넌트로 만드는 것을 추천하고 있습니다. 이 말은 당연하게도 이해가 잘 되었습니다. 하지만 제가 만들고 있는 프로젝트에는 검색 페이지, 유저 페이지 등이 있습니다. 검색 페이지를 예로 들면, 사용자가 입력한 검색어를 쿼리 파라미터로 검색 결과 페이지에 넘겨주게 되고, 해당 검색어에 해당하는 데이터를 불러와야 합니다. 그 과정에서 검색어를 useParams()를 사용해서 받아오게 되는데, 이러한 훅을 사용하려면 클라이언트 컴포넌트여야 합니다. 그렇게 최상단에서 검색어를 파싱해서 데이터를 불러와 자식 컴포넌트들에게 넘겨주게 되면, 결국 루트가 클라이언트 컴포넌트가 되어 버리는데, 이런 검색 결과 페이지와 같은 경우엔 SSR이 큰 의미가 없나요?? 비슷한 원리로, 유저의 마이페이지와 같은 경우엔 유저 정보를(userId 등) 이용해서 데이터를 불러와 해당 유저의 정보를 보여주게 되는데, 유저 정보를 프론트 서버에서 페이지를 보내주는 시점에는 알 수 없습니다. 때문에 검색 페이지와 비슷하게 recoil의 atom 등과 같은 곳에서 유저 정보를 빼와서 데이터를 불러오게 될텐데, 그럼 이 경우에도 루트가 클라이언트 컴포넌트가 되어 버립니다. 이렇게 동적으로 발생하는 데이터를 이용해서 데이터를 불러오는 페이지는 SSR이 큰 의미가 없는 것인지 궁금합니다!! 개발 초보라 완전히 잘못 이해하고 있는 것일 수도 있지만, 바로 잡아주시면 감사하겠습니다!
답변 1
아마 Layout 부분에 감싸서 최상위 컴포넌트가 클라이언트 컴포넌트니까 하위 요소들도 클라이언트 컴포넌트라고 생각하시는거 같습니다. 초보시니 자세한 내용은 생략하겠습니다. 1. <SomeClientComponent>{children}</SomeClientComponent> 1번처럼 하면 children 안에 있는 리액트 노드는 무조건 클라이언트 컴포넌트가 되는건 아닙니다. 확인해보고 싶으시다면 console.log 찍어서 브라우저에 찍히나 개발환경 콘솔에 찍히나 보세요. 2. <SomeClientComponent> <퉁퉁이/> <도라에몽/> <노진구/> </SomeClientComponent> 2번처럼 하면 퉁퉁이, 도라에몽 그리고 노진구는 클라이언트 컴포넌트가 됩니다. 'use client'가 적혀있지 않아도 클라이언트 컴포넌트가 됩니다.
안재국
작성자
한양대학교 컴퓨터 소프트웨어 학부 • 2024년 03월 02일
답변 감사드립니다!! 그럼에도 헷갈리는 부분은 동적으로 바뀌는 데이터통해 데이터를 불러온 렌더링을 히는 역할을 하는 애들은 전부 클라이언트 컴포넌트가 되어야 하는 것 맞나요?
포크코딩
별빛상단 단주 • 2024년 03월 02일
'바뀐다'라는 부분을 엄청 넓은 범위에서 이해하고 계신거 같습니다. 많은 부분들이 동적인 요소일텐데 너무 넓게 생각하면 매번 햇갈리실듯 싶습니다. 질문하신 부분에 대한 절대적인 기준은 '브라우저(클라이언트)' 기능을 사용해야 하는가 말아야 하는가입니다. 동적으로 바뀌는 데이터가 브라우저 기능에 영향을 받는다면 클라이언트 컴포넌트를 사용하세요. 아니라면 서버컴포넌트를 사용하세요.
안재국
작성자
한양대학교 컴퓨터 소프트웨어 학부 • 2024년 03월 02일
제가 말씀드린 동적인 부분은 질문에서와 같이 사용자가 "로그인" 또는 "검색어 입력" 과 같은 행위를 한 후에 얻을 수 있는 아이디, 검색어와 같은 부분들이었습니다! 답답하실 수 있지만 좋은 답변 남겨주셔서 감사합니다! 열심히 더 찾아보고 적용해보도록 하겠습니다
포크코딩
별빛상단 단주 • 2024년 03월 02일
아하, 로그인 관련한 부분은 꼭 클라이언트 컴포넌트일 필요 없습니다. 검색어 입력 같은 경우는 input 요소에 해당하는 dom을 조작하는 행위기 때문에 클라이언트 컴포넌트여야 합니다!
안재국
작성자
한양대학교 컴퓨터 소프트웨어 학부 • 2024년 03월 02일
앗 더 나아가서 그 로그인으로 인해 얻은 사용자의 id를 가지고 데이터를 불러와서 보여주는 마이페이지 같은 경우에, 그 데이터를 받아서 렌더링 해야 한다면 그 컴포넌트들은 자연스럽게 클라이언트 컴포넌트인가요??
포크코딩
별빛상단 단주 • 2024년 03월 02일
구현 방식에 따라 다릅니다. 서버 컴포넌트로도 세션을 받아서 원하는 기능은 구현할 수 있습니다.
안재국
작성자
한양대학교 컴퓨터 소프트웨어 학부 • 2024년 03월 02일
오오 그 방식에 대해서도 한번 찾아보겠습니다! 친절히 답변해주셔서 너무 감사합니다. 많은 도움이 되었습니다
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 03월 02일
Next.js에서는 `getServerSideProps`나 `getInitialProps`를 사용하여 서버 사이드에서 데이터를 불러올 수 있습니다. 이를 이용하면, 서버 사이드에서 API 호출 등을 통해 필요한 데이터를 미리 가져와서 클라이언트에게 제공 할 수 있습니다. 검색 페이지의 경우, 검색어는 URL의 쿼리 스트링으로 전달되고 `getServerSideProps`에서 이 쿼리 스트링을 받아서 검색 결과를 받아오는 API 요청을 하는 것이 가능합니다. Next.js의 SSR 기능을 사용하면 초기 로딩 시점에 필요한 데이터를 이미 갖고 있기 때문에 성능과 SEO 측면에서 장점이 있습니다. 유저 페이지(혹은 마이페이지) 역시 동일한 원리로 작동하는데, 유저 인증 관련 정보가 쿠키나 세션 등에 저장되어 있다면, `getServerSideProps`나 `getInitialProps`에서 해당 정보를 사용해 데이터를 불러올 수 있습니다. 클라이언트 사이드에서 발생하는 상호작용(예: 버튼 클릭으로 인한 이벤트 처리 등)은 클라이언트 컴포넌트에서 처리하되 초기 로딩에 필요한 데이터는 서버사이드에서 미리 불러와서 제공함으로써 서버 사이드 렌더링의 효과를 극대화할 수 있습니다. 그리고 이것이 Next.js의 주요 장점 중 하나입니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!