React Hookμ΄λž€?

Daehyeon YunΒ·2024λ…„ 8μ›” 7일

ν”„λ‘ νŠΈμ—”λ“œ

λͺ©λ‘ 보기
14/14

React Hookμ΄λž€

πŸ“– Reference

  • Copilot μ„ μƒλ‹˜

πŸ€” React Hookμ΄λž€ λ¬΄μ—‡μΌκΉŒ?

React Hook은 React 16.8 버전뢀터 λ„μž…λœ κ°œλ…μž…λ‹ˆλ‹€. μ΄λŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλ„ μƒνƒœκ΄€λ¦¬μ™€ 생λͺ… μ£ΌκΈ° λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.

  • 클래슀 μ»΄ν¬λ„ŒνŠΈμ—μ„œλ§Œ κ°€λŠ₯ν–ˆλ˜ κΈ°λŠ₯듀을 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλ„ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
  • μ½”λ“œλ₯Ό λ”μš± κ°„κ²°ν•˜κ³ , μ»΄ν¬λ„ŒνŠΈ κ°„μ˜ μƒνƒœ λ‘œμ§μ„ μž¬μ‚¬μš©ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ–΄μ€λ‹ˆλ‹€.

πŸ’‘ λŒ€ν‘œμ μΈ React Hook μ’…λ₯˜λ“€

1. useState

: Reactμ—μ„œ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” Hookμž…λ‹ˆλ‹€. ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μƒνƒœ(State)λ₯Ό 관리할 수 있게 ν•΄μ€λ‹ˆλ‹€. κ°œλ°œμžκ°€ μƒνƒœκ°’μ„ λ³€κ²½ν•˜κ³  μ—…λ°μ΄νŠΈλ₯Ό ν•  수 있게 λ„μ™€μ€λ‹ˆλ‹€.

2. useEffect

: μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§ μ΄ν›„μ˜ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€. (데이터 κ°€μ Έμ˜€κΈ°, DOM μ‘°μž‘ λ“±λ“±)

3. useContext

: React의 Context APIλ₯Ό μ‚¬μš©ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈ 트리 μ•ˆμ—μ„œ μ „μ—­ μƒνƒœ 곡유λ₯Ό λ„μ™€μ€λ‹ˆλ‹€.

4. useCallback

: ν•¨μˆ˜λ₯Ό μ €μž₯ν•˜μ—¬ μ„±λŠ₯ μ΅œμ ν™”λ₯Ό λ„μ™€μ€λ‹ˆλ‹€. λ˜ν•œ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ λ‹€μ‹œ λ Œλ”λ§ λ˜μ–΄λ„ ν•¨μˆ˜λ₯Ό μƒˆλ‘œ μƒμ„±ν•˜μ§€ μ•Šκ³  μž¬μ‚¬μš©ν•  수 μžˆλ‹€λŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

5. useMemo

: νŠΉμ • 값을 μ €μž₯ν•˜μ—¬ μ„±λŠ₯ μ΅œμ ν™”λ₯Ό λ„μ™€μ€λ‹ˆλ‹€. 계산 λΉ„μš©μ΄ 큰 연산을 μˆ˜ν–‰ν•˜κ±°λ‚˜ λ™μΌν•œ 값을 μ—¬λŸ¬ 번 κ³„μ‚°ν•˜μ§€ μ•Šλ„λ‘ ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

6. useRef

: μ»΄ν¬λ„ŒνŠΈμ—μ„œ DOM μš”μ†Œλ₯Ό μ„ νƒν•˜κ±°λ‚˜ μ°Έμ‘°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€. ref 객체λ₯Ό μƒμ„±ν•˜μ—¬ DOM μš”μ†Œμ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

7. useLayoutEffect

: useEffect 와 μœ μ‚¬ν•˜κ²Œ μž‘λ™λ˜λŠ” Hook μž…λ‹ˆλ‹€. λ Œλ”λ§ ν›„ λ™κΈ°μ μœΌλ‘œ μ‹€ν–‰λ˜κΈ°μ— 주둜 DOM μ‘°μž‘κ³Ό κ΄€λ ¨λœ μž‘μ—…μ— μ‚¬μš©ν•©λ‹ˆλ‹€.


⚑ React Hook을 μ‚¬μš©ν•  λ•Œ μ£Όμ˜μ‚¬ν•­

  • ReactλŠ” Hook이 ν˜ΈμΆœλ˜λŠ” μˆœμ„œμ— μ˜μ‘΄ν•©λ‹ˆλ‹€. λ”°λΌμ„œ Hook은 항상 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ μ΅œμƒμœ„ κ³„μΈ΅μ—μ„œ ν˜ΈμΆœλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. ❗ 즉, Hook을 ν˜ΈμΆœν•  λ•ŒλŠ” λ°˜λ“œμ‹œ μ΅œμƒμœ„ κ³„μΈ΅μ—μ„œ ν˜ΈμΆœλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • Hook은 React의 ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈ μ™ΈλΆ€μ—μ„œ ν˜ΈμΆœν•  경우 λ™μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Hook은 ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. ❗즉, Hook은 λ°˜λ“œμ‹œ React ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œλ§Œ ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.

