인프런 커뮤니티 질문&답변

다삐님의 프로필 이미지
다삐

작성한 질문수

Next + React Query로 SNS 서비스 만들기

react-query SSR 설정하기

서버컴포넌트, 클라이언트 컴포넌트

작성

·

366

0

안녕하세요 .
아직 리액트에 빠져살아서 서버컴포넌트와 클라이언트 컴포넌트 사용 구분이 잘 가지 않아 질문드립니다.

1번 질문.

예를들어 3개의 페이지가 존재한다고 했을때,

각 페이지는 navbar(하위컴포넌트)를 가지려고 하는데요

navbar의 버튼은 각 페이지 마다 다 다른 함수로 동작하게 된다고 가정하면, 3개의 페이지 컴포넌트는 'use-client'를 사용하여 클라이언트 컴포넌트가 되어야 하는게 맞나요?
그렇다면 페이지의 하위컴포넌트를 서버컴포넌트로 만들면 서버컴포넌트로 사용하면 ssr을 사용하는 이유가 충분할까요?

2번질문.
after_login 폴더 안에 _lib폴더에서 'getTrends'함수로 패치를 했는데요, 결국에는 클라이언트 컴포넌트에서 usequery로 데이터를 패치해오고 있습니다. 그러면 데이터 패치도 클라이언트컴포넌트에서 진행하는것인데, 1번상황에 패치도 2번과 같이 한다면 서버사이드렌더링의 장점은 어떤것이라고 볼 수 있을까요?

답변 7

0

다삐님의 프로필 이미지
다삐
질문자

감사합니다 ! children으로 한번 다시 시도해보겠습니다.
지금 제가 이해한 선에서 서비스를 만든다면

뭔가 리엑트에 비해 한 컴포넌트안에 코드가 길어지고, 클릭이 동작하는 작은 컴포넌트들이 굉장히 많아져야 페이지 구현이 가능하려나 싶네요...!!

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

데이터는 서버 컴포넌트가, 구체적 동작은 클라이언트가 하고 클라이언트는 서버컴포넌트를 props로 받아야해서 컴포넌트가 좀 자잘하게 나눠집니다.

0

다삐님의 프로필 이미지
다삐
질문자

ssr을 쓴다는 게 무슨 의미인지 잘 모르겠습니다. =>> 위에 말씀드린 형태의 서비스라면 nextjs가 아닌 react로 쓰는게 더 나은지 질문드린거에요 !


많은 페이지들이 있고 많은 데이터패치가 일어나는 서비스라 빠른 렌더링을 위해 nextjs를 쓰고 싶었어요.
그런데 웹뷰 형태로 만들고, 상단 헤더가 페이지마다 다른 함수가 동작시키고 싶거든요.
그러려다보니 다 클라이언트 컴포넌트로 전환을 시키게 되더라구요. 제가 구현하고 싶은 프로젝트는 nextjs를 쓰는 의미가 없는 프로젝트 일까 싶어서 질물드린겁니다 : )

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

아아, 전부 클라이언트 컴포넌트면 next 쓰는 장점이 거의 없기는 합니다. 근데 상단 헤더 자체를 서버 컴포넌트로 만들어서 데이터 가져와도 됩니다. 아까부터 질문드린 것은 왜 클라이언트 컴포넌트여야하는지가 의문입니다.

MainHeader를 꼭 import해야하나요? children같은 props로 넘기실 수는 없나요?

0

다삐님의 프로필 이미지
다삐
질문자

글 작성중에 답변을 달아주셨네요.

위에 코드 참고해서 봐주세요!
mainheader라는 컴포넌트는 클릭버튼이 있는 헤더인데요.
모든 페이지에 이 mainheader가 들어가게 하고 싶고, 페이지마다 mainheader에 있는 클릭버튼 함수가 다르게 만들어야 해서요 !

일반적으로 리액트에서는 상위페이지에 클릭함수를 가지고 하위컴포넌트에 함수를 props로 보내잖아요?
그런데 그렇게 하려다보니, 모든 페이지가 use client를 작성하지 않으면 페이지 빌드가 안되더라구요ㅠ

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

MainHeader는 클라이언트 컴포넌트입니다. ssr 안 됩니다.

0

다삐님의 프로필 이미지
다삐
질문자

빠른답변 감사합니다.
1번답변.
'use client'로 상위 페이지를 클라이언트컴포넌트로 만들었는데, 하위컴포넌트들 중에 몇개라도 클라이언트 컴포넌트로 전환되지 않은 컴포넌트가 있다면 도움이 되는건지를 묻고 싶었습니다

2번답변 . ts파일에 작성한 getTrends를 불러오는 아래 페이지는 결국 클라이언트컴포넌트입니다.

아래는 제가 커스텀해서 만들어본 페이지 인데요 ,
페이지가 100개가 있는 프로젝트인데 아래 코드처럼 useclient로 만든 페이지들만 100개가 있으면 ssr을 쓸필요가 있는지 궁금합니다 .

"use client";

