From b37d89d4826b3d438b4421702ef803bef1165ee4 Mon Sep 17 00:00:00 2001 From: Lee Jae Yeong <127748428+Jae0o@users.noreply.github.com> Date: Mon, 29 Jan 2024 12:09:31 +0900 Subject: [PATCH 1/4] Chapter_3-1 --- Chapter_3/useState.md | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 Chapter_3/useState.md diff --git a/Chapter_3/useState.md b/Chapter_3/useState.md new file mode 100644 index 0000000..456ab5e --- /dev/null +++ b/Chapter_3/useState.md @@ -0,0 +1,48 @@ +๐Ÿ’ก State ? ๋ฆฌ์•กํŠธ์—์„œ component ๊ฐ€ ์ง€๋‹ˆ๊ณ  ์žˆ๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•จ + +```jsx +const [state, setState] = useState(initailState); +const [num, setNum] = useState(0); +``` + +๋‚ด๋ถ€์˜ state๋Š” ์›ํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝ ์‹œ์ผœ ์ค„ ์ˆ˜ ์žˆ์Œ + +state + +ํ˜„์žฌ์˜ ์ƒํƒœ๊ฐ’์€ ๋ฐฐ์—ด ์ฒซ๋ฒˆ ์งธ ์•„์ดํ…œ์ธ state ๋‚ด๋ถ€์— ๋“ค์–ด์žˆ์Œ + +setState + +์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ ์‹œ์ผœ์ฃผ๊ณ ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ + +initailState + +ํ•ด๋‹น state์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ + +๋งŒ์•ฝ ์ „๋‹ฌ๋œ ์ดˆ๊ธฐ๊ฐ’์ด ์—†๋‹ค๋ฉด `undefined` + +- setState ๋ฅผ ์ด์šฉํ•ด state๋ฅผ ๋ณ€๊ฒฝ์‹œ์ผœ์ฃผ๋ฉด ํ•ด๋‹น component ๋Š” ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ Œ๋”๋ง์ด ์ง„ํ–‰๋จ +- state๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€์— ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ๋œ๋‹ค๋ฉด, ๋งค๋ฒˆ ๋ Œ๋”๋ง์ด ๋‹ค์‹œ ์ด๋ฃจ์–ด์งˆ๋•Œ + ํ•ด๋‹น ํ•จ์ˆ˜ํ˜• component๋Š” ๋งค๋ฒˆ ์‹คํ–‰๋˜์–ด์ง€๊ณ  ๋‚ด๋ถ€ ๋ณ€์ˆ˜์˜ ๋ณ€ํ™”๋œ ๊ฐ’์€ ๋งค๋ฒˆ ์ดˆ๊ธฐํ™”๋จ +- state๊ฐ€ ์ž์‹ ์˜ state๋ฅผ ๋ Œ๋”๋ง์ด ๋˜์–ด๋„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” closer + +### ๊ฒŒ์œผ๋ฅธ ์ดˆ๊ธฐํ™” + +๐Ÿ’ก `useState`์— ๋ณ€์ˆ˜ ๋Œ€์‹  ํ•จ์ˆ˜๋ฅผ ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒŒ์œผ๋ฅธ ์ดˆ๊ธฐํ™” ๋ผ๊ณ  ํ•จ + +```jsx +// ์ผ๋ฐ˜์  ์‚ฌ์šฉ ๋ฐฉ๋ฒ• +const [state,setState] = useState(Number.parseInt(window.localStorage ... )) +// ํ•ด๋‹น ๋กœ์ง์€ state๊ฐ€ ์ฒ˜์Œ ์‹คํ–‰๋˜๋Š” ์ˆœ๊ฐ„์—๋„ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•จ +// ๊ทธ๋ฆฌ๊ณ  ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด ๋‹ค์‹œ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ์ˆœ๊ฐ„์—๋„ ๋‹ค์‹œ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๊ฒŒ๋จ + +// ๊ฒŒ์œผ๋ฅธ ์ดˆ๊ธฐํ™” +const [state,setState] = useState(()=>{ + return Number.parseInt(window.localStorage.getItem(key)) +}) +``` + +- ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒŒ์œผ๋ฅธ ์ดˆ๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ˆœ๊ฐ„์€ ์ฃผ๋กœ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์„๋•Œ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•จ + โ‡’ ๋ Œ๋”๋ง์ด ๋‹ค์‹œ ๋ฐœ์ƒํ•˜๋ฉด ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ์‹คํ–‰ ๊ฐ’์ด ๋‹ค์‹œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ + โ‡’ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ ‘๊ทผ `map` `filter` `find` ๋“ฑ / Storage์— ์ ‘๊ทผ +- ๊ฒŒ์œผ๋ฅธ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋Š” ์˜ค๋กœ์ง€ state๊ฐ€ ์ฒ˜์Œ ๋งŒ๋“ค์–ด์ง€๋Š” ์ˆœ๊ฐ„์—๋งŒ ์‚ฌ์šฉ๋จ From 0c5c98ecc0db7a3fd954882a5a0e8ca5f05d8f22 Mon Sep 17 00:00:00 2001 From: Lee Jae Yeong <127748428+Jae0o@users.noreply.github.com> Date: Mon, 5 Feb 2024 14:29:52 +0900 Subject: [PATCH 2/4] useEffect --- Chapter_3/Jae0/useEffect.md | 113 +++++++++++++++++++++++++++++++ Chapter_3/{ => Jae0}/useState.md | 0 2 files changed, 113 insertions(+) create mode 100644 Chapter_3/Jae0/useEffect.md rename Chapter_3/{ => Jae0}/useState.md (100%) diff --git a/Chapter_3/Jae0/useEffect.md b/Chapter_3/Jae0/useEffect.md new file mode 100644 index 0000000..83e8562 --- /dev/null +++ b/Chapter_3/Jae0/useEffect.md @@ -0,0 +1,113 @@ +๐Ÿ’ก ๋ฌด์—‡์ธ๊ฐ€ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ฒจ๋‚  ๋Œ€ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋ฐ˜์‘ํ•˜๋Š” Hook + +์ฃผ๋กœ ํ™”๋ฉด์— ์ฒ˜์Œ ๋ Œ๋”๋ง๋ ๋•Œ , ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋Š”์ˆœ๊ฐ„ , ์‚ฌ๋ผ์ง€๋Š”์ˆœ๊ฐ„ ์— ํŠน์ • ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•จ + +```jsx +useEffect(() => { + // code +}, [value]); +``` + +**์ฒซ ๋ฒˆ์งธ ์ธ์ž** + +Callback ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›๊ณ , + +Callbackํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋จ + +**๋‘ ๋ฒˆ์งธ ์ธ์ž** + +dependency Arr ๋ฅผ ์ „๋‹ฌ๋ฐ›๊ณ  ๋‚ด๋ถ€์—๋Š” ๊ฐ’(value)์„ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ์Œ + +- ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’(value)์ด ๋ณ€ํ™” ๋˜์–ด์งˆ ๋•Œ ๋งˆ๋‹ค useEffect ๋‚ด๋ถ€์˜ Callback ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด์ง + +๐Ÿ”ฅย useEffect๋Š” ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ฐ’์„ ๊ฐ์‹œํ•˜์ง€ ์•Š๊ณ , + +๋ Œ๋”๋ง์ด ์ƒˆ๋กญ๊ฒŒ ๋  ๋•Œ๋งˆ๋‹ค ์˜์กด์„ฑ์— ์กด์žฌํ•˜๋Š” ๊ฐ’์„ ๋ณด๋ฉฐ ์˜์กด์„ฑ์˜ ๊ฐ’์ด ์ด์ „ ๊ฐ’๊ณผ ๋‹ค๋ฅผ๋•Œ + +์ „๋‹ฌ๋ฐ›์€ Callback ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. + +- ์ผ๋ถ€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ์™€ ๋™๊ธฐํ™” ํ•˜๋ ค๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ +- Component์˜ ์ตœ์ƒ์œ„ ์œ„์น˜์—์„œ๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Œ +- strict ๋ชจ๋“œ์—์„œ๋Š” useEffect๊ฐ€ 2๋ฒˆ ์‹คํ–‰ ๋˜์–ด์ง + +### ์˜์กด์„ฑ + +`` + +์˜์กด์„ฑ ๋ฐฐ์—ด ์กฐ์ฐจ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜์กด์„ฑ์„ ๋น„๊ตํ•  ํ•„์š” ์—†์ด ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค callback์ด ์‹คํ–‰๋จ + +โ‡’ ์ฃผ๋กœ component๊ฐ€ ๋ Œ๋”๋ง ๋œ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•จ + +```jsx +// ๋ Œ๋”๋ง ํ…Œ์ŠคํŠธ ์ฝ”๋“œ +useEffect(()=>{ + console.log("๋ Œ๋”๋ง ๋ฐœ์ƒ" +}) +``` + +๐Ÿ”ฅย ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์•„๋ฌด๊ฒƒ๋„ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ• ๊นŒ? + +1. useEffect๋Š” component๊ฐ€ ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋œ ํ›„ ์‹คํ–‰๋˜์–ด์ง€๊ณ , ์ผ๋ฐ˜ ํ•จ์ˆ˜๋Š” ๋ Œ๋”๋ง ๋„์ค‘ ์‹คํ–‰๋˜์–ด์ง +2. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๊ด€์ ์—์„œ useEffect๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š”๊ฒƒ์„ ๋ณด์žฅํ•จ + +`[]` + +๋นˆ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•œ ๊ฒฝ์šฐ React์—์„œ๋Š” ๋น„๊ตํ•  ์˜์กด์„ฑ์ด ์—†๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ  ์ตœ์ดˆ ๋ Œ๋”๋ง ์งํ›„์—๋งŒ ์‹คํ–‰๋˜์–ด์ง + +### ์ฃผ์˜, ๊ถŒ์žฅ ์‚ฌํ•ญ + +- useEffect๊ฐ€ ์ „๋‹ฌ ๋ฐ›๋Š” callback์— ๊ธฐ๋ช… ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•จ + + โ‡’ ๋งŽ์€ useEffect๋“ค์ด ์ƒ๊ฒจ๋‚˜๊ณ  ์ด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์Œ + + ```jsx + useEffect(function ์ด๋ฆ„() {}, []); + ``` + +- useEffect๋Š” ๊ฐ€๋Šฅํ•œ ์ž‘๊ณ  ๊ฐ€๋ณ๊ฒŒ ๋งŒ๋“ค์ˆ˜๋ก ์ข‹์Œ + +- dependency์—๋Š” ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด, ํ•จ์ˆ˜์™€ ๊ฐ™์€ ์ฐธ์กฐ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค + + ```jsx + function ChatRoom({ roomId }) { + const [message, setMessage] = useState(''); + + const options = { + serverUrl: serverUrl, + roomId: roomId + }; + + useEffect(() => { + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [options]); + // ... + ``` + + ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ options ๋ฅผ ๊ฐ์‹œํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, + ๋งŒ์•ฝ options์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์ด์œ ๋กœ rerender๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ ์›ํ•˜๋Š” ์˜๋„๋Š” + useEffect๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋„ํ•จ. + ํ•˜์ง€๋งŒ ๐Ÿ”ฅย options๋Š” ์ฐธ์กฐ ๋ฐ์ดํ„ฐ ์ด๊ธฐ๋•Œ๋ฌธ์— rerender์‹œ์— ๊ฐ’์˜ ๋ณ€ํ™”๊ฐ€ ์—†์–ด๋„ ์ฐธ์กฐ ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋จ + ๋”ฐ๋ผ์„œ useEffect๋Š” ์ฐธ์กฐ ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋œ๊ฒƒ์„ ๋ณ€ํ™”๋กœ ๊ฐ์ง€ํ•˜๊ณ  useEffect๊ฐ€ ์‹คํ–‰๋˜์–ด์ง + +### Clean Up + +๐Ÿ’ก ์ด์ „ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ์ด์ „ ์ƒํƒœ๋ฅผ ์ฒญ์†Œํ•ด์ฃผ๋Š” ์—ญํ•  + +```jsx +useEffect(() => { + element.addEventListener(); + + return () => { + element.removeEventListener(); + // clean up zone + }; +}); +``` + +clean up ์ž‘์—…์€ useEffect ์— ์ „๋‹ฌํ•œ callback ํ•จ์ˆ˜์˜ return ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜์–ด์ง + +๐Ÿ”ฅย ์ฆ‰ useEffect ๋‚ด๋ถ€์˜ callback์ด ์‹คํ–‰๋  ๋•Œ ์ด์ „ clean up ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด + +clean up ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ ํ•œ ๋’ค callback ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•จ diff --git a/Chapter_3/useState.md b/Chapter_3/Jae0/useState.md similarity index 100% rename from Chapter_3/useState.md rename to Chapter_3/Jae0/useState.md From 3236861d26244f8b7ce74c0b1af320d05739fdab Mon Sep 17 00:00:00 2001 From: Lee Jae Yeong <127748428+Jae0o@users.noreply.github.com> Date: Mon, 26 Feb 2024 13:50:32 +0900 Subject: [PATCH 3/4] useCallback --- Chapter_3/Jae0/useCallback.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Chapter_3/Jae0/useCallback.md diff --git a/Chapter_3/Jae0/useCallback.md b/Chapter_3/Jae0/useCallback.md new file mode 100644 index 0000000..37c80b9 --- /dev/null +++ b/Chapter_3/Jae0/useCallback.md @@ -0,0 +1,21 @@ +## useCallback + +`useMemo` ์—์„œ๋Š” ์ „๋‹ฌ ๋ฐ›์€ `Callback` ์˜ `return` ๊ฐ’์„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ•œ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ + +๐Ÿ’ก `useCallback` ์€ ์ „๋‹ฌ๋ฐ›์€ `Callback` ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ €์žฅํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ•จ +โ‡’ ์ฆ‰ ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋‹ค์‹œ ์žฌ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง + +useMemo์™€์˜ ์ฐจ์ด์ ์€ ์ €์žฅํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ด ๋ณ€์ˆ˜๋ƒ ํ•จ์ˆ˜๋ƒ์˜ ์ฐจ์ด ์ผ๋ฟ + +`const memoFuncName = useCallback( Callback , [ ] )` + +- **์ฒซ ๋ฒˆ์งธ ์ธ์ž** + + ๋ณ€์ˆ˜๋Š” ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ `Function`์„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•ด ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ฒŒ ๋จ + +- **๋‘ ๋ฒˆ์งธ ์ธ์ž** + Array๋กœ Array ์•ˆ์˜ ๋‚ด๋ถ€์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ด์ƒ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ! + +**์ฃผ์˜์ ** + +๐Ÿ”ฅย ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ง์ด ์กด์žฌํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋””ํŽœ๋˜์‹œ ์•ˆ์— ๋„ฃ์–ด์ค˜์•ผํ•จ! From 35c219340550827cf24f2ab5941e5cdf52b1faf2 Mon Sep 17 00:00:00 2001 From: Lee Jae Yeong <127748428+Jae0o@users.noreply.github.com> Date: Mon, 26 Feb 2024 13:55:03 +0900 Subject: [PATCH 4/4] useContext --- Chapter_3/Jae0/useContext.md | 105 +++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 Chapter_3/Jae0/useContext.md diff --git a/Chapter_3/Jae0/useContext.md b/Chapter_3/Jae0/useContext.md new file mode 100644 index 0000000..3bd820e --- /dev/null +++ b/Chapter_3/Jae0/useContext.md @@ -0,0 +1,105 @@ +> **Prop Drilling & Context** +> +> ๋งŒ์•ฝ ์ตœ ์ƒ์œ„ Component ๊ฐ€ ์ง€๋‹ˆ๊ณ  ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๊นŠ์ด ์กด์žฌํ•˜๋Š” ํ•˜์œ„ Component์—๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ +> +> ์œ„ํ•ด์„œ๋Š” ์ค‘๊ฐ„์— ์กด์žฌํ•˜๋Š” Component๋“ค์˜ prop์„ ํ†ตํ•ด ์ „๋‹ฌ > ์ „๋‹ฌ > ์ „๋‹ฌ > ์ „๋‹ฌ์„ ํ†ตํ•ด +> +> ์ฃผ๊ณ  ๋ฐ›์•„์•ผํ•˜๋Š” ๋ณต์žกํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ! - ๋ฌธ์ œ๋Š” ํ•˜์œ„์—์„œ ์ตœ์ƒ์œ„๋กœ ์ „๋‹ฌํ•  ๋•Œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ +> +> ์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ๊นŠ์–ด์ง€๊ณ  ์ƒํƒœ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ๋ถˆํŽธํ•˜๊ณ , +> +> ์ค‘๊ฐ„์— state๊ฐ€ ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์„ฑ์„ ์ดˆ๋ž˜ํ•จ +> +> ์ด๋Ÿฐ ๊ณผ์ •์„ PropDrilling์ด๋ผ๊ณ ํ•จ +> +> ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ prop drilling์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฐœ๋…์ด Context ์ž„ + +๐Ÿ’ก ์ด๋Ÿฐ Prop Drilling์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด Redux Recoil ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๊ณ , + +Context API๋Š” React ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์ƒํƒœ ์ฃผ์ž… API๋กœ +์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋งŒ๋“ค์–ด์ง„ Context๋ฅผ ํ†ตํ•ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ + +- ์ƒํƒœ๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ์—ญํ• ์„ ํ• ๋ฟ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” API๊ฐ€ ์•„๋‹˜ + - ๐Ÿ”ฅย Context API๋Š” ํŠน์ • ์ƒํƒœ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์ˆ˜ ์—†์œผ๋ฉฐ, + ํ•„์š”์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹˜ +- ์ตœ์ƒ๋‹จ์— Context provider๋ฅผ ์ง€์ •ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ฒ”์œ„๋ฅผ ์ขํžˆ๊ณ  ์ขํ˜€ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹์Œ + +**์‚ฌ์šฉ ๋ฐฉ๋ฒ•** + +```jsx +// Context ์ƒ์„ฑ + +import { createContext, useState } from "react"; + +// createContext ๋ฅผ ํ†ตํ•ด Context๋ฅผ ๋งŒ๋“ค์–ด์คŒ +export const Context = createContext(); + +// component๋ฅผ umbrella๋กœ ๊ฐ์‹ธ์ค„ ์™ธ๋ถ€ Wrap component ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ. +export function ContextProvider({ children }) { + // conText์—์„œ ์‚ฌ์šฉํ•  ๊ธฐ๋ณธ State ์ง€์ • + const [State, setState] = useState(false); + + // ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  Function + const Toggle = () => setState((state) => !state); + + return ( + + {/* ๊ธฐ๋ณธ ์ƒํƒœ์™€ ์ƒํƒœ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ๊ฐ์ฒด๋กœ ์ „๋‹ฌํ•œ๋‹ค */} + {children} + + ) +} + +// Context ์œ„์น˜ ์„ ์–ธ +export default function App() { + // ์•ž์„œ ๋งŒ๋“  ํ•ด๋‹น Context component๋กœ ๊ฐ์‹ธ ์ฃผ๊ธฐ + return ( + + + + ) +} + +// ํ•˜์œ„ Component + +export default function ChildComponent (){ + // useContext ๋ฅผ ํ†ตํ•ด Context ๋ถˆ๋Ÿฌ์˜ค๊ธฐ + const { State, Toggle } = useContext(Context); + + return ( +
+ { state } + +
+ ) +} +``` + +**ContextAPI ์˜ค๋ฅ˜ ๊ฒ€์ฆ** + +- ๋งŒ์•ฝ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ Context๋ฅผ ์ œ๋Œ€๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์„ ๋•Œ๋ฅผ ๋Œ€๋น„ํ•œ ๋ฐฉ์–ด ์ฝ”๋“œ + +```tsx +export default function ChildComponent() { + // useContext ๋ฅผ ํ†ตํ•ด Context ๋ถˆ๋Ÿฌ์˜ค๊ธฐ + + function checkContext() { + const context = useContext(Context); + if (context === undefined) { + throw new Error("context๊ฐ€ ๋ถˆ๋ ค์˜ค์ง€ ๋ชปํ•จ"); + } + return context; + } + + const { state, toggle } = checkContext(); + + return ( +
+ {state} + +
+ ); +} +```