λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» DEV/React

[React] React 의 μƒνƒœ (State) 와 μ΄νŽ™νŠΈ ν›…(Effect Hook)

by vodkassi 2021. 5. 9.
728x90

✨ State λž€?

μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ λ™μ μœΌλ‘œ λ³€κ²½λ˜λŠ” 값이닀.

 

✨ State 의 νŠΉμ§•μ€?

μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ μ œμ–΄(관리)λœλ‹€.

State μ—…λ°μ΄νŠΈλŠ” 비동기적(Asynchronous)이닀. DOM 은 State κ°€ 변경될 λ•Œλ§ˆλ‹€ re-rendering λ˜μ§€ μ•ŠμœΌλ©°, μ—¬λŸ¬ μ°¨λ‘€μ˜ setState κ°€ μžˆλ‹€λ©΄ μ „λΆ€ ν†΅ν•©ν•˜μ—¬ ν•œ λ²ˆμ— re-rendering ν•œλ‹€.

State λ₯Ό props 둜 μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— 전달할 수 μžˆλ‹€. (μΊ‘μŠν™” λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€.)

 

✨ State λ₯Ό μ‚¬μš©ν•˜λŠ” 방법은?

ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” useState λΌλŠ” ν›…(Hook)을 톡해 μ‚¬μš©ν•  수 μžˆλ‹€.

useState λ₯Ό ν™œμš©ν•˜μ—¬ state 의 μ΄ˆκΈ°κ°’μ„ 지정해쀄 수 있으며, μ΄ˆκΈ°κ°’μ€ μ–΄λ– ν•œ μžλ£Œν˜•μ΄λ“  될 수 μžˆλ‹€. (λ¬Έμžμ—΄, λ°°μ—΄, 객체 λ“±)

setState λŠ” state λ₯Ό κ°±μ‹ ν•΄μ£ΌλŠ” ν•¨μˆ˜μ΄λ©°, 이λ₯Ό ν†΅ν•΄μ„œλ§Œ state의 값을 λ³€κ²½ν•  수 μžˆλ‹€.

λΉ„λ™κΈ°μ μ΄λΌλŠ” νŠΉμ§•μœΌλ‘œ 인해, ν•˜λ‚˜μ˜ ν•¨μˆ˜ λ‚΄μ—μ„œ λ³€κ²½ν•œ state λ₯Ό λ°”λ‘œ μ΄μ–΄μ„œ 뢈러올 μˆ˜λŠ” μ—†λ‹€.

 

import { useState } from 'react' 

const Component = () => { 
	const [ state, setState ] = useState('') 
}

 

✨ Effect Hook λž€?

"Hook" μ΄λž€? ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ State 와 LifeCycle κΈ°λŠ₯을 μ‚¬μš©ν•  수 있게 ν•΄ μ£ΌλŠ” μ»΄ν¬λ„ŒνŠΈμ΄λ‹€. 즉, μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ˜ 생애주기와 μƒνƒœλ₯Ό 관리할 수 μžˆλ„λ‘ λ•λŠ” ν•¨μˆ˜μ΄λ‹€. React 의 λ‚΄μž₯ Hook μœΌλ‘œλŠ” State hook, Effect hook 등이 μžˆλ‹€.

 

Effect Hook 은 μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ νŠΉμ • 뢀뢄에 λ³€ν™”κ°€ 생긴 뒀에 (ν˜Ήμ€ λ Œλ”λ§ 이후에) μ§€μ •ν•œ 효과(===μ½œλ°±ν•¨μˆ˜)λ₯Ό μ‹€ν–‰ν•œλ‹€. νŠΉμ • λ™μž‘μ΄ λ°œμƒν•˜λ©΄ μžλ™μœΌλ‘œ νŠΉμ • 행동을 ν•˜λ„λ‘ ν•˜λŠ” Hook 이라고 보면 λœλ‹€.

 

λ§€κ°œλ³€μˆ˜ (parameters)

