'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';

export default function RichTextEditor(props) {
// ...

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

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

  • ํด๋ผ์ด์–ธํŠธ ์ „์šฉ React ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํŒŒ์ผ์— 'use client'๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๋Š” ์—†์œผ๋ฉฐ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜จ ํŒŒ์ผ์—๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 'use client'๋Š” ์„œ๋ฒ„ ์ „์šฉ ์ฝ”๋“œ์™€ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ๊ฒฝ๊ณ„ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ํŠธ๋ฆฌ ์•„๋ž˜์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ Œ๋”๋งํ•˜๋ ค๋ฉด 'use client' ํŒŒ์ผ์—์„œ ๋‚ด๋ณด๋‚ด๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๋Š” props๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ํŒŒ์ผ์—์„œ 'use client' ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋ฉด React ์ปดํฌ๋„ŒํŠธ๋กœ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜ props๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ์˜ ์šฉ๋„๋กœ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ ํŒŒ์ผ์—์„œ 'use client' ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋ฉด ์ง€์‹œ๋ฌธ(use client)๋Š” ์•„๋ฌด๋Ÿฐ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ ์ „์šฉ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 'use client' ํŒŒ์ผ์˜ ๋ชจ๋“  ์ฝ”๋“œ์™€ ๊ทธ๊ฒƒ์ด ๊ฐ€์ ธ์˜จ (์ง์ ‘์ ์œผ๋กœ ๋˜๋Š” ๊ฐ„์ ‘์ ์œผ๋กœ) ๋ชจ๋“ˆ์€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋“ˆ ๊ทธ๋ž˜ํ”„์˜ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ด๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ Œ๋”๋ง ๋˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด์ง€๊ณ  ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ bundle ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์„œ๋ฒ„์˜ ์ด์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•˜๋ฉด ํŠธ๋ฆฌ์—์„œ 'use client' ์ง€์‹œ๋ฌธ๊ณผ state๋ฅผ ๋‚ฎ๊ฒŒ ์ด๋™์‹œํ‚ค๊ณ  ๋ Œ๋”๋ง ๋œ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ž์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • props๋Š” ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ์ง๋ ฌํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ง€์‹œ๋ฌธ์˜ ๋ฐฐ์น˜๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Œ์— ์œ ์˜ํ•˜๊ณ  ํ•„์š” ์ด์ƒ์œผ๋กœ ํฐ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • <MarkdownRenderer>์™€ ๊ฐ™์ด ์„œ๋ฒ„ ์ „์šฉ ๊ธฐ๋Šฅ๊ณผ ํด๋ผ์ด์–ธํŠธ ์ „์šฉ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 'use client'๋กœ ํ‘œ์‹œํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์„œ๋ฒ„ ์ „์šฉ์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํด๋ผ์ด์–ธํŠธ bundle์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • npm์— ๊ฒŒ์‹œ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๋Š” props๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ „์šฉ React ๊ธฐ๋Šฅ์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” React ์ปดํฌ๋„ŒํŠธ์— 'use client'๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด import ๋˜์–ด ๋ Œ๋”๋ง ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž์‹ ์˜ 'use client' ํŒŒ์ผ๋กœ ๊ฐ์Œ€ ํ•„์š”๊ฐ€ ์žˆ์–ด ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ๊ณ  ๋‚˜์ค‘์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„œ๋ฒ„๋กœ ๋กœ์ง์„ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „ ๋ฒˆ๋“ค ๋œ ํŒŒ์ผ์„ npm์— ๊ฒŒ์‹œํ•  ๋•Œ๋Š” ์„œ๋ฒ„์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” export๊ฐ€ ํฌํ•จ๋œ bundle๊ณผ๋Š” ๋ณ„๋„๋กœ 'use client'๋ผ๊ณ  ํ‘œ์‹œ๋œ bundle์ด ํฌํ•จ๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง(SSR) ๋˜๋Š” ๋นŒ๋“œ ํƒ€์ž„ ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ(SSG)์˜ ์ผ๋ถ€๋กœ ์‹คํ–‰๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” React ์ปดํฌ๋„ŒํŠธ์˜ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์ถœ๋ ฅ์„ HTML๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ JavaScript bundle์ด ๋‹ค์šด๋กœ๋“œ ๋˜๊ธฐ ์ „์— ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ง์ ‘ ์ฝ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์„œ๋ฒ„ ์ „์šฉ ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • 'use client'์™€ ๊ฐ™์€ ์ง€์‹œ๋ฌธ์€ ํŒŒ์ผ์˜ ๋งจ ์ฒ˜์Œ์— ์žˆ์–ด์•ผ ํ•˜๋ฉฐ import ์ฝ”๋“œ๋‚˜ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ณด๋‹ค ์šฐ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐฑํ‹ฑ์ด ์•„๋‹Œ ์ž‘์€๋”ฐ์˜ดํ‘œ๋‚˜ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ('use xyz' ์ง€์‹œ๋ฌธ ํ˜•์‹์€ useXyz()Hook ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜๊ณผ ๋‹ค์†Œ ์œ ์‚ฌํ•˜์ง€๋งŒ ์šฐ์—ฐํ•œ ์ผ์น˜์ž…๋‹ˆ๋‹ค.)

Usage

๊ฐœ๋ฐœ์ค‘์ด์—์š”

์ด ์„น์…˜์€ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ์ด API๋Š” React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ฌธ์„œ๋Š” ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.