์์ ํจ์๋ ๋ฌด์์ธ๊ฐ?
์์ ํจ์๋ ์ฌ์ด๋ ์ดํํธ๊ฐ ์๋ ํจ์, ์ฆ ํจ์์ ์คํ์ด ์ธ๋ถ์ ์ํฅ์ ๋ผ์น์ง ์๋ ํจ์๋ฅผ ๋ปํ๊ณ ์ ๋ ฅ์ผ๋ก ์ ๋ฌ๋ ๊ฐ์ ์์ ํ์ง ์๋ ๋ถ๋ณ์ฑ์ ๊ฐ์ง๊ณ ์๋ค. ๋ฐ๋ผ์ ์์ํจ์๋ ์ด๋ ํ ์ ๋ฌ์ธ์๊ฐ ์ฃผ์ด์ง๋๋ผ๋ ํญ์ ๋๊ฐ์ ๊ฐ์ด ๋ฆฌํด๋จ์ ๋ณด์ฅํ๋ค.
- ์ฌ์ด๋ ์ดํํธ๋ฅผ ๋ง๋ค์ง ์๋๋ค. ํจ์๋ ์ ๋ ฅ๋ฐ์ ๊ฐ๋ง์ ๊ฐ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ฉฐ, ๊ทธ ์ธ ์ด๋ค ์ธ๋ถ ์ํ๋ ๋ณ๊ฒฝํ์ง ์๋๋ค.
- ๋์ผ ์ ๋ ฅ, ๋์ผ ์ถ๋ ฅ. ๋์ผํ ์ ๋ ฅ์ ๋ํด ์์ ํจ์๋ ์ธ์ ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
์ฌ์ด๋ ์ดํํธ๋?
ํจ์์ ์
๋ ฅ ์ธ์๋ ํจ์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น๋ ์์ธ์ด๋ค. ๋ํ์ ์ผ๋ก ๋คํธ์ํฌ ์์ฒญ,
API ํธ์ถ์ด side effect์ด๋ค.
์์ ํจ์ ๊ฐ๋ ์ด ์ค์ํ ์ด์ ๋?
์ฌ์ด๋ ์ดํํธ๋ฅผ ์ค์ด๊ณ , ๋ชจ๋ํ ์์ค์ ๋์ด๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํน์ง, ์ฆ ์์ ํจ์๋ ํ๊ฐ ์์ ์ด ๋ฌด๊ดํ๋ค๋ ํน์ง์ผ๋ก ์ธํด ํจ์จ์ ์ธ ๋ก์ง์ ๊ตฌ์ฑํ ์ ์๋ค.
React์์์ ์์ ์ปดํฌ๋ํธ๋?
React๋ ์์ ํจ์๋ฅผ ์ค์ฌ์ผ๋ก ์ค๊ณ๋์๋ค. ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ์์ ํจ์๋ผ๊ณ ๊ฐ์ ํ๋ค.
์ฆ, ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ React ์ปดํฌ๋ํธ๋ ๋์ผํ ์
๋ ฅ์ด ์ฃผ์ด์ก์ ๋ ํญ์ ๋์ผํ JSX๋ฅผ ๋ฐํํด์ผ ํ๋ค.
๋ค์ ์ฝ๋๋ ๋ถ์ํ ์ปดํฌ๋ํธ์ ์์์ด๋ค. ๐
let guest = 0
function Cup() {
// Bad : ๊ธฐ์กด ๋ณ์๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค!
guest = guest + 1
return <h2>Tea cup for guest #{guest}</h2>
}
export default function TeaSet() {
return (
<>
<Cup />
<Cup />
<Cup />
</>
)
}
์ด ์ปดํฌ๋ํธ๋ ์ธ๋ถ์์ ์ ์ธ๋ guest
๋ณ์๋ฅผ ์ฝ๊ณ ์ฐ๊ณ ์๋ค. ์ฆ, ์ด ์ปดํฌ๋ํธ๋ ํธ์ถํ ๋๋ง๋ค ๋ค๋ฅธ JSX๊ฐ ์์ฑ๋๋ค๋ ๋ป์ด๋ค! ๊ฒ๋ค๊ฐ ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ guest
๋ฅผ ์ฝ์ผ๋ฉด ๋ ๋๋ง๋ ์์ ์ ๋ฐ๋ผ JSX๋ ๋ค๋ฅด๊ฒ ์์ฑ๋๋ค.
guest
๋ฅผ props๋ก ์ ๋ฌํจ์ผ๋ก์จ ์ด ์ปดํฌ๋ํธ๋ฅผ ๊ณ ์น ์ ์๋ค. ๐
function Cup({ guest }) {
return <h2>Tea cup for guest #{guest}</h2>
}
export default function TeaSet() {
return (
<>
<Cup guest={1} />
<Cup guest={2} />
<Cup guest={3} />
</>
)
}
์ด์ ์ปดํฌ๋ํธ๊ฐ ๋ฐํํ๋ JSX๋ guest
props์๋ง ์์กดํ๋ฏ๋ก ์์ํ๋ค. ๊ฐ ์ปดํฌ๋ํธ๋ ๋ ๋๋ง ์ค์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์กฐ์จํ๊ฑฐ๋ ์์กดํ์ง ๋ง๊ณ "์ค์ค๋ก ์๊ฐ"ํ๊ฒ ํด์ผํ๋ค.
local mutation (์ง์ญ ๋ณ์ด) : ์ปดํฌ๋ํธ์ ์์ ๋น๋ฐ
์์ ์์์์๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋งํ๋ ๋์ ๊ธฐ์กด ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๋ฌธ์ ์๋ค. ์ด๋ฅผ "๋ณ์ด(mutation)" ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์์ ํจ์๋ ํจ์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ณ์๋ ํธ์ถ ์ ์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋ณ์ดํ์ง ์๋๋ค. ๊ทธ๋ฌ๋ฉด ์์ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ๋ ๋๋งํ๋ ๋์ '๋ฐฉ๊ธ' ์์ฑํ ๋ณ์์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ด์ฐฎ๋ค. ์ด ์์ ์์๋ ๋ฐฐ์ด์ ์์ฑํ๊ณ ์ด๋ฅผ cups
๋ณ์์ ํ ๋นํ ๋ค์ ์ปต 12๊ฐ๋ฅผ ๊ทธ ์์ push ํ๋ค.
function Cup({ guest }) {
return <h2>Tea cup for guest #{guest}</h2>
}
export default function TeaGathering() {
let cups = []
for (let i = 1; i < 12; i++) {
cups.push(<Cup key={i} guest={i} />)
}
return cups
}
cups
๋ณ์๋ ๋ฐฐ์ด์ด TeaGathering
ํจ์ ์ธ๋ถ์์ ์์ฑ๋์๋ค๋ฉด ์ด๋ ํฐ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด๋ค! ํด๋น ๋ฐฐ์ด์ ํญ๋ชฉ์ ๋ฐ์ด ๋ฃ์์ผ๋ก์จ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง TeaGathering
๋ด๋ถ์์ ๋์ผํ ๋ ๋๋ง ์ค์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ๋ค. TeaGathering
์ธ๋ถ์ ์ด๋ค ์ฝ๋๋ ์ด๋ฐ ์ผ์ด ์ผ์ด๋ฌ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ฅผ "์ง์ญ ๋ณ์ด(Local Mutation)"์ด๋ผ๊ณ ํ๋ฉฐ, ์ปดํฌ๋ํธ์ ์์ ๋น๋ฐ๊ณผ ๊ฐ๋ค.
์ฌ์ด๋ ์ดํํธ๋ฅผ ์ผ์ผํฌ ์ ์๋ ๊ณณ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์์์ฑ์ ํฌ๊ฒ ์์กดํ์ง๋ง, ์ธ์ ๊ฐ๋ ์ด๋๊ฐ์์ ๋ฌด์ธ๊ฐ๋ ๋ฐ๋์ด์ผ ํ๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ด๋ค! ํ๋ฉด ์ ๋ฐ์ดํธ, ์ ๋๋ฉ์ด์ ์์, ๋ฐ์ดํฐ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ ์ด๋ฌํ ๋ณ๊ฒฝ์ ์ฌ์ด๋ ์ดํํธ๋ผ๊ณ ํ๋ฉฐ, ๋ ๋๋ง ์ค์ ์ผ์ด๋๋ ๊ฒ์ด ์๋๋ผ "๋ถ์์ ์ผ๋ก" ์ผ์ด๋๋ ์ผ์ด๋ค.
React์์ ์ฌ์ด๋ ์ดํํธ๋ ๋ณดํต ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ํ๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ปดํฌ๋ํธ ๋ด๋ถ์ ์ ์๋์ด ์๊ธด ํ์ง๋ง ๋ ๋๋ง ์ค์๋ ์คํ๋์ง ์๋๋ค! ๋ฐ๋ผ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์์ํ ํ์๊ฐ ์๋ค.
๋ค๋ฅธ ๋ชจ๋ ์ต์
์ ๋ค ์ฌ์ฉํ๋๋ฐ๋ ์ฌ์ด๋ ์ดํํฐ์ ์ ํฉํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฐพ์ ์ ์๋ค๋ฉด, ์ปดํฌ๋ํธ์์ useEffect
ํธ์ถ์ ํตํด ๋ฐํ๋ JSX์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฒจ๋ถํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋์ค์ ๋ ๋๋ง ํ ์ฌ์ด๋ ์ดํํธ๊ฐ ํ์ฉ๋ ๋ React๊ฐ ์ด๋ฅผ ์คํํ๋๋ก ์ง์ํ๋ค. ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ตํ์ ์๋จ์ผ๋ก ์ฌ์ฉํด์ผํ๋ค.
์์ฝ
-
์ปดํฌ๋ํธ๋ ์์ํด์ผ ํ๋ค.
- ์ฌ์ด๋ ์ดํํธ๋ฅผ ๋ง๋ค์ง ์๋๋ค. ํจ์๋ ์ ๋ ฅ๋ฐ์ ๊ฐ๋ง์ ๊ฐ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ฉฐ, ๊ทธ ์ธ ์ด๋ค ์ธ๋ถ ์ํ๋ ๋ณ๊ฒฝํ์ง ์๋๋ค.
- ๋์ผ ์ ๋ ฅ, ๋์ผ ์ถ๋ ฅ. ๋์ผํ ์ ๋ ฅ์ ๋ํด ์์ ํจ์๋ ์ธ์ ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
- ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง์ ์ฌ์ฉํ๋ ์ด๋ ํ ์
๋ ฅ๊ฐ๋ ๋ณ์ดํด์๋ ์๋๋ค. ์ฌ๊ธฐ์๋ props, state ๋ฐ context๊ฐ ํฌํจ๋๋ค. ํ๋ฉด์ ์
๋ฐ์ดํธํ๋ ค๋ฉด ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณ์ดํ๋ ๋์
setState
๋ฅผ ์ฌ์ฉํ์. - ์ปดํฌ๋ํธ์ ๋ก์ง์ ๋ฐํํ๋ JSX ์์ ํํํ๊ธฐ ์ํด ๋
ธ๋ ฅํ์. "๋ฌด์ธ๊ฐ๋ฅผ ๋ณ๊ฒฝ"ํด์ผ ํ ๋๋ ๋ณดํต ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ ์ด ์์
์ ์ํํ๊ณ ์ ํ ๊ฒ์ด๋ค. ์ตํ์ ์๋จ์ผ๋ก
useEffect
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.