useEffect(callback, state) ν•¨μˆ˜λŠ” 두 개의 μ „λ‹¬μΈμžλ₯Ό λ°›λŠ”λ‹€.

  첫 번째 μ „λ‹¬μΈμžλŠ” callback ν•¨μˆ˜μ΄λ‹€.

  두 번째 μ „λ‹¬μΈμžλŠ” μ˜μ‘΄μ„±μ„ 담은 λ°°μ—΄λ‘œ, μ–΄λ–€ ν™˜κ²½(λ˜λŠ” 쑰건)μ—μ„œ callback ν•¨μˆ˜κ°€ 싀행될지λ₯Ό 지정해쀀닀. 이 뢀뢄이 μ „λ‹¬λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§ 될 λ•Œλ§ˆλ‹€ callback 이 μ‹€ν–‰λœλ‹€.

 

useEffect(() => { 
	console.log('test state에 λŒ€ν•΄μ„œλ§Œ 호좜!') 
}, [test]) 
// ν•΄λ‹Ή hook 의 경우, μ»΄ν¬λ„ŒνŠΈ λ‚΄ test λΌλŠ” state 에 λ³€ν™”κ°€ 생길 λ•Œλ§Œ console.log ν•¨μˆ˜κ°€ μ‹€ν–‰λœλ‹€.

 

μ»΄ν¬λ„ŒνŠΈκ°€ μ²˜μŒμ— λ Œλ”λ§ 될 λ•Œ ν•œ 번만 μ‹€ν–‰ν•˜κ³  싢은 경우, 두 번째 μ „λ‹¬μΈμžμ— 빈 배열을 λ„˜κΈ°λ©΄ λœλ‹€.

 

useEffect(() => { 
	console.log('처음 ν•œ 번만 μ‹€ν–‰!') 
}, [])

 

 

UseEffect 와 Cleanup

UseEffect ν•¨μˆ˜μ˜ callback ν•¨μˆ˜μ—μ„œ 또 ν•¨μˆ˜λ₯Ό return ν•  수 있으며, 이λ₯Ό cleanup ν•¨μˆ˜λΌκ³  ν•œλ‹€.

 

useEffect(() => { 
	console.log('update count1'); 
    return () => { 
    	console.log('update count1 or unmount'); 
    }; 
}, [count]);

 

cleanup ν•¨μˆ˜μ˜ νŠΉμ§•μ€ μƒˆλ‘œμš΄ μƒνƒœλ‘œ 인해 Effect κ°€ 싀행될 λ•Œ, μ΄μ „μ˜ 값을 μœ μ§€ν•œ μƒνƒœμ—μ„œ μ‹€ν–‰λœλ‹€λŠ” 점이닀.

 

useEffect(() => { 
	console.log(count);
  	return () => { 
    	console.log("cleanup" + count); 
    }; 
}, [count]);

 

예λ₯Ό λ“€μ–΄ count κ°€ 0 μ—μ„œ 1둜 λ³€ν™”ν•  경우, μ½˜μ†”μ°½μ—λŠ” 'cleanup0', '1'κ°€ μˆœμ„œλŒ€λ‘œ μ°νžŒλ‹€. μ΄μ–΄μ„œ count κ°€ 1μ—μ„œ 2둜 λ³€ν™”ν•  경우, μ½˜μ†”μ°½μ—λŠ” 'cleanup1', '2'κ°€ μˆœμ„œλŒ€λ‘œ μ°νžŒλ‹€. cleanup ν•¨μˆ˜λŠ” μ΅œμ’…μ μœΌλ‘œ component κ°€ 제거되기 μ „ (unmount ν•  λ•Œ) ν•œ 번 더 μ‹€ν–‰λœλ‹€.

 

✨ Hook μ‚¬μš© μ‹œ μ£Όμ˜ν•  점

μ»΄ν¬λ„ŒνŠΈ 내뢀에 선언을 ν•΄ μ£Όμ–΄μ•Ό 효과λ₯Ό 쀄 수 μžˆλ‹€.

λ˜ν•œ, μ»΄ν¬λ„ŒνŠΈ μ΅œμƒλ‹¨μ— 선언을 ν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€ (μ‘°κ±΄λ¬Έμ΄λ‚˜ 반볡문 μ•ˆμ— μ„ μ–Έν•˜λ©΄ νš¨κ³Όκ°€ μ—†λ‹€.)

 

 

참고자료

React κ³΅μ‹λ¬Έμ„œ

λ•ŒλŠ¦μ€ React Hooks μ‹œλ¦¬μ¦ˆ 2탄 - useEffect

React Hooks: useState, useEffect μ•Œμ•„λ³΄κΈ°

λŒ“κΈ€