Search

Hook

Hook

Hook ( ๊ฐˆ๊ณ ๋ฆฌ ) : ๋พฐ์กฑํ•˜๊ณ  ๊ตฌ๋ถ€๋Ÿฌ์ง„ ๋‚ ๋กœ ๋‹ค๋ฅธ ๋ฌผ์ฒด์— ๊ฑธ์–ด ์—ฐ๊ฒฐํ•˜๋Š” ๋„๊ตฌ
๊ฐˆ๊ณ ๋ฆฌ๋Š” ๋ฌผ๊ฑด์„ ์žก๊ฑฐ๋‚˜ ๊ฑธ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. hook์€ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๋‚˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ์žก๊ฑฐ๋‚˜ ๊ฑธ์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ผ๋Š” ์˜๋ฏธ์—์„œ ์œ ๋ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ์™€ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๋Š” API
๋ฆฌ์•กํŠธ 16.8 ๋ฒ„์ „๋ถ€ํ„ฐ ๋„์ž…

hook ์ข…๋ฅ˜

โ€ข
์ƒํƒœ ๊ด€๋ฆฌ์šฉ hook
โ€ข
๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ์šฉ hook
โ€ข
๊ธฐํƒ€ hook

์ƒํƒœ๊ด€๋ฆฌ hook

์ด๋ฆ„
์„ค๋ช…
useState()
์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ hook์ž…๋‹ˆ๋‹ค.
useReducer()
์ƒํƒœ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ hook์ž…๋‹ˆ๋‹ค.
useContext()
๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•œ hook์ž…๋‹ˆ๋‹ค.

๋ผ์ดํ”„์‚ฌ์ดํด hook

์ด๋ฆ„
์„ค๋ช…
useEffect()
์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ hook์ž…๋‹ˆ๋‹ค.
useLayoutEffect()
์ปดํฌ๋„ŒํŠธ์˜ ๋ ˆ์ด์•„์›ƒ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ hook์ž…๋‹ˆ๋‹ค.
useRef()
์ปดํฌ๋„ŒํŠธ์˜ DOM ์š”์†Œ๋‚˜ ๋ฆฌ์•กํŠธ ํ›…์˜ ์ƒํƒœ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ hook์ž…๋‹ˆ๋‹ค.

๊ธฐํƒ€ hook

์ด๋ฆ„
์„ค๋ช…
useMemo()
์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ๊ฐ’์„ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ , ์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ hook์ž…๋‹ˆ๋‹ค.
useCallback()
์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜๋ฅผ ์žฌ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ์ด์ „์— ์‹คํ–‰ํ•œ ํ•จ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ hook์ž…๋‹ˆ๋‹ค.
useImperativeHandle()
์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋‚˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ imperativeํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ hook์ž…๋‹ˆ๋‹ค.

hook ์ด ๋„์ž…๋œ ์ด์œ 

๋ฆฌ์•กํŠธ 16.8 ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์ƒํƒœ๊ด€๋ฆฌ ๋ฐ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰, ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ƒํƒœ๊ด€๋ฆฌ ๋ฐ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋ฐฉ๋ฒ•์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ ๋ฐ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ จ ๋กœ์ง์„ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์ƒํƒœ(state) ๋ฐ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ จ ๋กœ์ง์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, Hooks๊ฐ€ ๋„์ž…๋˜๋ฉด์„œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

hook ์žฅ์ 

hook์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
์ƒํƒœ ๊ด€๋ฆฌ์™€ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ๋ฅผ ๋” ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋” ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
hook์€ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ์„ ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์†Œ๋“œ vs hooks

Class Component Lifecycle Method
Hooks
componentDidMount
useEffect(() => {}, [])
componentDidUpdate
useEffect(() => {}, [/* dependency array */])
componentWillUnmount
useEffect(() => { return () => {} }, [])
getDerivedStateFromProps
useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ์—…๋ฐ์ดํŠธ`
shouldComponentUpdate
์ตœ์ ํ™” ๊ธฐ์ˆ  ์‚ฌ์šฉ (์˜ˆ: React.memo)
getSnapshotBeforeUpdate
useEffect ๋˜๋Š” useLayoutEffect ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ DOM ์ƒํƒœ ์ฒ˜๋ฆฌ`

componentDidMount

