'use client'
'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
์์ ์์ํ๋ ํ์ ํธ๋ฆฌ๋ ํด๋ผ์ด์ธํธ ๋ชจ๋๋ก ํ์๋ฉ๋๋ค.


'use client'
๋ React ์๋ฒ ์ปดํฌ๋ํธ ์ฑ์ ๋ชจ๋ ์ข
์์ฑ ํธ๋ฆฌ๋ฅผ ๋ถํ ํ์ฌ InspirationGenerator.js
์ ๋ชจ๋ ์ข
์์ฑ์ ํด๋ผ์ด์ธํธ-๋ ๋๋ง์ผ๋ก ํ์ํฉ๋๋ค.
๋ ๋๋งํ๋ ๋์ ํ๋ ์์ํฌ๋ ๋ฃจํธ ์ปดํฌ๋ํธ๋ฅผ ์๋ฒ-๋ ๋๋งํ๊ณ ๋ ๋ ํธ๋ฆฌ๋ฅผ ํตํด ๊ณ์ ์งํํ์ฌ ํด๋ผ์ด์ธํธ์์ ๊ฐ์ ธ์จ ์ฝ๋๋ฅผ ํ๊ฐํ์ง ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ์๋ฒ์์ ๋ ๋๋งํ ๋ ๋ ํธ๋ฆฌ ๋ถ๋ถ์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ ๋๋ค. ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ ํด๋ผ์ด์ธํธ๋ ํธ๋ฆฌ์ ๋๋จธ์ง ๋ถ๋ถ ๋ ๋๋ง์ ์๋ฃํฉ๋๋ค.


React ์๋ฒ ์ปดํฌ๋ํธ ์ฑ์ ์ํ ๋ ๋ ํธ๋ฆฌ์์ InspirationGenerator
์ ๊ทธ ์์ ์ปดํฌ๋ํธ FancyText
๋ ํด๋ผ์ด์ธํธ ํ์ ์ฝ๋์์ ๋ด๋ณด๋ธ ์ปดํฌ๋ํธ์ด๋ฉฐ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ๊ฐ์ฃผํฉ๋๋ค.
๋ค์ ์ ์๋ฅผ ์๊ฐํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋ง๋๋ ๋ ๋ ํธ๋ฆฌ์ ์ปดํฌ๋ํธ์ ๋๋ค.
- ์๋ฒ ์ปดํฌ๋ํธ๋ ์๋ฒ์์ ๋ ๋๋ง ๋๋ ๋ ๋ ํธ๋ฆฌ์ ์ปดํฌ๋ํธ์ ๋๋ค.
์์ ์ฑ์ด ์คํ๋๋ ๋์ App
, FancyText
๋ฐ Copyright
๋ ๋ชจ๋ ์๋ฒ์์ ๋ ๋๋ง ๋๋ฉฐ ์๋ฒ ์ปดํฌ๋ํธ๋ก ๊ฐ์ฃผํฉ๋๋ค. InspirationGenerator.js
์ ๊ทธ ์ ์ด์ ์ข
์์ฑ์ด ํด๋ผ์ด์ธํธ ์ฝ๋๋ก ํ์๋๋ฏ๋ก ์ปดํฌ๋ํธ InspirationGenerator
์ ๊ทธ ์์ ์ปดํฌ๋ํธ FancyText
๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์
๋๋ค.
Deep Dive
์ ์ ์์ ๋ฐ๋ฅด๋ฉด FancyText
์ปดํฌ๋ํธ๋ ์๋ฒ ์ปดํฌ๋ํธ์ด์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์
๋๋ค. ์ด๋ป๊ฒ ๊ทธ๋ด ์ ์์๊น์?
์ฐ์ , โ์ปดํฌ๋ํธโ๋ผ๋ ์ฉ์ด๊ฐ ๊ทธ๋ค์ง ์ ํํ์ง ์๋ค๋ ์ ์ ๋ถ๋ช ํ ํด ๋๊ฒ ์ต๋๋ค. โ์ปดํฌ๋ํธโ๋ฅผ ์ดํดํ ์ ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- โ์ปดํฌ๋ํธโ๋ ์ปดํฌ๋ํธ ์ ์๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๊ฒ์ ํจ์์ผ ๊ฒ์ ๋๋ค.
// This is a definition of a component
function MyComponent() {
return <p>My Component</p>
}
- โ์ปดํฌ๋ํธโ๋ ๊ทธ ์ ์์ ์ปดํฌ๋ํธ ์ฌ์ฉ์ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
import MyComponent from './MyComponent';
function App() {
// This is a usage of a component
return <MyComponent />;
}
๊ฐ๋ ์ ์ค๋ช ํ ๋ ์ข ์ข ๋ถ์ ํ์ฑ์ ์ค์ํ์ง ์์ง๋ง, ์ด ๊ฒฝ์ฐ์๋ ์ค์ํฉ๋๋ค.
์๋ฒ ๋๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ๊ดํด ์ด์ผ๊ธฐํ ๋, ์ปดํฌ๋ํธ ์ฌ์ฉ์ ์ธ๊ธํ๊ณ ์์ต๋๋ค.
- ์ปดํฌ๋ํธ๊ฐ
'use client'
์ง์์ด๊ฐ ์๋ ๋ชจ๋์์ ์ ์๋์๊ฑฐ๋ ์ปดํฌ๋ํธ๊ฐ ํด๋ผ์ด์ธํธ์์ ๊ฐ์ ธ์ ํธ์ถ๋๋ค๋ฉด ๊ทธ ์ปดํฌ๋ํธ ์ฌ์ฉ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ๋๋ค. - ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ปดํฌ๋ํธ ์ฌ์ฉ์ ์๋ฒ ์ปดํฌ๋ํธ์ ๋๋ค.


