'use client' - This feature is available in the latest Canary

Canary

'use client'๋Š” React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ทธ์™€ ํ˜ธํ™˜๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๋•Œ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

'use client'๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ ˆํผ๋Ÿฐ์Šค

'use client'

ํŒŒ์ผ์˜ ์ตœ์ƒ๋‹จ์— 'use client'๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ชจ๋“ˆ๊ณผ ํ•ด๋‹น ๋ชจ๋“ˆ์˜ ์ „์ด์  ์ข…์†์„ฑ์„ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋กœ ํ‘œ์‹œํ•˜์„ธ์š”.

'use client';

import { useState } from 'react';
import { formatDate } from './formatters';
import Button from './button';

export default function RichTextEditor({ timestamp, text }) {
const date = formatDate(timestamp);
// ...
const editButton = <Button />;
// ...
}

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ 'use client'๋ผ๊ณ  ํ‘œ์‹œ๋œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋ฉด ํ˜ธํ™˜๋˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ๋Š” import๋ฅผ ์„œ๋ฒ„ ์‹คํ–‰ ์ฝ”๋“œ์™€ ํด๋ผ์ด์–ธํŠธ ์‹คํ–‰ ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฒฝ๊ณ„๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

RichTextEditor์˜ ์ข…์†์„ฑ์œผ๋กœ formatDate์™€ Button๋„ ํ•ด๋‹น ๋ชจ๋“ˆ์— 'use client' ์ง€์‹œ์–ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋”๋ผ๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์ด ์„œ๋ฒ„ ์ฝ”๋“œ์—์„œ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ์„œ๋ฒ„์—์„œ, ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ํ‰๊ฐ€๋  ์ˆ˜ ์žˆ์Œ์„ ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ

  • 'use client'๋Š” ํŒŒ์ผ์˜ ๋งจ ์ฒ˜์Œ์— ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์ฝ”๋“œ๋‚˜ import ๋ฌธ๋ณด๋‹ค ์œ„์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ฃผ์„์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค). ์ž‘์€๋”ฐ์˜ดํ‘œ๋‚˜ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฉฐ ๋ฐฑํ‹ฑ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • 'use client' ๋ชจ๋“ˆ์„ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ ๋ Œ๋”๋ง ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ ธ์˜ค๋ฉด ์ง€์‹œ์–ด๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ๋ชจ๋“ˆ์— 'use client' ์ง€์‹œ์–ด๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ์‚ฌ์šฉ์€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์ž„์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปดํฌ๋„ŒํŠธ์— 'use client' ์ง€์‹œ์–ด๊ฐ€ ์—†๋”๋ผ๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ํ‰๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ์€ 'use client' ์ง€์‹œ์–ด๊ฐ€ ํฌํ•จ๋œ ๋ชจ๋“ˆ์— ์ •์˜๋˜์–ด ์žˆ๊ฑฐ๋‚˜ 'use client' ์ง€์‹œ์–ด๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“ˆ์˜ ์ „์ด์  ์ข…์†์„ฑ์ผ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ํ‰๊ฐ€๋กœ ํ‘œ์‹œ๋œ ์ฝ”๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๋ชจ๋“ˆ ํ•˜์œ„ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ์— ์ „์†ก๋˜์–ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ํ‰๊ฐ€ ๋ชจ๋“ˆ์ด 'use client' ๋ชจ๋“ˆ์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ, ๊ทธ ๊ฐ’์€ React ์ปดํฌ๋„ŒํŠธ์ด๊ฑฐ๋‚˜ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋Š” ์ง€์›๋˜๋Š” ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ prop ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

'use client'๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•

React ์•ฑ์—์„œ ์ปดํฌ๋„ŒํŠธ๋Š” ์ข…์ข… ๋ณ„๋„์˜ ํŒŒ์ผ ๋˜๋Š” ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•ฑ์˜ ๊ฒฝ์šฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ฑ์€ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค. 'use client'๋Š” ๋ชจ๋“ˆ ์ข…์†์„ฑ ํŠธ๋ฆฌ์— ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๊ณ„๋ฅผ ๋„์ž…ํ•˜์—ฌ ํšจ๊ณผ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋“ˆ์˜ ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด๋ฅผ ๋” ์ž˜ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์•ฑ์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”.

import FancyText from './FancyText';
import InspirationGenerator from './InspirationGenerator';
import Copyright from './Copyright';

export default function App() {
  return (
    <>
      <FancyText title text="Get Inspired App" />
      <InspirationGenerator>
        <Copyright year={2004} />
      </InspirationGenerator>
    </>
  );
}