โ€ข
Class Component
componentDidMount() { // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ }
JavaScript
๋ณต์‚ฌ
โ€ข
Functional Component (hook)
useEffect(() => { // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ }, []);
JavaScript
๋ณต์‚ฌ

componentDidUpdate

โ€ข
Class Component
componentDidUpdate(prevProps, prevState) { // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ }
JavaScript
๋ณต์‚ฌ
โ€ข
Functional Component (hook)
useEffect(() => { // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ }, [/* dependency array */]);
JavaScript
๋ณต์‚ฌ

componentWillUnmount

โ€ข
Class Component
componentWillUnmount() { // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ }
JavaScript
๋ณต์‚ฌ
โ€ข
Functional Component (hook)
useEffect(() => { return () => { // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ }; }, []);
JavaScript
๋ณต์‚ฌ

getDerivedStateFromProps

โ€ข
Class Component
static getDerivedStateFromProps(nextProps, nextState) { // props๋กœ๋ถ€ํ„ฐ ํŒŒ์ƒ๋œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ return null; }
JavaScript
๋ณต์‚ฌ
โ€ข
Functional Component (hook)
useState()
JavaScript
๋ณต์‚ฌ

shouldComponentUpdate

โ€ข
Class Component
shouldComponentUpdate(nextProps, nextState) { // ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ • return true; // ๋˜๋Š” false }
JavaScript
๋ณต์‚ฌ
โ€ข
Functional Component (hook)
React.memo ๋ฅผ ํ†ตํ•œ ์ตœ์ ํ™”
JavaScript
๋ณต์‚ฌ

getSnapshotBeforeUpdate

โ€ข
Class Component
getSnapshotBeforeUpdate(prevProps, prevState) { // ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์ „์— DOM ์ƒํƒœ๋ฅผ ์บก์ฒ˜ return null; }
JavaScript
๋ณต์‚ฌ
โ€ข
Functional Component (hook)
useEffect์™€ useLayoutEffect ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ DOM ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
JavaScript
๋ณต์‚ฌ

์™œ useEffect ๊ฐ€ 2๋ฒˆ ํ˜ธ์ถœ๋˜๋‚˜์š”?

StrictMode ์ธ ๊ฒฝ์šฐ, useEffect() ์— 2๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ํ˜„์ƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
StrictMode์—์„œ useEffect๊ฐ€ ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์œผ๋ ค๋ฉด, ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ state๋‚˜ props๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

StrictMode ์ œ๊ฑฐ
ํด๋กœ์ € ์‚ฌ์šฉ
โ€ข
useEffect ๊ฐ€ 2๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์•„๋ž˜ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ 1๊ฐ€์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์œ  StrictMode

StrictMode๋Š” React์˜ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๋ณด๋‹ค ์—„๊ฒฉํ•˜๊ฒŒ ๊ฒ€์‚ฌํ•˜๋Š” ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. StrictMode๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ์„ ๋†’์ด๊ณ  ๋ฒ„๊ทธ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
์ฝ”๋“œ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
์ฝ”๋“œ์˜ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
StrictMode๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๋ Œ๋”๋ง ๋‹จ๊ณ„์˜ ๋ถ€์ž‘์šฉ ๊ฒ€์‚ฌ
โ€ข
ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ ๊ฒ€์‚ฌ
โ€ข
useState(),ย useEffect(),ย useContext()ย ํ›…์˜ ๋ถ€์ ์ ˆํ•œ ์‚ฌ์šฉ ๊ฒ€์‚ฌ
โ€ข
๋ฆฌ์•กํŠธ API์˜ ์ž˜๋ชป๋œ ์‚ฌ์šฉ ๊ฒ€์‚ฌ
StrictMode๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ์— React.StrictMode ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
import React, { StrictMode } from "react"; function App() { return ( <StrictMode> // StrictMode ์•„๋ž˜์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฒ€์‚ฌ๋ฉ๋‹ˆ๋‹ค. <MyComponent /> </StrictMode> ); }
JavaScript
๋ณต์‚ฌ

ํ˜„์ƒ ํ™•์ธ

const App = () => { const [count, setCount] = useState(0); useEffect(() => { // ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. setInterval(() => setCount(count + 1), 1000); }, [count]); return ( <div> <h1>ํ˜„์žฌ ์นด์šดํŠธ: {count}</h1> </div> ); };
JavaScript
๋ณต์‚ฌ
์ด ์ฝ”๋“œ์—์„œ๋Š” incrementCount ํ•จ์ˆ˜๋ฅผ ํด๋กœ์ €๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , setInterval() ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ count ๋ณ€์ˆ˜์— ์ง์ ‘ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, useEffect()๊ฐ€ ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค count ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
( ํ˜„์ƒ ํ•ด๊ฒฐ ๋‚ด์šฉ ์ˆ˜์ •์ค‘ )

ํ˜„์ƒ ํ•ด๊ฒฐ

ํด๋กœ์ € ์‚ฌ์šฉ
const App = () => { const [count, setCount] = useState(0); useEffect(() => { // ํด๋กœ์ €๋ฅผ ์ปดํฌ๋„ŒํŠธ์˜ props๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. const incrementCount = () => setCount(count + 1); // ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ํด๋กœ์ €๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. return () => { clearInterval(incrementCount); }; }, [count]); return ( <div> <h1>ํ˜„์žฌ ์นด์šดํŠธ: {count}</h1> </div> ); };
JavaScript
๋ณต์‚ฌ

ํด๋กœ์ € (closure) ๋ž€?

ํด๋กœ์ €๋Š” ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ํ™˜๊ฒฝ์„ ํ•จ๊ป˜ ๋ฌถ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋กœ์ €๋Š” ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ํ™˜๊ฒฝ์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
function outer() { const inner = () => { // inner ํ•จ์ˆ˜๋Š” outer ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ํ™˜๊ฒฝ์˜ count ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. const count = 10; return count; }; return inner; } const closure = outer(); const result = closure(); console.log(result); // 10
JavaScript
๋ณต์‚ฌ
์œ„ ์ฝ”๋“œ์—์„œ๋Š” outer() ํ•จ์ˆ˜์—์„œ inner() ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. inner() ํ•จ์ˆ˜๋Š” outer() ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ํ™˜๊ฒฝ์˜ count ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. closure ๋ณ€์ˆ˜๋Š” outer() ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์ธ inner() ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. result ๋ณ€์ˆ˜๋Š” closure() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
ํด๋กœ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๊ณ ์ฐจ ํ•จ์ˆ˜์—์„œ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ํ•จ์ˆ˜์˜ ํ™˜๊ฒฝ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ ํ™˜๊ฒฝ์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์˜ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
ํด๋กœ์ €๋Š” ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ํ™˜๊ฒฝ์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ์ž˜ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
ํด๋กœ์ €๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์‚ฌ์šฉ์ด ์™„๋ฃŒ๋œ ํ›„์—๋Š” ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

useState()

๋ฆฌ์•กํŠธ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ํ›…
โ€ข
์ƒํƒœ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ์ƒํƒœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
โ€ข
useState๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
โ—ฆ
์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ์ƒํƒœ ๊ฐ’์˜ ์ดˆ๊นƒ๊ฐ’์ž…๋‹ˆ๋‹ค.
โ—ฆ
๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ์ƒํƒœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•

const [์ƒํƒœ, ์ƒํƒœ๋ณ€๊ฒฝํ•จ์ˆ˜] = useState(์ดˆ๊ธฐ๊ฐ’);
JavaScript
๋ณต์‚ฌ
function Counter() { const [count, setCount] = useState(0); return ( <div> <button onClick={() => setCount(count + 1)}>+</button> <button onClick={() => setCount(count - 1)}>-</button> <p>{count}</p> </div> ); }
JavaScript
๋ณต์‚ฌ

useEffect()

๋ฆฌ์•กํŠธ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ›…
โ€ข
์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋˜๊ฑฐ๋‚˜ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ, ์ƒํƒœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋“ฑ ํŠน์ • ์‹œ์ ์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
useEffect๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
โ—ฆ
์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
โ—ฆ
๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•

useEffect( () => { // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋œ ์ดํ›„ ์‹คํ–‰ // ์ถ”๊ฐ€์ ์œผ๋กœ, ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋”ฐ๋ผ์„œ ์‹คํ–‰๋จ return () => { // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋จ } }, ์˜์กด์„ฑ๋ฐฐ์—ด );
JavaScript
๋ณต์‚ฌ
1.
์˜์กด์„ฑ ๋ฐฐ์—ด์„ [ ] ๋นˆ ๋ฐฐ์—ด๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ
2.
์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ
3.
์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ƒ๋žตํ•œ ๊ฒฝ์šฐ

์˜์กด์„ฑ ๋ฐฐ์—ด์„ [ ] ๋นˆ ๋ฐฐ์—ด๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ

์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ์™€ ์–ธ๋งˆ์šดํŠธ ์‹œ, useEffect() ๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
function Counter() { const [count, setCount] = useState(0); useEffect(() => { // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ/์–ธ๋งˆ์šดํŠธ ์‹œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ }, []); return ( <div> <button onClick={() => setCount(count + 1)}>+</button> <button onClick={() => setCount(count - 1)}>-</button> <p>{count}</p> </div> ); }
JavaScript
๋ณต์‚ฌ

์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ

์˜์กด์„ฑ ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค useEffect() ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
function Counter() { const [count, setCount] = useState(0); const id = 1; useEffect(() => { // id์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰ }, [id]); return ( <div> <button onClick={() => setCount(count + 1)}>+</button> <button onClick={() => setCount(count - 1)}>-</button> <p>{count}</p> </div> ); }
JavaScript
๋ณต์‚ฌ

์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ƒ๋žตํ•œ ๊ฒฝ์šฐ

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ๋งˆ๋‹ค, ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค useEffect() ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
function Counter() { const [count, setCount] = useState(0); useEffect(() => { // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ๋งˆ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰ }); return ( <div> <button onClick={() => setCount(count + 1)}>+</button> <button onClick={() => setCount(count - 1)}>-</button> <p>{count}</p> </div> ); }
JavaScript
๋ณต์‚ฌ

์‹ค์Šต์ฝ”๋“œ