Tiny Bunny
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โš™๏ธFrontend/REACT

[React] React Hook๊ณผ Custom Hook

by soonybutter 2025. 5. 14.
728x90

 
๋ชฉ์ฐจ
1. React Hook
2. custom Hook
 


 

1. React Hook

๐Ÿ’กHook์ด๋ž€?
 
Hook์€ React์˜ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๊ด€๋ฆฌ์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜.
๊ธฐ์กด์—๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ๊ฐ€๋Šฅํ–ˆ๋˜ ๊ธฐ๋Šฅ๋“ค์„ ํ•จ์ˆ˜ํ˜•์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ค€ ๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด๋‹ค.
 
Hook์€ React 16.8์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์ด๋ฉฐ,
Hook์€ class๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ state์™€ ๋‹ค๋ฅธ React์˜ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค๊ณ  ํ•œ๋‹ค. 
 
 
 
โš™๏ธ ๋Œ€ํ‘œ์ ์ธ Hook ์ข…๋ฅ˜

  • useState: ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ’(state)์„ ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝ
  • useEffect: ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ (๋งˆ์šดํŠธ, ์—…๋ฐ์ดํŠธ, ์–ธ๋งˆ์šดํŠธ ๋“ฑ)
  • useRef, useContext, useReducer, useMemo, useCallback ๋“ฑ ๋‹ค์–‘ํ•œ ๋‚ด์žฅ ํ›… ์ œ๊ณต

 
 

โš™๏ธ Hook tip

  1. Hook์€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋‚˜ ์ปค์Šคํ…€ ํ›… ๋‚ด๋ถ€์—์„œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
    โ†’ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋‚˜ if ๋ฌธ ์•ˆ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  2. ์กฐ๊ฑด๋ถ€๋กœ Hook์„ ํ˜ธ์ถœํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.
    โ†’ ๋ชจ๋“  ๋ Œ๋”๋ง์—์„œ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
  3. ๋‚˜๋งŒ์˜ Hook(Custom Hook)์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
    โ†’ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋กœ์ง์„ ํ›… ํ˜•ํƒœ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    โ†’ ํ•จ์ˆ˜ ์ด๋ฆ„์€ use๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•จ (์˜ˆ: useInput)

 
 
 


2. Custom Hook

 
โœ๏ธCustom Hook
๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ž…๋ ฅ์ƒํƒœ ๋กœ์ง์ด ์žˆ๋‹ค๋ฉด, ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
 
 
๐Ÿ’ก
1. ์ปค์Šคํ…€ ํ›… ๋งŒ๋“œ๋Š” ๋ฒ• โ†’   ํ•จ์ˆ˜ ์•ž์— use๋ฅผ ๋ถ™์ธ๋‹ค. 
ex) useInput()
 
2. ์–ด๋””๋กœ ๋ถ„๋ฆฌ?
:  components ๊ฐ€ ์•„๋‹Œ, 'hooks'ํด๋” ์ƒ์„ฑ ํ›„ ํ•จ์ˆ˜ ์ด๋ฆ„์˜ .jsxํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ๋ถ„๋ฆฌ์‹œํ‚ด.
 

// useInput.js (hooks ํด๋”์— ์ €์žฅ)
import { useState } from "react";

function useInput() {
  const [input, setInput] = useState("");

  const onChange = (e) => {
    setInput(e.target.value);
  };

  return [input, onChange];
}

export default useInput;

โ†’ ์ž…๋ ฅ ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ useState ์ƒํƒœ๋ฅผ ๋‚ด๋ถ€์— ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ,
input๊ฐ’๊ณผ ์ด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” onChangeํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.
๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์œ„์˜ useInput.jsx๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด input์ƒํƒœ์™€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
 
 

// HookExam.jsx (์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ)
import useInput from "../hooks/useInput";

const HookExam = () => {
  const [input, onChange] = useInput();

  return (
    <div>
      <input value={input} onChange={onChange} />
      <p>์ž…๋ ฅํ•œ ๊ฐ’: {input}</p>
    </div>
  );
};

export default HookExam;

โ†’ useInput()์„ ํ†ตํ•ด input๊ณผ onChange๋ฅผ ๋ฐ›์•„์˜ด.
โ†’  <input/> ์ปดํฌ๋„ŒํŠธ์— ๊ฐ’์„ ์—ฐ๊ฒฐํ•˜์—ฌ ์ž…๋ ฅ ์ด๋ฒคํŠธ์— ๋”ฐ๋ผ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ด.
โ†’  useInput.jsx์—์„œ useState๋ฅผ import ํ•จ์œผ๋กœ,  useInput.jsx๋ฅผ import ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” HookExam.jsx๋Š” ์ด๋ฅผ import ํ•  ํ•„์š” ์—†๋‹ค.
 
 
 
 
 
 
 
โš™๏ธ์ปค์Šคํ…€ ํ›…์˜ ์žฅ์ 

  • ๋กœ์ง ์žฌ์‚ฌ์šฉ: ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ: UI์™€ ๋กœ์ง์ด ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋จ
  • ํ…Œ์ŠคํŠธ ํŽธ๋ฆฌ: ํ›…๋งŒ ๋”ฐ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ฑฐ๋‚˜ ๋””๋ฒ„๊น… ๊ฐ€๋Šฅ

 
 


 

 
๐Ÿ’ก ์ •๋ฆฌ

Hook ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๋‚˜ ๊ธฐ๋Šฅ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•จ
useState ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ Hook, ์ƒํƒœ๊ฐ’์„ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌ
Custom Hook ํ›…์„ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ธ ํ•จ์ˆ˜, use๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•จ
์ฃผ์˜์‚ฌํ•ญ ๋ฐ˜๋“œ์‹œ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ/์ปค์Šคํ…€ ํ›… ๋‚ด๋ถ€์—์„œ, ์กฐ๊ฑด๋ฌธ ์—†์ด ์‚ฌ์šฉํ•ด์•ผ ํ•จ

 
 
 
 
 
 
 
 
 
 
 
 
 
*Ref
https://ko.legacy.reactjs.org/docs/hooks-overview.html

Hook ๊ฐœ์š” โ€“ React

A JavaScript library for building user interfaces

ko.legacy.reactjs.org

 
 
 
์„ค๋ช…์ด ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด๋‚˜ ํ”ผ๋“œ๋ฐฑ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”!
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค โ˜บ๏ธ

728x90

TOP

Designed by ํ‹ฐ์Šคํ† ๋ฆฌ