์˜ˆ์ œ ์•ฑ์˜ ๋ชจ๋“ˆ ์ข…์†์„ฑ ํŠธ๋ฆฌ์—์„œ InspirationGenerator.js์˜ 'use client' ์ง€์‹œ์–ด๋Š” ํ•ด๋‹น ๋ชจ๋“ˆ๊ณผ ๋ชจ๋“  ์ „์ด์  ์ข…์†์„ฑ์„ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋“ˆ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ InspirationGenerator.js์—์„œ ์‹œ์ž‘ํ•˜๋Š” ํ•˜์œ„ ํŠธ๋ฆฌ๋Š” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋“ˆ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

A tree graph with the top node representing the module 'App.js'. 'App.js' has three children: 'Copyright.js', 'FancyText.js', and 'InspirationGenerator.js'. 'InspirationGenerator.js' has two children: 'FancyText.js' and 'inspirations.js'. The nodes under and including 'InspirationGenerator.js' have a yellow background color to signify that this sub-graph is client-rendered due to the 'use client' directive in 'InspirationGenerator.js'.
A tree graph with the top node representing the module 'App.js'. 'App.js' has three children: 'Copyright.js', 'FancyText.js', and 'InspirationGenerator.js'. 'InspirationGenerator.js' has two children: 'FancyText.js' and 'inspirations.js'. The nodes under and including 'InspirationGenerator.js' have a yellow background color to signify that this sub-graph is client-rendered due to the 'use client' directive in 'InspirationGenerator.js'.

'use client'๋Š” React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์•ฑ์˜ ๋ชจ๋“ˆ ์ข…์†์„ฑ ํŠธ๋ฆฌ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ InspirationGenerator.js์™€ ๋ชจ๋“  ์ข…์†์„ฑ์„ ํด๋ผ์ด์–ธํŠธ-๋ Œ๋”๋ง์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„œ๋ฒ„-๋ Œ๋”๋งํ•˜๊ณ  ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ณ„์† ์ง„ํ–‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ๋ฅผ ํ‰๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•œ ๋ Œ๋” ํŠธ๋ฆฌ ๋ถ€๋ถ„์„ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ํด๋ผ์ด์–ธํŠธ๋Š” ํŠธ๋ฆฌ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„ ๋ Œ๋”๋ง์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

A tree graph where each node represents a component and its children as child components. The top-level node is labelled 'App' and it has two child components 'InspirationGenerator' and 'FancyText'. 'InspirationGenerator' has two child components, 'FancyText' and 'Copyright'. Both 'InspirationGenerator' and its child component 'FancyText' are marked to be client-rendered.
A tree graph where each node represents a component and its children as child components. The top-level node is labelled 'App' and it has two child components 'InspirationGenerator' and 'FancyText'. 'InspirationGenerator' has two child components, 'FancyText' and 'Copyright'. Both 'InspirationGenerator' and its child component 'FancyText' are marked to be client-rendered.

React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์•ฑ์„ ์œ„ํ•œ ๋ Œ๋” ํŠธ๋ฆฌ์—์„œ InspirationGenerator์™€ ๊ทธ ์ž์‹ ์ปดํฌ๋„ŒํŠธ FancyText๋Š” ํด๋ผ์ด์–ธํŠธ ํ‘œ์‹œ ์ฝ”๋“œ์—์„œ ๋‚ด๋ณด๋‚ธ ์ปดํฌ๋„ŒํŠธ์ด๋ฉฐ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ •์˜๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ๋ Œ๋” ํŠธ๋ฆฌ์˜ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง ๋˜๋Š” ๋ Œ๋” ํŠธ๋ฆฌ์˜ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ ์•ฑ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ App, FancyText ๋ฐ Copyright๋Š” ๋ชจ๋‘ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง ๋˜๋ฉฐ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. InspirationGenerator.js์™€ ๊ทธ ์ „์ด์  ์ข…์†์„ฑ์ด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋กœ ํ‘œ์‹œ๋˜๋ฏ€๋กœ ์ปดํฌ๋„ŒํŠธ InspirationGenerator์™€ ๊ทธ ์ž์‹ ์ปดํฌ๋„ŒํŠธ FancyText๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

Deep Dive

์–ด๋–ป๊ฒŒ FancyText๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์ด๋ฉด์„œ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์ธ๊ฐ€์š”?

์œ„ ์ •์˜์— ๋”ฐ๋ฅด๋ฉด FancyText ์ปดํฌ๋„ŒํŠธ๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์ด์ž ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์„๊นŒ์š”?

