`์ด ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค.
+
+```tsx
+function FriendList({ friends }) {
+ const onlineCount = useFriendOnlineCount();
+ if (friends.length === 0) {
+ return ;
+ }
+ return (
+
+ {onlineCount} online
+ {friends.map((friend) => (
+
+ ))}
+
+
+ );
+}
+```
+
+[๋ฆฌ์กํธ ์ปดํ์ผ๋ฌ ์์ ์ฌ์ดํธ์์ ํ์ธํด๋ณด์ธ์](https://playground.react.dev/#N4Igzg9grgTgxgUxALhAMygOzgFwJYSYAEAYjHgpgCYAyeYOAFMEWuZVWEQL4CURwADrEicQgyKEANnkwIAwtEw4iAXiJQwCMhWoB5TDLmKsTXgG5hRInjRFGbXZwB0UygHMcACzWr1ABn4hEWsYBBxYYgAeADkIHQ4uAHoAPksRbisiMIiYYkYs6yiqPAA3FMLrIiiwAAcAQ0wU4GlZBSUcbklDNqikusaKkKrgR0TnAFt62sYHdmp+VRT7SqrqhOo6Bnl6mCoiAGsEAE9VUfmqZzwqLrHqM7ubolTVol5eTOGigFkEMDB6u4EAAhKA4HCEZ5DNZ9ErlLIWYTcEDcIA)
+
+React ์ปดํ์ผ๋ฌ๋ ์๋ ๋ฉ๋ชจ์ด์ ์ด์
๊ณผ ๋๋ฑํ ์์
์ ์๋์ผ๋ก ์ ์ฉํ์ฌ ์ํ ๋ณ๊ฒฝ ์ ์ฑ์ ๊ด๋ จ ๋ถ๋ถ๋ง ๋ค์ ๋ ๋๋ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
+
+์ด๋ฅผ ๋๋ก๋`์ธ๋ฐํ ๋ฐ์์ฑ(fine-grained reactivity)`์ด๋ผ๊ณ ํฉ๋๋ค.
+
+์์ ์์์ React ์ปดํ์ผ๋ฌ๋ friends๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ``์ ๋ฐํ ๊ฐ์ ์ฌ์ฌ์ฉํ ์ ์์์ ํ๋จํ๊ณ , ์ด JSX๋ฅผ ๋ค์ ์์ฑํ๊ฑฐ๋ count๊ฐ ๋ณ๊ฒฝ๋ ๋ ``์ ๋ค์ ๋ ๋๋งํ์ง ์์๋ ๋ฉ๋๋ค.
+
+### ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ๋ ๋ฉ๋ชจ์ด์ ์ด์
๋ฉ๋๋ค.
+
+์ปดํ์ผ๋ฌ๋ ๋ ๋๋ง ์ค์ ์ฌ์ฉ๋๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ ๋ํด์๋ ์๋์ผ๋ก ๋ฉ๋ชจ์ด์ ์ด์
ํ ์ ์์ต๋๋ค.
+
+```tsx
+// ์ด๊ฒ์ ์ปดํฌ๋ํธ๋ ํ
์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ ์ปดํ์ผ๋ฌ๊ฐ ๋ฉ๋ชจ์ด์ ์ด์
ํ์ง ๋ชปํฉ๋๋ค.
+function expensivelyProcessAReallyLargeArrayOfObjects() {
+ /* ... */
+}
+
+// ์ด๊ฒ์ ์ปดํฌ๋ํธ์ด๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ ์ปดํ์ผ๋ฌ๊ฐ ๋ฉ๋ชจ์ด์ ์ด์
ํฉ๋๋ค.
+function TableContainer({ items }) {
+ // ์ด ํจ์๋ ๋ฉ๋ชจ์ด์ ์ด์
๋ฉ๋๋ค.
+ const data = expensivelyProcessAReallyLargeArrayOfObjects(items);
+ // ...
+}
+```
+
+[๋ฆฌ์กํธ ์ปดํ์ผ๋ฌ ์์ ์ฌ์ดํธ์์ ํ์ธํด๋ณด์ธ์](https://playground.react.dev/#N4Igzg9grgTgxgUxALhAejQAgFTYHIQAuumAtgqRAJYBeCAJpgEYCemASggIZyGYDCEUgAcqAGwQwANJjBUAdokyEAFlTCZ1meUUxdMcIcIjyE8vhBiYVECAGsAOvIBmURYSonMCAB7CzcgBuCGIsAAowEIhgYACCnFxioQAyXDAA5gixMDBcLADyzvlMAFYIvGAAFACUmMCYaNiYAHStOFgAvk5OGJgAshTUdIysHNy8AkbikrIKSqpaWvqGIiZmhE6u7p7ymAAqXEwSguZcCpKV9VSEFBodtcBOmAYmYHz0XIT6ALzefgFUYKhCJRBAxeLcJIsVIZLI5PKFYplCqVa63aoAbm6u0wMAQhFguwAPPRAQA+YAfL4dIloUmBMlODogDpAA)
+
+๊ทธ๋ฌ๋ `expensivelyProcessAReallyLargeArrayOfObjects`๊ฐ ์ ๋ง๋ก ๋น์ฉ์ด ๋ง์ด ๋๋ ํจ์๋ผ๋ฉด, React ์ธ๋ถ์์ ์์ฒด์ ์ผ๋ก ๋ฉ๋ชจ์ด์ ์ด์
์ ๊ตฌํํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๊ทธ ์ด์ ๋:
+
+- React ์ปดํ์ผ๋ฌ๋ React ์ปดํฌ๋ํธ์ ํ
๋ง ๋ฉ๋ชจ์ด์ ์ด์
ํ๋ฉฐ, ๋ชจ๋ ํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ์ง ์์ต๋๋ค.
+
+- React ์ปดํ์ผ๋ฌ์ ๋ฉ๋ชจ์ด์ ์ด์
์ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ ํ
์์ ๊ณต์ ๋์ง ์์ต๋๋ค.
+
+๋ฐ๋ผ์ `expensivelyProcessAReallyLargeArrayOfObjects`๊ฐ ์ฌ๋ฌ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๋ค๋ฉด, ๋์ผํ ํญ๋ชฉ์ด ์ ๋ฌ๋๋๋ผ๋ ๊ทธ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ด ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋ ๊ฒ์
๋๋ค.
+
+์ฝ๋๊ฐ ๋ ๋ณต์กํด์ง๊ธฐ ์ ์ ๋จผ์ [ํ๋กํ์ผ๋ง](https://react.dev/reference/react/useMemo#how-to-tell-if-a-calculation-is-expensive)์ ํตํด ์ค์ ๋ก ๋น์ฉ์ด ๋ง์ด ๋๋์ง ํ์ธํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
+
+## ์ปดํ์ผ๋ฌ๋ ๋ฌด์์ ๊ฐ์ ํ ๊น์ ?
+
+React ์ปดํ์ผ๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ฌํญ์ ๊ฐ์ ํฉ๋๋ค:
+
+1. ์ ํจํ๊ณ ์๋ฏธ๋ก ์ ์ธ JavaScript ์ฝ๋:
+
+2. ์ฝ๋๊ฐ ์ ํจํ๊ณ ์๋ฏธ๋ก ์ ์ธ JavaScript๋ก ์์ฑ๋์ด ์์ด์ผ ํฉ๋๋ค.
+ ๋ ๊ฐ๋ฅ/์ต์
๊ฐ ๋ฐ ์์ฑ์ ์ ์ ์ฌ๋ถ๋ฅผ ํ
์คํธ:
+
+๋ ๊ฐ๋ฅ(nullable)ํ๊ฑฐ๋ ์ต์
(optional)์ธ ๊ฐ๊ณผ ์์ฑ์ ์ ๊ทผํ๊ธฐ ์ ์ ์ ์๋์ด ์๋์ง ํ
์คํธํฉ๋๋ค.
+
+์๋ฅผ ๋ค์ด, ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ [strictNullChecks](https://www.typescriptlang.org/tsconfig/#strictNullChecks)๋ฅผ ํ์ฑํํ์ฌ if `(object.nullableProperty) { object.nullableProperty.foo }` ๋๋ ์ต์
๋ ์ฒด์ด๋์ ์ฌ์ฉํ์ฌ `object.nullableProperty?.foo`์ ๊ฐ์ด ์์ฑํด์ผ ํฉ๋๋ค.
+
+3. [React์ ๊ท์น](https://react.dev/reference/rules)์ ๋ฐ๋ฆ
๋๋ค.
+
+React ์ปดํ์ผ๋ฌ๋ React์ ๊ท์น์ ์ ์ ์ผ๋ก ๊ฒ์ฆํ ์ ์์ผ๋ฉฐ, ์ค๋ฅ๊ฐ ๊ฐ์ง๋๋ฉด ์์ ํ๊ฒ ์ปดํ์ผ์ ๊ฑด๋๋๋๋ค.
+
+์ค๋ฅ๋ฅผ ํ์ธํ๋ ค๋ฉด [eslint-plugin-react-compiler](https://www.npmjs.com/package/eslint-plugin-react-compiler)๋ฅผ ์ค์นํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
+
+## ์ปดํ์ผ๋ฌ๋ฅผ ์๋ํด๋ด์ผ ํ ๊น์?
+
+์ปดํ์ผ๋ฌ๋ ์์ง ์คํ์ ์ธ ๋จ๊ณ์ ์์ผ๋ฉฐ, ๋ง์ ๋ถ๋ถ์ด ๋ฏธ์์ฑ ์ํ์์ ์ ์ํ์ธ์.
+
+Meta์ ๊ฐ์ ํ์ฌ์์ ํ๋ก๋์
์ ์ฌ์ฉ๋์์ง๋ง, ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ๋ฌ๋ถ์ ์ฑ ํ๋ก๋์
์ ๋์
ํ ์ง๋ ์ฝ๋๋ฒ ์ด์ค์ ์ํ์ [React์ ๊ท์น](https://react.dev/reference/rules)์ ์ผ๋ง๋ ์ ์ค์ํ๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
+
+**์ง๊ธ ๋น์ฅ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํด์ผ ํ ํ์๋ ์์ต๋๋ค.**
+
+**์์ ๋ ๋ฆด๋ฆฌ์ค๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋์
ํด๋ ๊ด์ฐฎ์ต๋๋ค.**
+
+ํ์ง๋ง, ์ฑ์์ ์์ ์คํ์ ํตํด ์ปดํ์ผ๋ฌ๋ฅผ ์๋ํด๋ณด๊ณ ํผ๋๋ฐฑ์ ์ ๊ณตํด ์ฃผ์๋ฉด ์ปดํ์ผ๋ฌ๋ฅผ ๋์ฑ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
+
+## ์์ํ๊ธฐ
+
+์ด ๋ฌธ์๋ค ์ธ์๋, React ์ปดํ์ผ๋ฌ์ ๋ํ ์ถ๊ฐ ์ ๋ณด์ ๋
ผ์๋ฅผ ์ํด [React Compiler Working Group](https://github.com/reactwg/react-compiler)์ ํ์ธํ๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
+
+## ํธํ์ฑ ํ์ธ
+
+์ปดํ์ผ๋ฌ๋ฅผ ์ค์นํ๊ธฐ ์ ์, ๋จผ์ ์ฝ๋๋ฒ ์ด์ค๊ฐ ํธํ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค:
+
+```
+npx react-compiler-healthcheck@latest
+```
+
+์ด ์คํฌ๋ฆฝํธ๋ ๋ค์์ ์ํํฉ๋๋ค:
+
+- ์ต์ ํ์ ์ฑ๊ณตํ ์ ์๋ ์ปดํฌ๋ํธ์ ์๋ฅผ ํ์ธํฉ๋๋ค: ์ซ์๊ฐ ํด์๋ก ์ข์ต๋๋ค.
+
+- `` ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค: ์ด๋ฅผ ํ์ฑํํ๊ณ ๋ฐ๋ฅด๋ ๊ฒฝ์ฐ [React์ ๊ท์น](https://react.dev/reference/rules)์ ๋ฐ๋ฅผ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค.
+
+- ํธํ๋์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค: ์ปดํ์ผ๋ฌ์ ํธํ๋์ง ์๋ ๊ฒ์ผ๋ก ์๋ ค์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฒดํฌํฉ๋๋ค.
+
+```
+Successfully compiled 8 out of 9 components.
+StrictMode usage not found.
+Found no usage of incompatible libraries.
+```
+
+## eslint-plugin-react-compiler ์ค์น
+
+React ์ปดํ์ผ๋ฌ๋ eslint ํ๋ฌ๊ทธ์ธ๋ ์ง์ํฉ๋๋ค.
+
+์ด eslint ํ๋ฌ๊ทธ์ธ์ ์ปดํ์ผ๋ฌ์ ๋
๋ฆฝ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ eslint ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+```
+npm install eslint-plugin-react-compiler
+```
+
+๊ทธ๋ฆฌ๊ณ , eslint config์ ๋ค์์ ์ถ๊ฐํ์ธ์.
+
+```ts
+module.exports = {
+ plugins: ["eslint-plugin-react-compiler"],
+ rules: {
+ "react-compiler/react-compiler": "error",
+ },
+};
+```
+
+eslint ํ๋ฌ๊ทธ์ธ์ ์๋ํฐ์์ React์ ๊ท์น ์๋ฐ ์ฌํญ์ ํ์ํฉ๋๋ค.
+
+์ด ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ๋ ํด๋น ์ปดํฌ๋ํธ๋ ํ
์ ์ต์ ํ๋ฅผ ๊ฑด๋๋ด๋ค๋ ์๋ฏธ์
๋๋ค.
+
+์ด๋ ์ ํ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ, ์ปดํ์ผ๋ฌ๋ ์ด๋ฅผ ๋ณต๊ตฌํ๊ณ ์ฝ๋๋ฒ ์ด์ค์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ๊ณ์ํด์ ์ต์ ํํ ์ ์์ต๋๋ค.
+
+**๋ชจ๋ eslint ์๋ฐ ์ฌํญ์ ์ฆ์ ์์ ํ ํ์๋ ์์ต๋๋ค.**
+
+์ต์ ํ๋๋ ์ปดํฌ๋ํธ์ ํ
์ ์๋ฅผ ๋๋ฆฌ๊ธฐ ์ํด ์์ ์ ์๋์ ๋ง์ถฐ ์ด๋ฅผ ํด๊ฒฐํ ์ ์์ง๋ง, ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ชจ๋ ๊ฒ์ ์์ ํด์ผ ํ๋ ๊ฒ์ ์๋๋๋ค.
+
+## ์ปดํ์ผ๋ฌ๋ฅผ ์ฝ๋๋ฒ ์ด์ค์ ๋์
ํ๊ธฐ
+
+### ๊ธฐ์กด ํ๋ก์ ํธ
+
+์ปดํ์ผ๋ฌ๋ [React์ ๊ท์น](https://react.dev/reference/rules)์ ๋ฐ๋ฅด๋ ํจ์ํ ์ปดํฌ๋ํธ์ ํ
์ ์ปดํ์ผํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
+
+๋ํ, ํด๋น ๊ท์น์ ์๋ฐํ๋ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ ๋๋ ํด๋น ์ปดํฌ๋ํธ๋ ํ
์ ๊ฑด๋๋ฐ๋๋ก ๋์ด ์์ต๋๋ค.
+
+๊ทธ๋ฌ๋ JavaScript์ ์ ์ฐํ ํน์ฑ ๋๋ฌธ์, ์ปดํ์ผ๋ฌ๊ฐ ๋ชจ๋ ์๋ฐ์ ์ก์๋ด์ง๋ ๋ชปํ๋ฉฐ, ์๋ชป๋ ๊ธ์ (false negative)์ผ๋ก ์ธํด ๊ท์น์ ์๋ฐํ๋ ์ปดํฌ๋ํธ๋ ํ
์ ์ปดํ์ผํ ์ ์์ต๋๋ค.
+
+์ด๋ ์ ์๋์ง ์์ ๋์์ ์ด๋ํ ์ ์์ต๋๋ค.
+
+์ด๋ฌํ ์ด์ ๋ก, ๊ธฐ์กด ํ๋ก์ ํธ์์ ์ปดํ์ผ๋ฌ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋์
ํ๊ธฐ ์ํด์๋ ์ ํ ์ฝ๋์ ์์ ๋๋ ํ ๋ฆฌ์์ ๋จผ์ ์คํํด๋ณด๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
+
+์ปดํ์ผ๋ฌ๋ฅผ ํน์ ๋๋ ํ ๋ฆฌ ์งํฉ์์๋ง ์คํํ๋๋ก ์ค์ ํ์ฌ ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค:
+
+```ts
+const ReactCompilerConfig = {
+ sources: (filename) => {
+ return filename.indexOf("src/path/to/dir") !== -1;
+ },
+};
+```
+
+๋๋ฌธ ๊ฒฝ์ฐ์ด์ง๋ง, `compilationMode: "annotation"` ์ต์
์ ์ฌ์ฉํ์ฌ ์ปดํ์ผ๋ฌ๋ฅผ "์ตํธ์ธ" ๋ชจ๋๋ก ์คํํ๋๋ก ์ค์ ํ ์๋ ์์ต๋๋ค.
+
+์ด ์ต์
์ ์ฌ์ฉํ๋ฉด `"use memo"` ์ง์์ด๊ฐ ์ฃผ์๋ ์ปดํฌ๋ํธ์ ํ
๋ง ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผํฉ๋๋ค.
+
+์ฃผ์ ๋ชจ๋๋ ์ด๊ธฐ ๋์
์๋ฅผ ๋๊ธฐ ์ํ ์์์ ์ธ ๊ฒ์ด๋ฉฐ, "use memo" ์ง์์ด๊ฐ ์ฅ๊ธฐ์ ์ผ๋ก ์ฌ์ฉ๋๊ธฐ๋ฅผ ์๋ํ ๊ฒ์ ์๋๋๋ค.
+
+```ts
+const ReactCompilerConfig = {
+ compilationMode: "annotation",
+};
+
+// src/app.jsx
+export default function App() {
+ "use memo";
+ // ...
+}
+```
+
+์ปดํ์ผ๋ฌ ๋์
์ ๋ํ ํ์ ์ด ์๊ธฐ๋ฉด, ๋ค๋ฅธ ๋๋ ํ ๋ฆฌ๋ก ์ ์ฉ ๋ฒ์๋ฅผ ํ์ฅํ์ฌ ์ ์ฐจ ์ ์ฒด ์ฑ์ผ๋ก ๋ฒ์๋ฅผ ๋ํ ์ ์์ต๋๋ค.
+
+### ์๋ก์ด ํ๋ก์ ํธ
+
+์ ํ๋ก์ ํธ๋ฅผ ์์ํ๋ ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ๋ฅผ ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค์ ํ์ฑํํ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ธฐ๋ณธ ๋์์
๋๋ค.
+
+### ์ฌ์ฉ๋ฒ
+
+### Babel
+
+```
+npm install babel-plugin-react-compiler
+```
+
+์ปดํ์ผ๋ฌ๋ ๋น๋ ํ์ดํ๋ผ์ธ์์ ์คํํ ์ ์๋ Babel ํ๋ฌ๊ทธ์ธ์ ํฌํจํ๊ณ ์์ต๋๋ค.
+
+์ค์น ํ, Babel ์ค์ ์ ์ถ๊ฐํ์ญ์์ค. ์ปดํ์ผ๋ฌ๊ฐ ํ์ดํ๋ผ์ธ์์ **๊ฐ์ฅ ๋จผ์ ** ์คํ๋๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
+
+```ts
+// babel.config.js
+const ReactCompilerConfig = {
+ /* ... */
+};
+
+module.exports = function () {
+ return {
+ plugins: [
+ ["babel-plugin-react-compiler", ReactCompilerConfig], // ๊ฐ์ฅ ๋จผ์ ์คํ ๋์ด์ผ ํฉ๋๋ค!
+ // ...
+ ],
+ };
+};
+```
+
+`babel-plugin-react-compiler`๋ ๋ค๋ฅธ Babel ํ๋ฌ๊ทธ์ธ๋ค๋ณด๋ค ๋จผ์ ์คํ๋์ด์ผ ํฉ๋๋ค.
+
+์ปดํ์ผ๋ฌ๋ ์ ํํ ๋ถ์์ ์ํด ์
๋ ฅ ์์ค ์ ๋ณด๋ฅผ ํ์๋ก ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+## Vite
+
+๋ง์ฝ Vite๋ฅผ ์ฌ์ฉํ์ ๋ค๋ฉด, ์ค์ ํ์ผ์ ํ๋ฌ๊ทธ์ธ์ ๋ฃ์ผ์ค ์ ์์ต๋๋ค.
+
+```ts
+// vite.config.js
+const ReactCompilerConfig = {
+ /* ... */
+};
+
+export default defineConfig(() => {
+ return {
+ plugins: [
+ react({
+ babel: {
+ plugins: [["babel-plugin-react-compiler", ReactCompilerConfig]],
+ },
+ }),
+ ],
+ // ...
+ };
+});
+```
+
+## Next.js
+
+Next.js๋ React ์ปดํ์ผ๋ฌ๋ฅผ ํ์ฑํํ๊ธฐ ์ํ ์คํ์ ์ค์ ์ ์ ๊ณตํฉ๋๋ค. ์ด ์ค์ ์ `babel-plugin-react-compiler`๊ฐ ์๋์ผ๋ก ์ค์ ๋๋๋ก ํฉ๋๋ค.
+
+- Next.js canary๋ฅผ ์ค์นํ์ธ์. ์ด๋ React 19 Release Candidate๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+
+- `babel-plugin-react-compiler`๋ฅผ ์ค์นํ์ธ์.
+
+```
+npm install next@canary babel-plugin-react-compiler
+```
+
+๊ทธ ํ์, `next.config.js`์์ ์คํ์ ์ธ ์ต์
์ ์ค์ ํด์ฃผ์ธ์.
+
+```ts
+// next.config.js
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ experimental: {
+ reactCompiler: true,
+ },
+};
+
+module.exports = nextConfig;
+```
+
+์คํ์ ์ต์
์ ์ฌ์ฉํ๋ฉด ๋ค์์์ React ์ปดํ์ผ๋ฌ์ ๋ํ ์ง์์ด ๋ณด์ฅ๋ฉ๋๋ค:
+
+- ์ฑ ๋ผ์ฐํฐ(App Router)
+
+- ํ์ด์ง ๋ผ์ฐํฐ(Pages Router)
+
+- ์นํฉ(Webpack) (๊ธฐ๋ณธ ์ค์ )
+
+- ํฐ๋ณดํฉ(Turbopack) (์ต์
์ผ๋ก --turbo๋ฅผ ํตํด ํ์ฑํ)
+
+## - Remix
+
+`vite-plugin-babel`์ ์ค์นํ์๊ณ , ํด๋น ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ์ธ์.
+
+```
+npm install vite-plugin-babel
+```
+
+```ts
+// vite.config.js
+import babel from "vite-plugin-babel";
+
+const ReactCompilerConfig = {
+ /* ... */
+};
+
+export default defineConfig({
+ plugins: [
+ remix({
+ /* ... */
+ }),
+ babel({
+ filter: /\.[jt]sx?$/,
+ babelConfig: {
+ presets: ["@babel/preset-typescript"], // if you use TypeScript
+ plugins: [["babel-plugin-react-compiler", ReactCompilerConfig]],
+ },
+ }),
+ ],
+});
+```
+
+## Webpack
+
+์ด ์ฒ๋ผ ๋ณธ์ธ๋ง์ React Compiler๋ฅผ ์ํ ๋ก๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
+
+```ts
+const ReactCompilerConfig = { /* ... */ };
+const BabelPluginReactCompiler = require('babel-plugin-react-compiler');
+
+function reactCompilerLoader(sourceCode, sourceMap) {
+ // ...
+ const result = transformSync(sourceCode, {
+ // ...
+ plugins: [
+ [BabelPluginReactCompiler, ReactCompilerConfig],
+ ],
+ // ...
+ });
+
+ if (result === null) {
+ this.callback(
+ Error(
+ `Failed to transform "${options.filename}"`
+ )
+ );
+ return;
+ }
+
+ this.callback(
+ null,
+ result.code
+ result.map === null ? undefined : result.map
+ );
+}
+
+module.exports = reactCompilerLoader;
+```
+
+## Expo
+
+Expo๋ Metro๋ฅผ ํตํด Babel์ ์ฌ์ฉํ๋ฏ๋ก, ์ค์น ์ง์นจ์ [Babel ์ฌ์ฉ ์น์
](https://react.dev/learn/react-compiler#usage-with-babel)์ ์ฐธ์กฐํ์ธ์.
+
+## Metro (React Native)
+
+React Native๋ Metro๋ฅผ ํตํด Babel์ ์ฌ์ฉํ๋ฏ๋ก, ์ค์น ์ง์นจ์ [Babel ์ฌ์ฉ ์น์
](https://react.dev/learn/react-compiler#usage-with-babel)์ ์ฐธ์กฐํ์ธ์.
+
+## ๋ฌธ์ ํด๊ฒฐ
+
+์ด์๋ฅผ ๋ณด๊ณ ํ๋ ค๋ฉด ๋จผ์ [React Compiler Playground](https://playground.react.dev/#N4Igzg9grgTgxgUxALhAejQAgFTYHIQAuumAtgqRAJYBeCAJpgEYCemASggIZyGYDCEUgAcqAGwQwANJjBUAdokyEAFlTCZ1meUUxdMcIcIjyE8vhBiYVECAGsAOvIBmURYSonMCAB7CzcgBuCGIsAAowEIhgYACCnFxioQAyXDAA5gixMDBcLADyzvlMAFYIvGAAFACUmMCYaNiYAHStOFgAvk5OGJgAshTUdIysHNy8AkbikrIKSqpaWvqGIiZmhE6u7p7ymAAqXEwSguZcCpKV9VSEFBodtcBOmAYmYHz0XIT6ALzefgFUYKhCJRBAxeLcJIsVIZLI5PKFYplCqVa63aoAbm6u0wMAQhFguwAPPRAQA+YAfL4dIloUmBMlODogDpAA)์์ ์ต์ ์ฌํ ์์ ๋ฅผ ๋ง๋ค์ด ๋ฒ๊ทธ ๋ณด๊ณ ์์ ํฌํจํ์ธ์.
+
+์ด์๋ [facebook/react ์ ์ฅ์](https://github.com/facebook/react/issues)์ ๋ฑ๋กํ ์ ์์ต๋๋ค.
+
+React Compiler Working Group์ ๊ฐ์
ํ์ฌ ํผ๋๋ฐฑ์ ์ ๊ณตํ ์๋ ์์ต๋๋ค.
+
+[๊ฐ์
์ ๋ํ ์์ธํ ๋ด์ฉ์ README๋ฅผ ์ฐธ์กฐ](https://github.com/reactwg/react-compiler)ํ์ธ์.
+
+## (0 , \_c) is not a function ์ค๋ฅ
+
+์ด ์ค๋ฅ๋ React 19 RC ์ด์์ ์ฌ์ฉํ์ง ์์ ๋ ๋ฐ์ํฉ๋๋ค.
+
+์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ฑ์ [React 19 RC๋ก ์
๊ทธ๋ ์ด๋](https://react.dev/blog/2024/04/25/react-19-upgrade-guide)ํ์ธ์.
+
+React 19๋ก ์
๊ทธ๋ ์ด๋ํ ์ ์๋ ๊ฒฝ์ฐ, [Working Group](https://github.com/reactwg/react-compiler/discussions/6)์์ ์ค๋ช
ํ ์บ์ ํจ์์ ์ฌ์ฉ์ ๊ณต๊ฐ ๊ตฌํ์ ์๋ํ ์ ์์ต๋๋ค.
+
+๊ทธ๋ฌ๋ ์ด๋ ๊ถ์ฅ๋์ง ์์ผ๋ฉฐ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ React 19๋ก ์
๊ทธ๋ ์ด๋ํด์ผ ํฉ๋๋ค.
+
+## ๋ด ์ปดํฌ๋ํธ๊ฐ ์ต์ ํ๋์๋์ง ์ด๋ป๊ฒ ์ ์ ์๋์?
+
+[React Devtools(v5.0+)](https://react.dev/learn/react-developer-tools)๋ React ์ปดํ์ผ๋ฌ์ ๋ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํ๋ฉฐ, ์ปดํ์ผ๋ฌ์ ์ํด ์ต์ ํ๋ ์ปดํฌ๋ํธ ์์ "Memo โจ" ๋ฐฐ์ง๋ฅผ ํ์ํฉ๋๋ค.
+
+## ์ปดํ์ผ ํ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ
+
+eslint-plugin-react-compiler๋ฅผ ์ค์นํ ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ๋ ์๋ํฐ์์ React ๊ท์น ์๋ฐ ์ฌํญ์ ํ์ํฉ๋๋ค.
+
+์ด ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ๋ ํด๋น ์ปดํฌ๋ํธ๋ ํ
์ ์ต์ ํ๋ฅผ ๊ฑด๋๋ฐ์๋ค๋ ์๋ฏธ์
๋๋ค.
+
+์ด๋ ์ ํ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ, ์ปดํ์ผ๋ฌ๋ ์ด๋ฅผ ๋ณต๊ตฌํ๊ณ ์ฝ๋๋ฒ ์ด์ค์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ๊ณ์ํด์ ์ต์ ํํ ์ ์์ต๋๋ค.
+
+๋ชจ๋ eslint ์๋ฐ ์ฌํญ์ ์ฆ์ ์์ ํ ํ์๋ ์์ต๋๋ค.
+
+์ต์ ํ๋๋ ์ปดํฌ๋ํธ์ ํ
์ ์๋ฅผ ๋๋ฆฌ๊ธฐ ์ํด ์์ ์ ์๋์ ๋ง์ถฐ ์ด๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
+
+๊ทธ๋ฌ๋ JavaScript์ ์ ์ฐํ๊ณ ๋์ ์ธ ํน์ฑ ๋๋ฌธ์ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํฌ๊ด์ ์ผ๋ก ๊ฐ์งํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
+
+์ด๋ฌํ ๊ฒฝ์ฐ์ ๋ฌดํ ๋ฃจํ์ ๊ฐ์ ๋ฒ๊ทธ๋ ์ ์๋์ง ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
+
+์ปดํ์ผ ํ ์ฑ์ด ์ ๋๋ก ์๋ํ์ง ์๊ณ eslint ์ค๋ฅ๊ฐ ํ์๋์ง ์๋๋ค๋ฉด, ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋๋ฅผ ์๋ชป ์ปดํ์ผํ์ ์ ์์ต๋๋ค.
+
+์ด๋ฅผ ํ์ธํ๋ ค๋ฉด ๊ด๋ จ์ด ์์ ์ ์๋ ์ปดํฌ๋ํธ๋ ํ
์ `"use no memo"` ์ง์์ด๋ฅผ ํตํด ๊ฐ์ ๋ก ์ตํธ์์ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด์ธ์.
+
+```ts
+function SuspiciousComponent() {
+ "use no memo"; // ์ด ์ปดํฌ๋ํธ๋ฅผ React ์ปดํ์ผ๋ฌ์ ์ํด ์ปดํ์ผ๋์ง ์๋๋ก ์ ์ธํฉ๋๋ค.
+ // ...
+}
+```
+
+## ์์๋์ด์ผ ํ ์
+
+> "use no memo"
+
+`"use no memo"`๋ React ์ปดํ์ผ๋ฌ์ ์ํด ์ปดํ์ผ๋์ง ์๋๋ก ์ปดํฌ๋ํธ์ ํ
์ ๋ฐฐ์ ํ ์ ์๋ ์์ ํ์ถ๊ตฌ์
๋๋ค.
+
+์ด ์ง์์ด๋ "use client"์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฅ๊ธฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ด ์๋๋๋ค.
+
+์ด ์ง์์ด๋ ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
+
+์ผ๋จ ์ปดํฌ๋ํธ๋ ํ
์ ๋ฐฐ์ ํ๋ฉด, ์ง์์ด๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ ๊น์ง๋ ์๊ตฌ์ ์ผ๋ก ๋ฐฐ์ ๋ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
+
+์ฆ, ์ฝ๋๋ฅผ ์์ ํ๋๋ผ๋ ์ง์์ด๋ฅผ ์ ๊ฑฐํ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ๋ ์ฌ์ ํ ์ปดํ์ผ์ ๊ฑด๋๋ฐ๊ฒ ๋ฉ๋๋ค.
+
+์ค๋ฅ๊ฐ ์ฌ๋ผ์ง๋ฉด, ์ตํธ์์ ์ง์์ด๋ฅผ ์ ๊ฑฐํ์ ๋ ๋ฌธ์ ๊ฐ ๋ค์ ๋ฐ์ํ๋์ง ํ์ธํ์ญ์์ค.
+
+๊ทธ๋ฐ ๋ค์ [React Compiler Playground](https://playground.react.dev/#N4Igzg9grgTgxgUxALhAejQAgFTYHIQAuumAtgqRAJYBeCAJpgEYCemASggIZyGYDCEUgAcqAGwQwANJjBUAdokyEAFlTCZ1meUUxdMcIcIjyE8vhBiYVECAGsAOvIBmURYSonMCAB7CzcgBuCGIsAAowEIhgYACCnFxioQAyXDAA5gixMDBcLADyzvlMAFYIvGAAFACUmMCYaNiYAHStOFgAvk5OGJgAshTUdIysHNy8AkbikrIKSqpaWvqGIiZmhE6u7p7ymAAqXEwSguZcCpKV9VSEFBodtcBOmAYmYHz0XIT6ALzefgFUYKhCJRBAxeLcJIsVIZLI5PKFYplCqVa63aoAbm6u0wMAQhFguwAPPRAQA+YAfL4dIloUmBMlODogDpAA)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๊ทธ ๋ณด๊ณ ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
+
+๋ฌธ์ ๋ฅผ ์์ ์ฌํ ์์ ๋ก ์ค์ด๊ฑฐ๋, ์คํ ์์ค ์ฝ๋์ธ ๊ฒฝ์ฐ ์ ์ฒด ์์ค๋ฅผ ๋ถ์ฌ๋ฃ์ด๋ ๋ฉ๋๋ค.
+
+์ด๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ ์ ์๋๋ก ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค.
+
+## ๋ค๋ฅธ ์ด์๋ค
+
+[์ด ๊ณณ](https://github.com/reactwg/react-compiler/discussions/7)์ ์ ์ํด์ฃผ์ธ์.