Next.js에서 use client 뭔지 알고 쓰자

2024. 10. 29. 10:34·프로젝트/GitHub Profile Viewer
728x90

Next.js를 사용하시는 분들이라면, 공부를 해보신 분들이라면 "use client"로 페이지 렌더링을 어떻게 할지 설정한 경우가 있을 거에요. 아 혹시!! 렌더링을 설정한다는 것도 모르겼나요?? 괜찮습니다. 제가 그랬거든요.

오늘은 "use client"!!!!
"대체 언제 써야 하고, 왜 중요한 거지?" 에 대해서 알려드릴게요!


1. Next.js: 서버에서? 브라우저에서?

Next.js는 SSR(서버 사이드 렌더링) 덕분에 서버에서 HTML을 미리 만들어서 쏴줍니다. 덕분에 SEO에도 좋고 초기 로딩도 빠르죠! 근데… 모든 걸 SSR로 해결할 수는 없어요. 🤔 예를 들어, 우리가 버튼을 클릭하거나 스크롤 이벤트를 처리하고 싶다면 브라우저에서 실행해야겠죠?

여기서 바로 CSR(클라이언트 사이드 렌더링)이 필요해요. 그리고 Next.js에서는 "use client" 선언을 통해 "이 컴포넌트는 브라우저에서 돌아가야 한다!"고 알려주는 거예요. 💡

즉, 기본은 SSR을 사용하지만, 특수한 경우 "use client"를 사용하여 CSR을 사용하겠다! 라고 말하는거죠.


2. use client가 뭐야?

"use client"는 클라이언트 컴포넌트를 선언하는 문장입니다. 👀 서버 컴포넌트가 기본값이라 컴포넌트에 아무런 선언을 하지 않으면 서버에서 돌아가요.

더보기

서버 컴포넌트(Server Component)

서버 컴포넌트는 서버 측에서만 실행되고, HTML을 미리 생성해서 클라이언트로 전달하는 컴포넌트예요. 이 컴포넌트는 서버 자원을 활용해서 데이터베이스와 연동하거나, 무거운 연산을 처리하는 데 적합해요.

클라이언트 컴포넌트(Client Component)

클라이언트 컴포넌트는 브라우저에서 실행되는 컴포넌트입니다. 버튼 클릭 이벤트, 입력 필드 처리, 상태 관리 등 사용자와의 인터랙션이 필요한 부분에 사용돼요. 서버에서는 실행되지 않기 때문에 브라우저 전용 기능(예: window, localStorage)도 사용할 수 있어요.

근데 우리가 클라이언트에서만 가능한 작업을 하려고 하면? 예를 들면 window 객체를 건드린다거나, useState로 상태를 관리하는 거요. 이때는 "use client"를 선언해 줘야 하는 거죠! 이 친구 없으면 서버는 아~무것도 모르고 에러를 뱉을 수 있어요. 😂


3. 언제 use client를 써야 할까?

자, 이제 "use client"를 꼭 써야 하는 경우를 몇 가지 알려드릴게요!

1) 상태 관리와 이벤트 처리

클라이언트에서 상태(useState)를 관리하거나 버튼 클릭 같은 이벤트 처리를 하고 싶다면?

"use client"; 

import { useState } from "react";

export default function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increase</button>
    </div>
  );
}

이 컴포넌트는 무조건 브라우저에서 돌아가야 해요! 서버에서는 useState를 지원하지 않으니까요.

 

2) 브라우저 전용 API 사용

window, document 같은 브라우저 객체는 서버가 알 수 없는 영역입니다. 예를 들어, 사용자의 화면 크기를 감지해보고 싶다면 이렇게 해야겠죠?

"use client";

import { useEffect, useState } from "react";

export default function WindowSize() {
  const [width, setWidth] = useState(window.innerWidth);

  useEffect(() => {
    const handleResize = () => setWidth(window.innerWidth);
    window.addEventListener("resize", handleResize);

    return () => window.removeEventListener("resize", handleResize);
  }, []);

  return <div>Window width: {width}px</div>;
}

서버에서는 실행이 안 되는 코드입니다. 이럴 때 "use client"를 사용합니다.

 

3) useEffect로 비동기 작업 수행

클라이언트에서 데이터를 불러와야 할 때도 "use client"가 필요합니다.

"use client";

import { useEffect, useState } from "react";