์šฐ์„ , โ€œ์ปดํฌ๋„ŒํŠธโ€๋ผ๋Š” ์šฉ์–ด๊ฐ€ ๊ทธ๋‹ค์ง€ ์ •ํ™•ํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ํ•ด ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค. โ€œ์ปดํฌ๋„ŒํŠธโ€๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. โ€์ปดํฌ๋„ŒํŠธโ€๋Š” ์ปดํฌ๋„ŒํŠธ ์ •์˜๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ํ•จ์ˆ˜์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
// This is a definition of a component
function MyComponent() {
return <p>My Component</p>
}
  1. โ€์ปดํฌ๋„ŒํŠธโ€๋Š” ๊ทธ ์ •์˜์˜ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
import MyComponent from './MyComponent';

function App() {
// This is a usage of a component
return <MyComponent />;
}

๊ฐœ๋…์„ ์„ค๋ช…ํ•  ๋•Œ ์ข…์ข… ๋ถ€์ •ํ™•์„ฑ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ, ์ด ๊ฒฝ์šฐ์—๋Š” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์— ๊ด€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ, ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ 'use client' ์ง€์‹œ์–ด๊ฐ€ ์žˆ๋Š” ๋ชจ๋“ˆ์—์„œ ์ •์˜๋˜์—ˆ๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ฐ€์ ธ์™€ ํ˜ธ์ถœ๋œ๋‹ค๋ฉด ๊ทธ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ์€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.
A tree graph where each node represents a component and its children as child components. The top-level node is labelled 'App' and it has two child components 'InspirationGenerator' and 'FancyText'. 'InspirationGenerator' has two child components, 'FancyText' and 'Copyright'. Both 'InspirationGenerator' and its child component 'FancyText' are marked to be client-rendered.
A tree graph where each node represents a component and its children as child components. The top-level node is labelled 'App' and it has two child components 'InspirationGenerator' and 'FancyText'. 'InspirationGenerator' has two child components, 'FancyText' and 'Copyright'. Both 'InspirationGenerator' and its child component 'FancyText' are marked to be client-rendered.
๋ Œ๋” ํŠธ๋ฆฌ๋Š” ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

FancyText์— ๊ด€ํ•œ ์งˆ๋ฌธ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ์ด ์ปดํฌ๋„ŒํŠธ ์ •์˜์—๋Š” 'use client' ์ง€์‹œ์–ด๊ฐ€ ์—†์œผ๋ฉฐ ๋‘ ๊ฐ€์ง€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

FancyText๋ฅผ App์˜ ์ž์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. FancyText๋ฅผ ๊ฐ€์ ธ์™€์„œ InspirationGenerator์—์„œ ํ˜ธ์ถœํ•  ๋•Œ InspirationGenerator์— 'use client' ์ง€์‹œ์–ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ FancyText์˜ ์‚ฌ์šฉ์€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

์ด๋Š” FancyText์— ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ ์ •์˜๊ฐ€ ์„œ๋ฒ„์—์„œ ํ‰๊ฐ€๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ์„ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‚ด๋ ค๋ฐ›๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Deep Dive

Copyright ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ InspirationGenerator์˜ ์ž์‹์œผ๋กœ ๋ Œ๋”๋ง ๋˜์ง€๋งŒ ์ด๊ฒƒ์ด ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ผ๋Š” ์‚ฌ์‹ค์— ๋†€๋ž„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

'use client' ์ง€์‹œ์–ด๋Š” ๋ชจ๋“ˆ ์ข…์†์„ฑ ํŠธ๋ฆฌ(๋ Œ๋” ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹Œ)์—์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ๊ฐ„์˜ ๊ฒฝ๊ณ„๋ฅผ ์ •์˜ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.

A tree graph with the top node representing the module 'App.js'. 'App.js' has three children: 'Copyright.js', 'FancyText.js', and 'InspirationGenerator.js'. 'InspirationGenerator.js' has two children: 'FancyText.js' and 'inspirations.js'. The nodes under and including 'InspirationGenerator.js' have a yellow background color to signify that this sub-graph is client-rendered due to the 'use client' directive in 'InspirationGenerator.js'.
A tree graph with the top node representing the module 'App.js'. 'App.js' has three children: 'Copyright.js', 'FancyText.js', and 'InspirationGenerator.js'. 'InspirationGenerator.js' has two children: 'FancyText.js' and 'inspirations.js'. The nodes under and including 'InspirationGenerator.js' have a yellow background color to signify that this sub-graph is client-rendered due to the 'use client' directive in 'InspirationGenerator.js'.