FancyText
์ ๊ดํ ์ง๋ฌธ์ผ๋ก ๋์๊ฐ์ ์ด ์ปดํฌ๋ํธ ์ ์์๋ 'use client'
์ง์์ด๊ฐ ์์ผ๋ฉฐ ๋ ๊ฐ์ง ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
FancyText
๋ฅผ App
์ ์์์ผ๋ก ์ฌ์ฉํ๋ฉด ์๋ฒ ์ปดํฌ๋ํธ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. FancyText
๋ฅผ ๊ฐ์ ธ์์ InspirationGenerator
์์ ํธ์ถํ ๋ InspirationGenerator
์ 'use client'
์ง์์ด๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก FancyText
์ ์ฌ์ฉ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์
๋๋ค.
์ด๋ FancyText
์ ๋ํ ์ปดํฌ๋ํธ ์ ์๊ฐ ์๋ฒ์์ ํ๊ฐ๋๊ณ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ์ฌ์ฉ์ ๋ ๋๋งํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ์์ ๋ด๋ ค๋ฐ๊ฒ ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
Deep Dive
Copyright
์ปดํฌ๋ํธ๊ฐ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ InspirationGenerator
์ ์์์ผ๋ก ๋ ๋๋ง ๋์ง๋ง ์ด๊ฒ์ด ์๋ฒ ์ปดํฌ๋ํธ๋ผ๋ ์ฌ์ค์ ๋๋ ์ ์์ต๋๋ค.
'use client'
์ง์์ด๋ ๋ชจ๋ ์ข
์์ฑ ํธ๋ฆฌ(๋ ๋ ํธ๋ฆฌ๊ฐ ์๋)์์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฝ๋ ๊ฐ์ ๊ฒฝ๊ณ๋ฅผ ์ ์ํ๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์.


'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๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์์ ์๋ฃํ
- ์ง๋ ฌํํ ์ ์๋ ๊ฐ์ ํฌํจํ๋ ์ดํฐ๋ฌ๋ธ
- Date ๊ฐ์ฒด
- ์ผ๋ฐ ๊ฐ์ฒด (์ง๋ ฌํํ ์ ์๋ properties๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ์ด๋์ ๋ผ์ด์ ๋ก ์์ฑ๋ ๊ฐ์ฒด)
- ์๋ฒ ์ก์ ์ผ๋ก์์ ํจ์
- ํด๋ผ์ด์ธํธ ๋๋ ์๋ฒ ์ปดํฌ๋ํธ ์์(JSX)
- ํ๋ก๋ฏธ์ค
๋จ, ๋ค์์ ์ง์๋์ง ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๋ก ํ์๋ ๋ชจ๋์์ ๋ด๋ณด๋ด์ง ์์๊ฑฐ๋
'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๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ ์๋ํํฐ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์๋ฒ ์ปดํฌ๋ํธ ์ฌ์ด์ ์์ฒด ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ํ์ผ์ ์ถ๊ฐํด์ผ ํ ์ ์์ต๋๋ค.