πŸ€” μ»€μŠ€ν…€ ν›…(Custom Hook)μ΄λž€?

μ»€μŠ€ν…€ ν›…(Custom Hook)은 κ°œλ°œμžκ°€ 직접 λ§Œλ“  Hook을 λœ»ν•©λ‹ˆλ‹€. ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μƒνƒœ 둜직(Stateful Logic)을 μž¬μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. λ˜ν•œ μ»€μŠ€ν…€ 훅을 μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈμ—μ„œ κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©λ˜λŠ” μƒνƒœ λ‘œμ§μ„ μΆ”μΆœν•˜μ—¬ ν•˜λ‚˜μ˜ ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ»€μŠ€ν…€ Hook은 ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ°œμƒν–ˆλ˜ 보일러 ν”Œλ ˆμ΄νŠΈ μ½”λ“œμ˜ λ¬Έμ œμ™€ μ½”λ“œ 가독성 μ €ν•˜ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ˜ˆμ‹œλ‘œ, μ»€μŠ€ν…€ Hook을 μ‚¬μš©ν•˜μ—¬ Input κ΄€λ¦¬λ‚˜ 데이터 κ°€μ Έμ˜€κΈ°(fetch) λ“± λ°˜λ³΅λ˜λŠ” λ‘œμ§μ„ κ°„λ‹¨νžˆ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ»€μŠ€ν…€ Hook은 ν•¨μˆ˜λ‘œ μΆ”μΆœν•˜μ—¬ μž¬μ‚¬μš©ν•  수 있게 ν•΄μ£Όλ©°, μƒνƒœ 관리와 생λͺ… μ£ΌκΈ° λ‘œμ§μ„ 효율적으둜 관리할 수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€.

πŸ’‘ μ»€μŠ€ν…€ ν›…μ˜ κ°„λ‹¨ν•œ μ˜ˆμ‹œ!

μ•„λž˜ μ½”λ“œλŠ” useLocalStorage λΌλŠ” μ»€μŠ€ν…€ 훅을 κ΅¬ν˜„ν•©λ‹ˆλ‹€.

useLocalStorageλŠ” 둜컬 μŠ€ν† λ¦¬μ§€λ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • μƒνƒœλ₯Ό μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•©λ‹ˆλ‹€.

import { useState } from 'react';

// useLocalStorageλŠ” 둜컬 μŠ€ν† λ¦¬μ§€μ— μƒνƒœλ₯Ό μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μ»€μŠ€ν…€ ν›…μž…λ‹ˆλ‹€.
function useLocalStorage(key, initialValue){
	// 둜컬 μŠ€ν† λ¦¬μ§€μ—μ„œ props둜 λ°›μ•„μ˜¨ key에 ν•΄λ‹Ήν•˜λŠ” 값을 κ°€μ Έμ˜΅λ‹ˆλ‹€.
	const storedValue = localStorage.getItem(key);
	// μ΄ˆκΈ°κ°’μ΄ μ—†λ‹€λ©΄ storedValueλ₯Ό, μžˆλ‹€λ©΄ initialValueλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€
	const inital = storedValue ? JSON.parse(storedValue) : initialValue;
	// useStateλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒνƒœ μ—…λ°μ΄νŠΈ funcλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
	const [value, setValue] = useState(initial);
	
	// μƒνƒœκ°€ μ—…λ°μ΄νŠΈλ  λ•Œλ§ˆλ‹€ 둜컬 μŠ€ν† λ¦¬μ§€μ— 값을 μ €μž₯ν•©λ‹ˆλ‹€.
	const updateValue = (newValue) => {
		setValue(newValue);
		localStorgae.setItem(key, JSON.stringify(newValue));
	};
	return [value, updateValue];
}

// μœ„μ™€ 같이 μƒμ„±ν•œ μ»€μŠ€ν…€ 훅을 μ•„λž˜μ™€ 같이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
// μ•„λž˜ μ»΄ν¬λ„ŒνŠΈλŠ” Countλ₯Ό 클릭 μ‹œ 1μ”© μ¦κ°€ν•˜λŠ” κΈ°λŠ₯을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
function DaeHyeonComponent(){
	// count μƒνƒœ ('count'λΌλŠ” ν‚€λ‘œ 둜컬 μŠ€ν† λ¦¬μ§€μ— μƒνƒœ μ €μž₯)
	const [count, setCount] = useLocalStorage('count', 0);
	
	return(
		<div>
			<p>Count : {count}</p>
			<button onClick={() => setCount(count + 1)}>Increment</button>
		</div>
	);
}

πŸ’‘ μ΅œμ’… 정리

μœ„ μ˜ˆμ‹œμ™€ 같이 λ‹€μ–‘ν•œ μ»€μŠ€ν…€ 훅을 λ§Œλ“€μ–΄ ν™œμš©ν•˜λ©΄ λ°˜λ³΅λ˜λŠ” λ‘œμ§μ„ μΆ”μƒν™”ν•˜μ—¬ μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 있으며 생산성을 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

profile
μ—΄μ‹¬νžˆ μ‚΄μ•„μ•Όμ§€

0개의 λŒ“κΈ€