'use client' ์ง€์‹œ์–ด๋Š” ๋ชจ๋“ˆ ์ข…์†์„ฑ ํŠธ๋ฆฌ์—์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ๊ฒฝ๊ณ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ์ข…์†์„ฑ ํŠธ๋ฆฌ์—์„œ App.js๋Š” Copyright.js ๋ชจ๋“ˆ๋กœ๋ถ€ํ„ฐ Copyright๋ฅผ ๊ฐ€์ ธ์™€ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Copyright.js์—๋Š” 'use client' ์ง€์‹œ์–ด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ์ด ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค. App์€ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” JSX๋ฅผ props๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ InspirationGenerator๋Š” Copyright๋ฅผ ์ž์‹์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ InspirationGenerator ๋ชจ๋“ˆ์€ Copyright ๋ชจ๋“ˆ์„ ์ง์ ‘ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด ๋ชจ๋“  ์ž‘์—…์€ App์— ์˜ํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ InspirationGenerator๊ฐ€ ๋ Œ๋”๋ง์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— Copyright ์ปดํฌ๋„ŒํŠธ๋Š” ์™„์ „ํžˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ ์ ์€ ๋ถ€๋ชจ-์ž์‹ ๊ฐ„์˜ ๋ Œ๋”๋ง ๊ด€๊ณ„๊ฐ€ ๋™์ผํ•œ ๋ Œ๋”๋ง ํ™˜๊ฒฝ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

'use client'์˜ ์‚ฌ์šฉ ์‹œ๊ธฐ

'use client'๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ Œ๋”๋งํ•  ๊ฒƒ์„ ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š” ์‹œ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ์žฅ๋‹จ์ ์„ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋žตํ™”๋ฅผ ์œ„ํ•ด ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์— ๊ด€ํ•ด ์ด์•ผ๊ธฐํ•˜์ง€๋งŒ, ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋Š” ์•ฑ์˜ ๋ชจ๋“  ์ฝ”๋“œ์—๋Š” ๋™์ผํ•œ ์›์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ์žฅ์ 

  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์†กํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ์–‘์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๋ชจ๋“ˆ๋งŒ ๋ฒˆ๋“ค๋ง ๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—์„œ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•  ๋•Œ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์— ๋Œ€ํ•œ ์งง์€ ์ง€์—ฐ ์‹œ๊ฐ„์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ํ•œ๊ณ„

  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํ˜ธ์ž‘์šฉ์„ ์ง€์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด onClick๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋Œ€๋ถ€๋ถ„์˜ Hook์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋˜๋ฉด ๊ทธ ์ถœ๋ ฅ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ Œ๋”๋งํ•  ์ปดํฌ๋„ŒํŠธ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ Œ๋”๋ง ํ›„ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋˜์ง€ ์•Š์œผ๋ฉฐ ์ž์ฒด ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ์œ ํ˜•

React ์•ฑ์—์„œ์™€ ๊ฐ™์ด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ ๋ Œ๋”๋ง ๋˜๋ฏ€๋กœ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์ถ”๊ฐ€์ ์ธ ๊ณ ๋ ค ์‚ฌํ•ญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ๋˜๋Š” prop ๊ฐ’์€ ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๋Š” props๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹จ, ๋‹ค์Œ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๋กœ ํ‘œ์‹œ๋œ ๋ชจ๋“ˆ์—์„œ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์•˜๊ฑฐ๋‚˜ 'use server'๋กœ ํ‘œ์‹œ๋œ ํ•จ์ˆ˜
  • ํด๋ž˜์Šค
  • ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋‚ด์žฅํ˜• ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด ํ˜น์€ null ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ€์ง„ ๊ฐ์ฒด
  • ๊ธ€๋กœ๋ฒŒํ•˜๊ฒŒ ๋“ฑ๋ก๋˜์ง€ ์•Š์€ symbol (์˜ˆ: Symbol('my new symbol'))

์‚ฌ์šฉ๋ฒ•

์ƒํ˜ธ์ž‘์šฉ๊ณผ ์ƒํƒœ๋ฅผ ๊ฐ€์ง„ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์ถ•

'use client';

import { useState } from 'react';

export default function Counter({initialValue = 0}) {
  const [countValue, setCountValue] = useState(initialValue);
  const increment = () => setCountValue(countValue + 1);
  const decrement = () => setCountValue(countValue - 1);
  return (
    <>
      <h2>Count Value: {countValue}</h2>
      <button onClick={increment}>+1</button>
      <button onClick={decrement}>-1</button>
    </>
  );
}