import MainHeader from "@app/_component/MainHeader";
import { API_URL, Axios } from "@app/_lib/axios";
import { getData } from "@app/_lib/getData";
import { useQuery } from "@tanstack/react-query";

export default function Home({ serverData }: any) {
  const { data } = useQuery({
    queryKey: ["trends"],
    queryFn: getData,
  });

  const clickLeft = () => {
    console.log("11");
  };
  const clickRight = () => {
    console.log("22");
  };
  return (
    <main>
      <MainHeader
        onClickLeftFunc={clickLeft}
        onClickRightFunc={clickRight}
      />
    </main>
  );
}

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

  1. 네 하위 컴포넌트는 서버 컴포넌트로서 그대로 기능합니다.

  2. ssr을 쓴다는 게 무슨 의미인지 잘 모르겠습니다. next.js는 서버 컴포넌트면 ssr됩니다. 클라이언트 컴포넌트만 100개면 ssr 기능은 켜져있어도 ssr 되는 컴포넌트는 없겠죠

0

다삐님의 프로필 이미지
다삐
질문자

삭제된 글입니다

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

아뇨. "대부분의 컴포넌트가 클라이언트로 전환되어야 할 것 같다" 이 문장이 이해가 안 됩니다. 왜 그렇게 생각하시는 건가요? 오히려 상위 컴포넌트들이 서버컴포넌트이고 말단 컴포넌트가 클라이넌트 컴포넌트입니다.

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

  1. 마지막줄 질문이 이해가 안 되는데요. 일단 클라이언트 컴포넌트로 해야할 이유가 없습니다. next.js의 기본은 서버 컴포넌트입니다. 클라이언트 컴포넌트로는 '일부러' 바꾸는 겁니다. use를 쓰는 등의 이유가 있어야 합니다.

  2. ssr을 하면 seo에 도움이 될 수 있고, getTrends로 가져온 데이터는 캐싱되어 다른 사용자에게도 바로 제공됩니다(로딩 속도 빠름). useQuery는 서버에서 가져온 getTrends를 그대로 물려받기 때문에 따로 요청을 보내지 않습니다(캐시 옵샨을 건드려야 하긴 합니다)

0

안녕하세요, 인프런 AI 인턴입니다.

다삐님의 서버 컴포넌트와 클라이언트 컴포넌트 관련 질문에 대하여, 유사한 질문과 답변을 찾아보았습니다. 이를 바탕으로 답변을 제공해드리겠습니다.

서버 컴포넌트와 클라이언트 컴포넌트의 사용 구분

  1. 서버 컴포넌트와 클라이언트 컴포넌트의 차이: 서버 컴포넌트는 서버에서 렌더링되어 전달되는 컴포넌트로, 주로 페이지의 초기 로딩 시 필요한 데이터를 포함하거나 SEO에 유리한 상태로 전달됩니다. 클라이언트 컴포넌트는 브라우저에서 직접 렌더링되는 컴포넌트로, 동적인 상호 작용이 필요한 경우 주로 사용됩니다.

  2. 서버 컴포넌트의 사용 이유: SSR의 주된 이점은 초기 페이지 로딩 속도의 개선과 검색 엔진 최적화(SEO)에 있습니다. 애플리케이션의 초기 상태를 빠르게 로딩하여 사용자에게 제공하고, 검색 엔진이 콘텐츠를 인덱싱할 수 있도록 합니다.

  3. 클라이언트 컴포넌트의 사용: 클라이언트 컴포넌트 주로 동적인 상호 작용이 요구되는 부분에 사용됩니다. 예를 들어, 사용자가 로그인한 후 볼 수 있는 동적인 데이터를 패치하는 경우나, 버튼 클릭과 같은 인터랙티브한 기능을 구현할 때 사용됩니다.

특정 컴포넌트가 서버 컴포넌트인지 클라이언트 컴포넌트인지는 경우에 따라 다를 수 있으며, SSR의 장점을 최대한 활용하기 위해서는 초기 페이지 로드에 필요한 데이터를 포함하는 컴포넌트는 서버에서 렌더링하고, 동적인 상호작용이 필요한 컴포넌트는 클라이언트 컴포넌트로 만드는 것이 일반적입니다.

질문에 대한 좀 더 구체적인 답변이나 예시가 필요하시다면, 다음 링크를 참조하세요:
- 클라이언트 컴포넌트 서버 컴포넌트 질문에서는 서버 컴포넌트와 클라이언트 컴포넌트에 대한 기본적인 개념과 차이점을 설명하고 있습니다. 조현영 강사님께서 제공한 답변에서 SSR과 클라이언트/서버 컴포넌트와의 관계를 이해하는 데 도움이 될 것입니다.

또한, 서버 컴포넌트 fetch와 클라이언트 컴포넌트 fetch 구분 질문에서는 서버와 클라이언트 컴포넌트에서 데이터를 패치하는 방식의 구분과 사용 예를 설명하고 있어, 이와 관련된 질문에 대한 인사이트를 얻으실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

다삐님의 프로필 이미지
다삐

작성한 질문수

질문하기