export default function FetchData() {
  const [data, setData] = useState([]);

  useEffect(() => {
    fetch("https://jsonplaceholder.typicode.com/posts")
      .then((res) => res.json())
      .then((data) => setData(data));
  }, []);

  return (
    <div>
      {data.map((post) => (
        <p key={post.id}>{post.title}</p>
      ))}
    </div>
  );
}

이런 비동기 작업은 서버가 아니라 브라우저에서 실행돼야겠죠?


4. SSR vs CSR: 언제 뭐 쓰면 좋을까?

SSR (서버 사이드 렌더링)CSR (클라이언트 사이드 렌더링)

SSR (서버 사이드 렌더링) CSR (클라이언트 사이드 렌더링)
서버에서 HTML을 미리 만들어 보낸다. 브라우저에서 모든 렌더링이 일어난다.
SEO에 유리하고 초기 로딩이 빠르다. 사용자 인터랙션에 더 적합하다.
서버 리소스를 사용한다. 브라우저 리소스를 사용한다.

👉 요약:

  • 초기 로딩 속도와 SEO가 중요하다면 SSR!
  • 사용자 인터랙션과 상태 관리가 많다면 CSR!

"이 컴포넌트는 브라우저에서 돌아가야 한다!" 싶을 때, 망설이지 말고 "use client"를 선언하세요. Next.js는 기본적으로 서버에서 렌더링되니까, 브라우저 전용 기능이 필요할 때만 CSR로 바꿔주면 됩니다.하지만 불필요한 곳에도 "use client"를 마구마구 사용하면 번들의 크기가 커져버려요.. 그래서 정말 필요한 곳에만 사용하는게 중요합니다!

728x90

'프로젝트 > GitHub Profile Viewer' 카테고리의 다른 글

async/await 내가 쉽고 재미있게 알려줄게!🤚🏻  (2) 2024.10.29
비동기 작업과 Promise  (2) 2024.10.29
TurboPack 뭔지 알려드림. NextJS설치할 때 나오는 그거.  (5) 2024.10.29
대학생이라면 프로젝트, 다른 전공 학생이랑 반드시 해보세요!  (1) 2024.10.29
GitHub REST API 사용법  (2) 2024.10.28
'프로젝트/GitHub Profile Viewer' 카테고리의 다른 글
  • async/await 내가 쉽고 재미있게 알려줄게!🤚🏻
  • 비동기 작업과 Promise
  • TurboPack 뭔지 알려드림. NextJS설치할 때 나오는 그거.
  • 대학생이라면 프로젝트, 다른 전공 학생이랑 반드시 해보세요!
튼튼발자
튼튼발자
프론트엔드 개발자입니다. 헬스를 가끔해서인지 몸이 튼튼한거 같습니다. 그래서 튼튼한 개발자 => 튼튼발자입니다. 프론트엔드 및 관련 개발 내용 블로그 글로 정리해서 올려둡니다.
    250x250
  • 튼튼발자
    튼튼발자
    튼튼발자
  • 전체
    오늘
    어제
    • 분류 전체보기 (192)
      • 튼튼발자의 끄적끄적 (10)
      • 웹개발 (94)
        • HTML (5)
        • CSS (2)
        • JavaScript (40)
        • TypeScript (5)
        • REACT (22)
        • Next.js (13)
        • GIt (7)
      • 기타 (3)
        • 일상 (3)
      • 프로젝트 (27)
        • Componique: UI 컴포넌트 라이브러리 (18)
        • GitHub Profile Viewer (8)
        • 잇핏 (1)
      • 프론트엔드 개발자로 취업준비 (1)
        • 기술 면접 (7)
        • 코딩 테스트 준비하기 (0)
        • 자기소개서&지원서&이력서 (0)
      • 컴퓨터과학 (12)
        • 운영체제 (6)
        • 알고리즘 (6)
      • 전공 공부 (37)
        • AI(인공지능) (2)
        • 컴퓨터네트워크 (19)
        • 네트워크프로그래밍 (3)
        • SW소프트웨어응용설계 (7)
        • 클라우드컴퓨팅 (3)
        • 웹서비스프로그래밍 (3)
      • PT (0)
      • 취준일기 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    JavaScript
    NextJs
    componique
    tailwind
    JS
    ui컴포넌트
    트랜스포트계층
    TCP
    프로그래밍
    github
    react
    프론트엔드개발
    네트워크
    웹개발
    상태관리
    자바스크립트
    데이터전송
    리액트
    프론트엔드
    코딩
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
튼튼발자
Next.js에서 use client 뭔지 알고 쓰자
상단으로

티스토리툴바