Counter์—๋Š” ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๊ฑฐ๋‚˜ ๊ฐ์†Œ์‹œํ‚ค๊ธฐ ์œ„ํ•ด useState Hook๊ณผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ด ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—ฌ์•ผ ํ•˜๋ฉฐ ํŒŒ์ผ ์ตœ์ƒ๋‹จ์— 'use client' ์ง€์‹œ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์ƒํ˜ธ์ž‘์šฉ ์—†์ด UI๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

import { readFile } from 'node:fs/promises';
import Counter from './Counter';

export default async function CounterContainer() {
const initialValue = await readFile('/path/to/counter_value');
return <Counter initialValue={initialValue} />
}

์˜ˆ๋ฅผ ๋“ค์–ด, Counter์˜ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ CounterContainer๋Š” ์ƒํ˜ธ์ž‘์šฉ์ด ์—†๊ณ  state๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— 'use client'๊ฐ€ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ CounterContainer๋Š” ์„œ๋ฒ„์˜ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์ฝ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—ฌ์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„๋‚˜ ํด๋ผ์ด์–ธํŠธ ์ „์šฉ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ Œ๋”๋ง ์œ„์น˜์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ์˜ˆ๋กœ ๋“  FancyText๊ฐ€ ๊ทธ๋Ÿฌํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

export default function FancyText({title, text}) {
return title
? <h1 className='fancy title'>{text}</h1>
: <h3 className='fancy cursive'>{text}</h3>
}

์ด ๊ฒฝ์šฐ 'use client' ์ง€์‹œ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด FancyText์˜ ์‚ฐ์ถœ๋ฌผ(์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ)์ด ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฐธ์กฐ๋  ๋•Œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์•ž์„œ Inspirations ์•ฑ ์˜ˆ์ œ์—์„œ ๋ณด์—ฌ์ค€ ๊ฒƒ์ฒ˜๋Ÿผ FancyText๋Š” ๊ฐ€์ ธ์˜ค๊ณ  ์‚ฌ์šฉ๋˜๋Š” ์œ„์น˜์— ๋”ฐ๋ผ ์„œ๋ฒ„ ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ FancyText์˜ HTML ์ถœ๋ ฅ์ด ์ข…์†์„ฑ์„ ํฌํ•จํ•œ ์†Œ์Šค ์ฝ”๋“œ์— ๋น„ํ•ด ํฌ๋‹ค๋ฉด, ํ•ญ์ƒ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ์˜ˆ๋กœ ๊ธด SVG ๊ฒฝ๋กœ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ž…๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ API ์‚ฌ์šฉ

React ์•ฑ์—์„œ๋Š” ์›น ์Šคํ† ๋ฆฌ์ง€, ์˜ค๋””์˜ค ๋ฐ ๋น„๋””์˜ค ์กฐ์ž‘, ํ•˜๋“œ์›จ์–ด ์žฅ์น˜ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ €์˜ API๋ฅผ ํฌํ•จํ•œ ํด๋ผ์ด์–ธํŠธ ํŠน์ • API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ์—์„œ ์ปดํฌ๋„ŒํŠธ๋Š” DOM API๋ฅผ ์‚ฌ์šฉํ•ด canvas ์š”์†Œ๋ฅผ ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ API๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

'use client';

import {useRef, useEffect} from 'react';

export default function Circle() {
const ref = useRef(null);
useLayoutEffect(() => {
const canvas = ref.current;
const context = canvas.getContext('2d');
context.reset();
context.beginPath();
context.arc(100, 75, 50, 0, 2 * Math.PI);
context.stroke();
});
return <canvas ref={ref} />;
}

์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

React ์•ฑ์—์„œ๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ UI ํŒจํ„ด์ด๋‚˜ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ์ปดํฌ๋„ŒํŠธ Hook์ด๋‚˜ ํด๋ผ์ด์–ธํŠธ API์— ์˜์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ React API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • createContext
  • use ๋ฐ useId๋ฅผ ์ œ์™ธํ•œ react์™€ react-dom์˜ Hook
  • forwardRef
  • memo
  • startTransition
  • ํด๋ผ์ด์–ธํŠธ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: Dom ์‚ฝ์ž… ํ˜น์€ ๋„ค์ดํ‹ฐ๋ธŒ ํ”Œ๋žซํผ ๋ทฐ ๋“ฑ)

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ํ˜ธํ™˜๋˜๋„๋ก ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋‹ค๋ฉด ์ด๋ฏธ 'use client'๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—์„œ๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ ๊ฐ™์€ props๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์„œ๋“œํŒŒํ‹ฐ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์™€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์— ์ž์ฒด ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.