π Chapter 9: 리μ‘νΈ μλ² μ»΄ν¬λνΈ
RSC(React Server Component)λ μλ²μμ "μ€ν"λλ μλ‘μ΄ μ’ λ₯μ μ»΄ν¬λνΈλ‘, ν΄λΌμ΄μΈνΈ μλ°μ€ν¬λ¦½νΈ λ²λ€μ ν¬ν¨λμ§ μμ΅λλ€. μ΄ μ»΄ν¬λνΈλ λΉλ μμ μ μ€νλ μ μκΈ° λλ¬Έμ νμΌ μμ€ν μμ λ°μ΄ν°λ₯Ό μ½κ±°λ μ μ μ½ν μΈ λ₯Ό κ°μ Έμ€κ±°λ λ°μ΄ν° λ μ΄μ΄μ μ κ·Όνλ λ±μ μμ μ΄ κ°λ₯ν©λλ€. μλ² μ»΄ν¬λνΈμμ λ°μ΄ν°λ₯Ό λΈλΌμ°μ νκ²½μ μλ ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈμ νλ‘μΌλ‘ μ λ¬ν¨μΌλ‘μ¨ λ§€μ° ν¨μΈμ μ΄κ³ μ±λ₯μ΄ λ°μ΄λ μ ν리μΌμ΄μ μ μμ±ν μ μμ΅λλ€.
μλ² μ»΄ν¬λνΈλ μλ²μμλ§ μ€νλλ νΉμν μ’
λ₯μ μ»΄ν¬λνΈλ₯Ό μΌμ»«μ΅λλ€. μλ‘μ΄ ννμ μ΄ μ»΄ν¬λνΈλ₯Ό λ μ μ΄ν΄νλ €λ©΄ λ¨Όμ 리μ‘νΈ μ»΄ν¬λνΈκ° 리μ‘νΈ μ리먼νΈλ₯Ό λ°ννλ ν¨μμΌ λΏμ΄λΌλ μ¬μ€μ κΈ°μ΅ν΄μΌ ν©λλ€. λͺ¨λ μ»΄ν¬λνΈλ κ°μ DOMμΈ λ¦¬μ‘νΈ μ리먼νΈλ₯Ό λ°νν©λλ€.
μλ² μ»΄ν¬λνΈλ λ§μ°¬κ°μ§μ
λλ€. μλ²λ ν΄λΌμ΄μΈνΈμμ μ€νλ Componentλ κ°μ DOMμ λ°νν©λλ€.
μ₯μ β
- μ°λ¦¬κ° κ³μ° λ₯λ ₯μ μ μ΄ν μ μλ μλ²μμλ§ μ€νλ©λλ€. μμΈ‘νκΈ° μ΄λ €μ΄ ν΄λΌμ΄μΈνΈ κΈ°κΈ°μμ μ€νλλ κ²μ΄ μλκΈ° λλ¬Έμ μ±λ₯μ λ μ μμΈ‘νκ² λ©λλ€.
- μμ ν μλ² νκ²½μμ μ€νλλ―λ‘ ν ν°κ³Ό κ°μ λ―Όκ°ν μ λ³΄κ° μ μΆλ κ±±μ μμ΄ μλ² μ»΄ν¬λνΈμμ μμ νκ² μμ μ μνν μ μμ΅λλ€.
- μλ² μ»΄ν¬λνΈλ λΉλκΈ°λ‘ λμν μ μμ΅λλ€. λ°λΌμ λ€νΈμν¬λ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈλ‘ μ μ‘νκΈ° μ μ μλ² μ»΄ν¬λνΈμ λμμ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦΄ μ μμ΅λλ€.
μλ² λ λλ§β
κΈ°λ³Έμ μΌλ‘ μλ² μ»΄ν¬λνΈμ μλ² λ λλ§μ λ κ°μ λ
립μ μΈ νλ‘μΈμ€λ‘ μκ°ν μ μμ΅λλ€.
ν νλ‘μΈμ€λ μλ²μμ μ»΄ν¬λνΈλ₯Ό λ λλ§ν ν 리μ‘νΈ μλ¦¬λ¨ΌνΈ νΈλ¦¬λ₯Ό μμ±ν©λλ€. λ λ€λ₯Έ νλ‘μΈμ€μΈ μλ² λ λλ¬λ μ΄λ κ² μμ±λ 리μ‘νΈ μλ¦¬λ¨ΌνΈ νΈλ¦¬λ₯Ό λ§ν¬μ
μΌλ‘ λ³νν©λλ€. λ³νλ λ§ν¬μ
μ λ€νΈμν¬λ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈμ μ€νΈλ¦¬λ°λ©λλ€.
μ»΄ν¬λνΈλ₯Ό 리μ‘νΈ μ리먼νΈλ‘ λ λλ§νλ νλ‘μΈμ€μ 리μ‘νΈ μ리먼νΈλ₯Ό HTML λ¬Έμμ΄μ΄λ μ€νΈλ¦ΌμΌλ‘ λ λλ§νλ νλ‘μΈμ€λΌλ μ μ κ³ λ €νλ©΄ μ΄ λ κ°λ μ΄ μ΄λ»κ² ν¨κ» λμνκ² λλμ§ μ§μν μ μμ΅λλ€. μλ² μ»΄ν¬λνΈλ₯Ό 리μ‘νΈ μ리먼νΈμ νΈλ¦¬λ‘ λ°κΎΈλ 첫 λ²μ§Έ νλ‘μΈμ€λ₯Ό RSC λ λλ¬λΌκ³ νκ³ , 리μ‘νΈ μ리먼νΈλ₯Ό HTML μ€νΈλ¦ΌμΌλ‘ λ°κΎΈλ λ λ²μ§Έ νλ‘μΈμ€λ₯Ό μλ² λ λλ¬λΌκ³ νκ² μ΅λλ€.
μλ² μ»΄ν¬λνΈμ μλ² λ λλ§μ μνΈ μμ©μ λ€μκ³Ό κ°μ΄ μ΄ν΄ν μ μμ΅λλ€.
- μλ²μμ JSX νΈλ¦¬λ μλ¦¬λ¨ΌνΈ νΈλ¦¬λ‘ λ³νν©λλ€.
- κ·Έλ° λ€μ, μλ²λ μ΄ μλ¦¬λ¨ΌνΈ νΈλ¦¬λ₯Ό λ¬Έμμ΄μ΄λ μ€νΈλ¦ΌμΌλ‘ μ§λ ¬νν©λλ€.
- λ¬Έμμ΄λ‘ λ³νλ JSON κ°μ²΄κ° ν΄λΌμ΄μΈνΈλ‘ μ μ‘λ©λλ€.
- ν΄λΌμ΄μΈνΈ μΈ‘μ 리μ‘νΈλ JSON λ¬Έμμ΄μ νμ±ν΄ μ½κ³ νμμ λ€λ¦μμ΄ λ λλ§ν©λλ€.
μ΄λ₯Ό μλ² μ½λλ‘ μ€λͺ νλ©΄ λ€μκ³Ό κ°μ΅λλ€.
// server.js
const express = require("express");
const path = require("path");
const react = require("react");
const ReactDOMServer = require("react-dom/server");
const App = require("./src/App");
const app = express();
app.use(express.static(path.join(__dirname, "build")));
app.get("*", (req, res) => {
// λΉλ² μμ€ λΆλΆ
const rscTree = await turnServerComponentsIntoTreeOfElements(<App />);
// λΉλ² μμ€ λΆλΆ λ
// λΉλκΈ°λ‘ λμν μλ² μ»΄ν¬λνΈλ₯Ό λ¬Έμμ΄λ‘ λ λλ§
const html = ReactDOMServer.renderToString(rscTree);
// μ μ‘
res.send(`
<!DOCTYPE html>
<html>
<head>
<title>μμ 리μ‘νΈ μ ν리μΌμ΄μ
</title>
</head>
<body>
<div id="root">${html}</div>
<script src="/static/js/main.js"></script>
</body>
</html>
`);
});
app.listen(3000, () => {
console.log("Server listening on port 3000");
})
λ Όλ¦¬μ μΌλ‘ μλ² μ»΄ν¬λνΈμ μλ² λ λλ§μ μλ‘ λ³΄μμ μΈ νλ‘μΈμ€μ΄λ―λ‘ κ΅μ₯ν μ μ΄μΈλ¦½λλ€.
λ΄λΆ ꡬ쑰β
turnServerComponentsIntoTreeOfElements
λ 리μ‘νΈ λ λλ¬μ ν μ’
λ₯μ
λλ€. <App />
κ³Ό κ°μ μμ λ¨κ³μμ μμν΄ μ¬κ·μ μΌλ‘ μ»΄ν¬λνΈλ₯Ό νΈμΆνκ³ , μ¬κΈ°μ λ°νλλ 리μ‘νΈ μ리먼νΈ(μ¦, μλ°μ€ν¬λ¦½νΈ κ°μ²΄)λ₯Ό κ°μ Έμ΅λλ€.
λ€μκ³Ό κ°μ 리μ‘νΈ μ리먼νΈκ° μλ€κ³ κ°μ ν΄ λ΄ μλ€.
<div>μλ
!</div>
μ΄ μ리먼νΈμ μμμΈ "μλ !"μ λ¬Έμμ΄μΌ λΏμ λλ€. μ΄ λ¬Έμμ΄μ μλ² μ»΄ν¬λνΈ λ λλ¬μ μ λ¬νλ©΄ λ¬Έμμ΄μ κ·Έλλ‘ λ°νν©λλ€. μ΄ λμμ ν΅μ¬μ ν΄λΌμ΄μΈνΈμ μλ 리μ‘νΈμ μλ²μ μλ 리μ‘νΈκ° λͺ¨λ μ΄ν΄ν μ μλ λ°μ΄ν°λ₯Ό λ°ννλ κ²μ λλ€. 리μ‘νΈλ ν΄λΌμ΄μΈνΈμ μλ²μμ λͺ¨λ λ¬Έμμ΄, μ«μ, λΆλ¦¬μΈ κ°μ μ΄ν΄νκ³ λ λλ§ν μ μμΌλ―λ‘ λ¬Έμμ΄μ κ·Έλλ‘ λμ΄λ λ©λλ€.
λ°°μ΄μ΄ μ λ¬λλ€λ©΄ λ°°μ΄μ map
μ μ€ννκ³ ν¨μλ₯Ό μ€νν΄ μ¬κ·μ μΌλ‘ λ°°μ΄μ κ° μ리먼νΈλ₯Ό μ² λ¦¬ν©λλ€. λ°°μ΄μ λ€μκ³Ό κ°μ΄ μ¬λ¬ κ°μ μμ μ리먼νΈλ‘ ꡬμ±λ μ μμ΅λλ€.
[
<div>hi</div>,
<h1>hello</h1>,
<span>love u</span>,
(prop) => <p id={props.id}>lorem ipsum</p>,
];
λ€μμ κ°μ²΄λ₯Ό μ²λ¦¬νλ λ¨κ³μ
λλ€. λͺ¨λ 리μ‘νΈ μ리먼νΈλ κ°μ²΄μ§λ§, λͺ¨λ κ°μ²΄κ° 리μ‘νΈ μ리먼νΈλ μλλλ€. 리μ‘νΈ μ리먼νΈλ $$typeOf
μμ±μ μ§λλ©°, μμ±μ κ°μ Symbol.for('react.element')
μ
λλ€. λ°λΌμ μ΄ μμ±κ³Ό μμ±μ κ°μ΄ μΌμΉνλμ§ νμΈνκ³ , μ΄λ₯Ό λ§μ‘±νλ€λ©΄ 리μ‘νΈ μ리먼νΈλ‘ μ·¨κΈν©λλ€.
리μ‘νΈ μ리먼νΈλ string, function λκ°μ§ νμ
μΌλ‘ ννλ©λλ€. "div", "span" λ±μ λ΄μ₯ DOM μ리먼νΈμλ λ¬Έμμ΄μ΄ μ¬μ©λκ³ , μ¬μ©μκ° μμ±ν <Footer />
μ κ°μ μ»΄ν¬λνΈμλ ν¨μκ° μ¬μ©λ©λλ€.
λ¬Έμμ΄ νμ
μ΄λΌλ©΄, λ΄μ₯λ DOM μ리먼νΈμ΄κΈ° λλ¬Έμ κ·Έλλ‘ λ°νν©λλ€. λ€λ§, μμμΌλ‘ λμμ± λ¦¬μ‘νΈ μ»΄ν¬λνΈκ° ν¬ν¨λ μλ μμΌλ―λ‘ μ¬κ·μ μΌλ‘ νλ‘μ λν΄ ν¨μλ₯Ό νΈμΆν΄ μ²λ¦¬ν©λλ€.
ν¨μ νμ
μ΄λΌλ©΄, μ¬μ©μκ° μμ±ν μ»΄ν¬λνΈλ₯Ό λνλ΄λ κ²μ΄λ―λ‘ ν΄λΉ μ»΄ν¬λνΈλ₯Ό νλ‘κ³Ό ν¨κ» νΈμΆνκ³ , μ»΄ν¬λνΈκ° λ°ννλ JSXμ λν΄ μ¬κ·μ μΌλ‘ ν¨μλ₯Ό νΈμΆν©λλ€. ν¨ μ νμ
μ μ»΄ν¬λνΈλ₯Ό νΈμΆνλ λΆλΆμ 보면 μμ await
ν€μλκ° μμ΅λλ€. μλ² μ»΄ν¬λνΈλ μλ²μμ μ€νλκΈ° λλ¬Έμ ν¨μ μ»΄ν¬λνΈμ λΉλκΈ° μμ
μ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦΄ μ μκ³ , μ΄λ₯Ό μν΄ await
λ₯Ό μ¬μ©νμ΅λλ€. μλ²μμ await
μ ν¨κ» νΈμΆλ μ»΄ν¬λνΈλ 리μ‘νΈ μ리먼νΈλ₯Ό λ°ννλλ°, μ΄λ₯Ό renderToString
μ΄λ renderToPipeableStream
μ μ λ¬νλ©΄ λ¬Έμμ΄μ΄λ λ¬Έμμ΄ μ€νΈλ¦ΌμΌλ‘ λ λλ§ν μ μμ΅λλ€. κ·Έ κ²°κ³Ό, μλ²μμ λͺ¨λ λΉλκΈ° μμ
μ΄ μ²λ¦¬λμ΄ λ°μ΄ν° μμ‘΄μ±μ΄ λͺ¨λ ν΄κ²°λ μλ¦¬λ¨ΌνΈ νΈλ¦¬(μ¦, μλ°μ€ν¬λ¦½νΈ κ°μ²΄)λ₯Ό μμ±ν μ μκ² λ©λλ€.
λ§μ§λ§μ κ°μ²΄μ§λ§ 리μ‘νΈ μ리먼νΈκ° μλ κ²½μ°μ λλ€. ννν μλ°μ€ν¬λ¦½νΈ κ°μ²΄μ΄κΈ° λλ¬Έμ ν΄λΉ κ°μ²΄μ κ° κ°μ λν΄ ν¨μλ₯Ό μ¬κ·μ μΌλ‘ νΈμΆνκ³ κ²°κ³Όλ₯Ό λ°νν©λλ€.
μ΄λ₯Ό μ¬μ©ν΄ μλ² μ»΄ν¬λνΈλ₯Ό 리μ‘νΈ μ리먼νΈλ‘ λ λλ§ν νμ ν΄λΌμ΄μΈνΈλ‘ μ μ‘ν μ μμ΅λλ€. μ΄μ ν΄λΉ μλ¦¬λ¨ΌνΈ νΈλ¦¬λ₯Ό renderToString
μ΄λ renderToPipeableStream
μΌλ‘ μ λ¬νκ±°λ μ§λ ¬νν΄μ λΈλΌμ°μ λ‘ μ§μ μ μ‘ν μ μμ΅λλ€. 리μ‘νΈλ μ΄λ₯Ό μμ μ΄ μ΄ν΄ν μ μλ 리μ‘νΈ μλ¦¬λ¨ΌνΈ νΈλ¦¬λ‘ ν΄μνκ³ ν΄λΌμ΄μΈνΈμμ λ λλ§ν©λλ€. νμ§λ§ ν΄μΌ ν μΌμ΄ λ¨μμ΅λλ€. λ°λ‘ μ§λ ¬νμ
λλ€.
μ§λ ¬νβ
μ§λ ¬νλ μ΄κΈ° λ‘λ μ€μ μ ν리μΌμ΄μ μ΄ μ¬λ°λ₯΄λ‘ ν¨μ¨μ μΌλ‘ λ λλ§λλλ‘ λ³΄μ₯νλ λ° λ§€μ° μ€μν μμ μ λλ€. μλ²μμ λ λλ§λ λμΌν μΆλ ₯μ΄ ν΄λΌμ΄μΈνΈμ μΌμΉν΄μΌλ§ 리μ‘νΈκ° μ¬λ°λ₯΄κ² μ¬μ‘°μ νκ³ μ°¨μ΄μ μ νμ ν μ μκΈ° λλ¬Έμ λλ€. μ ν리μΌμ΄μ μ΄ μλ²μμ λ λλ§λ λ, μμ±λ 리μ‘νΈ μ리먼νΈλ λΈλΌμμ΄λ‘ μ μ‘λ μ μλ HTML λ¬Έμμ΄λ‘ λ³νλμ΄μΌ ν©λλ€. μ΄λ 리μ‘νΈ μ리먼νΈλ₯Ό λ¬Έμμ΄λ‘ λ³ννλ κ³Όμ μ μ§λ ¬νλΌκ³ ν©λλ€.
μΌλ°μ μΈ λ¦¬μ‘νΈ μν리μΌμ΄μ
μμ 리μ‘νΈ μ리먼νΈλ λ©λͺ¨λ¦¬μ μλ κ°μ²΄μ
λλ€. μ΄λ¬ν μ리먼νΈλ React.createElement
λ₯Ό νΈμΆνκ±°λ JSX λ¬Έλ²μ μ¬μ©ν΄ μμ±λ©λλ€. 리μ‘νΈ μ리먼νΈλ μ»΄ν¬λνΈκ° μ΄λ»κ² λ λλ§λ μ§ νννμ§λ§, μμ§ μ€μ DOM μ리먼νΈλ μλλλ€.
const element = <h1>Hello, world</h1>;
ReactDOMServer.renderToString
κ°μ ν¨μλ₯Ό μ¬μ©ν΄ μλ²μμ λ λλ§ν λ μ΄λ¬ν 리μ‘νΈ μ리먼νΈλ HTML λ¬Έμμ΄λ‘ μ§λ ¬νλ©λλ€. μ§λ ¬ν νλ‘μΈμ€λ 리μ‘νΈ μλ¦¬λ¨ΌνΈ νΈλ¦¬λ₯Ό νμν΄ κ° μ리먼νΈμ ν΄λΉνλ HTMLμ μμ±νκ³ μ΄λ₯Ό λͺ¨λ ν©μ³ νλμ HTML λ¬Έμμ΄λ‘ λ§λλλ€.
const htmlString = ReactDOMServer.renderToString(element);
// htmlStringμ '<h1>Hello, world</h1>'κ° λ©λλ€.
κ·Έλ° λ€μ μ΄ HTML λ¬Έμμ΄μ ν΄λΌμ΄μΈνΈλ‘ μ μ‘ν΄ νμ΄μ§μ μ΄κΈ° λ§ν¬μ μΌλ‘ μ¬μ©ν©λλ€. μλ°μ€ν¬λ¦½νΈ λ²λ€μ΄ ν΄λΌμ΄μΈνΈμ λ‘λλλ©΄ 리μ‘νΈλ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μΆκ°νκ³ λμ μ½ν μΈ λ₯Ό μ±μ°λ©΄μ DOMμ 'νμ΄λλ μ΄νΈ'ν©λλ€.
μ§λ ¬ν λ¨κ³λ μ¬λ¬ κ°μ§ μ΄μ λ‘ μ€μν©λλ€. 첫째, μλ²κ° μ¦μ νμν μ μλ μμ ν HTML νμ΄μ§λ₯Ό λΉ λ₯΄κ² ν΄λΌμ΄μΈνΈμ μ μ‘ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ μ¬μ©μκ° μ½ν
μΈ μ λ 빨리 μνΈ μμ©νκ² λμ΄ νμ΄μ§μ μ²΄κ° λ‘λ© μλκ° κ°μ λ©λλ€.
λν 리μ‘νΈ μ리먼νΈλ₯Ό HTML λ¬Έμμ΄λ‘ μ§λ ¬ννλ©΄ νκ²½μ κ΄κ³μμ΄ μΌκ΄λκ³ μμΈ‘ κ°λ₯ν μ΄κΈ° λ λλ§μ΄ κ°λ₯ν©λλ€. μμ±λ HTMLμ μ μ μ΄λ©° μλ²μμ λ λλ§λλ ν΄λΌμ΄μΈνΈμμ λ λλ§λλ λμΌνκ² νμλ©λλ€.
λμΌλ‘ μ§λ ¬νλ ν΄λΌμ΄μΈνΈ μΈ‘μ νμ΄λλ μ΄μ
νλ‘μΈμ€λ₯Ό μ©μ΄νκ² ν©λλ€. μλ°μ€ν¬λ¦½νΈ λ²λ€μ΄ ν΄λΌμ΄μΈνΈμμ λ‘λλλ©΄ 리μ‘νΈλ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μΆκ°νκ³ λμ μ½ν
μΈ λ₯Ό λͺ¨λ μ±μμΌ ν©λλ€. μ§λ ¬νλ HTML λ¬Έμμ΄μ μ΄κΈ° λ§ν¬μ
μΌλ‘ μ¬μ©νλ©΄ 리μ‘νΈκ° μμ
ν μ μλ κ²¬κ³ ν κΈ°λ°μ νλ³΄ν΄ λ€μ μ€ννλ νμ΄λλ μ΄μ
νλ‘μΈμ€λ₯Ό λ³΄λ€ ν¨μ¨μ μ΄κ³ μμ μ μΌλ‘ μν ν μ μμ΅λλ€.
μ λ°μ΄νΈβ
RSCλ μ₯μ μ΄ λ§μ§λ§, μλ² μ»΄ν¬λνΈμ ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλΌλ λ μ’ λ₯μ μ»΄ν¬λνΈλ₯Ό κ³ λ €ν΄μΌ νλ€λ μ μμ μκ°ν κ² λ§μμ§λ€λ λ¨μ λ μμ΅λλ€. μ»΄ν¬λνΈ μ€μλ μλ² μ»΄ν¬λνΈκ° λ μ μλ κ²λ μκΈ° λλ¬Έμ λλ€.
μ¬μ©μκ° + λ²νΌμ ν΄λ¦νλ©΄ μΉ΄μ΄ν° κ°μ 1μ© μ¦κ°μν€λ κ°λ¨ν μΉ΄μ΄ν° μ»΄ν¬λνΈλ₯Ό μκ°ν΄λ΄ μλ€.
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<h1>μλ
μΉκ΅¬λ€, λ΄ λ©μ§ μΉ΄μ΄ν°λ₯Ό λ΄μ€!</h1>
<p>λ΄ μκ°: λλ 리μ‘νΈλ₯Ό μ’μν΄. λ°©λͺ
λ‘μ κΈμ λ¨κ²¨μ€!</p>
<p>μΉ΄μ΄νΈ: {count}</p>
<button onClick={() => setCount(count + 1)}>+</button>
</div>
);
}
μ΄ μ»΄ν¬λνΈλ λ κ°μ§ μ΄μ λλ¬Έμ μλ² μ»΄ν¬λνΈκ° λ μ μμ΅λλ€.
- ν΄λΌμ΄μΈνΈ μ μ© APIμΈ
useState
λ₯Ό μ¬μ©ν©λλ€. μ¦, μλ²λ countμ μ΄κΉκ°μ΄ 무μμΈμ§ μμ§ λͺ»νλ―λ‘ μ΄κΈ° HTMLμ λ λλ§ν μ μμ΅λλ€. μ΄λ μλ²κ° μ΄κΈ° HTMLμ λ λλ§ν ν, κ·Έλ¦¬κ³ μ¬μ©μκ° μνΈ μμ©ν μ μλ UI ν΄λΌμ΄μΈνΈκ° λ λλ§νκΈ° μ μ λ¬Έμ κ° λ κ²μ λλ€. - ν΄λΌμ΄μΈνΈ μ μ© APIμΈ
onClick
μ μ¬μ©ν©λλ€. μλΈλ μΈν°λν°λΈνμ§ μκΈ° λλ¬Έμ μλ²μμ μ€ν μ€μΈ νλ‘νμ€λ ν΄λ¦ν μ μμ΅λλ€. λ°λΌμ μλ² μ»΄ν¬λνΈμμonClick
μ μ¬μ©νκΈ°λ λΆκ°λ₯ν©λλ€. λ μλ² μ»΄ν¬λνΈμ λͺ¨λ νλ‘μ μ§λ ¬νκ° κ°λ₯ν΄μΌ ν©λλ€. μλ²κ° νλ‘μ μ§λ ¬νν΄ ν΄λΌμ΄μΈνΈλ‘ μ μ‘ν μ μμ΄μΌ νκΈ° λλ¬Έμ λλ€. νμ§λ§ ν¨μλ μ§λ ¬νκ° λΆκ°λ₯νλ―λ‘ μλ² μ»΄ν¬λνΈμμλ ν¨μλ₯Ό νλ‘μΌλ‘ μ¬μ©ν μ μμ΅λλ€.
λ°λΌμ μλ² μ»΄ν¬λνΈμ κΈ°λ₯μ νμ©νκ³ μΆλ€λ©΄, λ°λ‘ κ°λ¨ν μΉ΄μ΄ν°λΌκ³ νλλΌλ μλ² λΆλΆκ³Ό ν΄λΌμ΄μΈνΈ λΆλΆμ λΆλ¦¬ν΄μΌ ν©λλ€.
// μλ² μ»΄ν¬λνΈ
function ServerCounter() {
return (
<div>
<h1>μλ
μΉκ΅¬λ€, λ΄ λ©μ§ μΉ΄μ΄ν°λ₯Ό λ΄μ€!</h1>
<p>λ΄ μκ°: λλ 리μ‘νΈλ₯Ό μ’μν΄. λ°©λͺ
λ‘μ κΈμ λ¨κ²¨μ€!</p>
<ClientPart />
</div>
);
}
// ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈ
"use client";
function ClientPart() {
const [count, setCount] = useState(0);
return (
<div>
<p>μΉ΄μ΄νΈ: {count}</p>
<button onClick={() => setCount(count + 1)}>+</button>
</div>
);
}
μ»΄ν¬λνΈμμ μλ² λ λλ§μ΄ κ°λ₯ν λΆλΆκ³Ό ν΄λΌμ΄μΈνΈ λ λλ§μ΄ κ°λ₯ν λΆλΆμ κ³ λ €ν΄μΌ ν©λλ€. μ΄λ‘ μΈν΄ μ½κ°μ κ³ μΆ©μ΄ μκΉλλ€. κ·ΈλΌμλ μ΄ μμ μ μλ―Έ μμ΅λλ€. μΈν°λν°λΈν λΆλΆμ λ΄λΉνλ μΉ΄μ΄ν° μ ν리μΌμ΄μ μ μΌλΆλ₯Ό λΆλ¦¬ν΄ λκ³ , μ΄ μμ λΆλΆλ§μ΄ μλ°μ€ν¬λ¦½νΈ λ²λ€μ μΌλΆλ‘ μ¬μ©μμκ² μ λ¬λκΈ° λλ¬Έμ λλ€. λλ¨Έμ§ μ½λλ ν΄λΌμ΄μΈνΈ μλ°μ€ν¬λ¦½νΈ λ²λ€μ ν¬ν¨λμ§ μμ΅λλ€. κ·Έ κ²°κ³Ό λ€νΈμν¬λ₯Ό ν΅ν΄ μ λ¬λλ μλ°μ€ν¬λ¦½νΈ λ²λ€μ ν¬κΈ°κ° νμ νκ² μ€μ΄ λ‘λ© μκ°μ΄ λΉ¨λΌμ§κ³ μ±λ₯λ ν₯μλ©λλ€. CPU μΈ‘λ©΄μμλ μλ°μ€ν¬λ¦½νΈλ₯Ό νμ±νκ³ μ€ννλ μμ μ κ°μνκ³ , λ€νΈμν¬ μΈ‘λ©΄μμλ λ€μ΄λ‘λν΄μΌ νλ λ°μ΄ν° μμ΄ μ μ΄μ§λλ€. μ΄κ²μ΄ λ°λ‘ κ°λ₯ν ν λ§μ μ½λλ₯Ό μλ²μμλ§ λ λλ§νκ³ ν΄λΌμ΄μΈνΈ λ²λ€μμ μ κ±°νλ €λ μ΄μ μ λλ€.
λ΄λΆ λμβ
ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ ν΄λΉ μ»΄ν¬λνΈκ° ν¬ν¨λ νμΌ μ΅μλ¨μ "use client"
μ§μμλ₯Ό μΆκ°ν΄ ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ‘ μ€μ λ©λλ€.
κ°λ μ μΌλ‘λ μλ²μμ μ€νλλ μλ² κ·Έλνμ, ν΄λΌμ΄μΈνΈμμ νμν λ λ€μ΄λ‘λλμ΄ μ€ν λλ νλ μ΄μμ ν΄λΌμ΄μΈνΈ λ²λ€μ΄ μ‘΄μ¬ν©λλ€. κ·Έλ λ€λ©΄ 리μ‘νΈλ μΈμ μ΄λ ν΄λΌμ΄μΈνΈλ₯Ό κ°μ Έμ μ€νν΄μΌ λλμ§λ₯Ό μ΄λ»κ² νμ ν κΉμ? μμ 보μλ μΉ΄μ΄ν°λ₯Ό μλ‘ λ€κ² μ΅λλ€.
μΉ΄μ΄ν° μ ν리μΌμ΄μ μ μ»΄ν¬λνΈ νΈλ¦¬μ μλ² μ»΄ν¬λνΈλ μλ²μμ λ λλ§λκ³ , ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ ν΄λΌμ΄μΈνΈμμ λ λλ§λ©λλ€. νΈλ¦¬μ 루νΈκ° μλ² μ»΄ν¬λνΈμ΄κΈ° λλ¬Έμ μ 체 νΈλ¦¬λ μλ²μμ λ λλ§λ©λλ€. νμ§λ§ InteractiveClientPart μ»΄ν¬λνΈλ ν΄λΌμ΄μΈνΈμ΄λ―λ‘ μλ²μμ λ λλ§λμ§ μμ΅λλ€. λμ , μλ²λ ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ₯Ό μν νλ μ΄μ€νλλ₯Ό λ λλ§ν©λλ€. μ΄ νλ μ΄μ€νλλ ν΄λΌμ΄μΈνΈ λ²λ€λ¬κ° μμ±ν νΉμ λͺ¨λμ λν μ°Έμ‘°μ λλ€. κ°λ¨ν λ§ν΄ 'νΈλ¦¬μ μ΄ μ§μ μ λλ¬νλ©΄ νΉμ λͺ¨λμ μ¬μ©ν΄μΌ νλ€'κ³ μλ € μ£Όλ κ²μ λλ€.
μ¬κΈ°μ μ€μν κ²μ μλ²κ° μ¬λ°λ₯Έ ν΄λΌμ΄μΈνΈ λͺ¨λμ λν μ°Έμ‘°λ₯Ό μ μ‘νκ³ , ν΄λΌμ΄μΈνΈμ 리μ‘νΈκ° ν΄λΉ μ°Έμ‘°λ₯Ό κΈ°λ°μΌλ‘ λΉ λΆλΆμ μ±μ΄λ€λ μ μ λλ€. μ΄ κ³Όμ μμ 리μ‘νΈλ λͺ¨λ μ°Έμ‘°λ₯Ό ν΄λΌμ΄μΈνΈ λ²λ€μ μλ μ€μ λͺ¨λλ‘ κ΅μ²΄ν©λλ€. 리μ‘νΈλ μ΄λ° λ°©μμ ν΅ν΄ μΈμ ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ₯Ό κ°μ Έμ μ€νν΄μΌ νλμ§ νμ ν©λλ€.
μ£Όμν μ β
μλ² μ»΄ν¬λνΈλ μλ²μμλ§ μ€νλκ³ ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ ν΄λΌμ΄μΈνΈμμλ§ μ€νλλ€λ μ€ν΄κ° μμ§λ§ μ¬μ€μ΄ μλλλ€. μλ² μ»΄ν¬λνΈλ μ€μ μλ²μμλ§ μ€νλκ³ λ₯΄μ‘νΈ μ리먼νΈλ₯Ό μλ―Ένλ κ°μ²΄λ₯Ό μΆλ ₯νμ§λ§, ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ ν΄λΌμ΄μΈνΈμμλ§ μ€νλ μ§ μμ΅λλ€.
'μ»΄ν¬λνΈκ° μ€ν΄λλ€'λ κ²μ μ»΄ν¬λνΈλ₯Ό νννλ ν¨μκ° νΈμΆλλ€λ λ»μ λλ€.
function MyComponent() {
return <div>hello world</div>;
}
'My Componentκ° μ€νλλ€'λ λ§μ MyComponent
ν¨μκ° νλ‘κ³Ό ν¨κ» νΈμΆλμ΄ λ€μκ³Ό κ°μ ννν μλ°μ€ν¬λ¦½νΈ κ°μ²΄λ‘ ννλλ 리μ‘νΈ μ리먼ν λ°ννλ€λ λ»μ
λλ€.
{
&&typeof: Symbol(react.element),
type: "div",
props: {
children: "hello world",
}
}
μ΄κ² μ΄ λ°λ‘ 'μ»΄ν¬λνΈκ° μ€νλλ€'λ λ§μ μλ―Έμ λλ€.
μλ² λ λλ§ μ€μ ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ μλ²μμ μ€νλκ³ λ¦¬μ‘νΈ μ리먼νΈλ₯Ό λνλ΄λ κ°μ²΄λ₯Ό μΆλ ₯ν©λλ€. κ·Έλ° λ€μ μ΄λ¬ν μ리먼νΈλ HTML λ¬Έμμ΄λ‘ μ§λ ¬νλμ΄ λΈλΌμ°μ μμ HTML λ§ν¬μ μ λ λλ§νλ ν΄λΌμ΄μΈνΈλ‘ μ μ‘λ©λλ€. λ°λΌμ ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ μλ²μμ μ€νλκ³ λ¦¬μ‘νΈ μ리먼νΈλ₯Ό λνλ΄λ μΌλΆ κ°μ²΄λ₯Ό λ°νν νμ μλ²μμ μ΄λ₯Ό HTMLλ‘ μ§λ ¬νν΄ ν΄λΌμ΄μΈνΈλ‘ μ μ‘ν©λλ€.
μ΄λ₯Ό λ³΄λ€ μ ννκ² νννκΈ° μν΄ λ€μκ³Ό κ°μ΄ μ°ΈμΈ λͺ μ λ₯Ό ꡬμ±νμ΅λλ€.
- μλ² μ»΄ν¬λνΈλ μλ²μμ μ€νλλ©° 리μ‘νΈ μ리먼νΈλ₯Ό λνλ΄λ κ°μ²΄λ₯Ό μΆλ ₯νλ€.
- ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ μλ²μμ μ€νλλ©° 리μ‘νΈ μ리먼νΈλ₯Ό λνλ΄λ κ°μ²΄λ₯Ό μΆλ ₯νλ€.
- μλ²μλ ν΄λΌμ΄μΈνΈμ μλ² μ»΄ν¬λνΈμ λͺ¨λ 리μ‘νΈ μ리먼νΈλ₯Ό νννλ 컀λ€λ κ°μ²΄κ° μλ€.
- μ΄ κ°μ²΄λ λ¬Έμμ΄λ‘ λ³νλμ΄ ν΄λΌμ΄μΈνΈλ‘ μ μ‘λλ€.
- μ΄ μμ λΆν° μλ² μ»΄ν¬λνΈλ ν΄λΌμ΄μΈνΈμμ μ€νλμ§ μλλ€.
- μ΄ μμ λΆν° ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ ν΄λΌμ΄μΈνΈμμλ§ μ€νλλ€.