<Hello Hosung😎/>

[React, RN] λ¦¬μ•‘νŠΈ ν›…(React Hooks) μ†Œκ°œπŸ‘ λ³Έλ¬Έ

πŸ“± JavaScript/γ…€React, RN

[React, RN] λ¦¬μ•‘νŠΈ ν›…(React Hooks) μ†Œκ°œπŸ‘

쒌좩우돌 λ°±μ—”λ“œ 개발자 일기🧐 2024. 11. 22. 23:36


λ¦¬μ•‘νŠΈλŠ” 2013년에 처음 λ“±μž₯ν•œ μ΄ν›„λ‘œ μ§€μ†μ μœΌλ‘œ μ§„ν™”ν•΄μ™”κ³ , κ·Έ 쀑 ν•˜λ‚˜κ°€ λ°”λ‘œ λ¦¬μ•‘νŠΈ ν›…(React Hooks) μž…λ‹ˆλ‹€. 훅은 2018년에 λ¦¬μ•‘νŠΈ 16.8 λ²„μ „μ—μ„œ λ„μž…λ˜μ—ˆμœΌλ©°, ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μƒνƒœμ™€ 라이프사이클 κΈ°λŠ₯을 μ‚¬μš©ν•  수 있게 ν•΄μ£ΌλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. κ·Έ μ΄μ „κΉŒμ§€λŠ” ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλ§Œ μƒνƒœ κ΄€λ¦¬λ‚˜ 라이프사이클 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμ—ˆλŠ”λ°, 훅을 톡해 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλ„ 이λ₯Ό μ²˜λ¦¬ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

ν›…μ΄λž€ 무엇인가?


λ¦¬μ•‘νŠΈ 훅은 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μƒνƒœ 관리, λΆ€μˆ˜ 효과(side effect) 관리, μ»¨ν…μŠ€νŠΈ μ‚¬μš© λ“± μ—¬λŸ¬ κΈ°λŠ₯을 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 훅을 μ‚¬μš©ν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈκ°€ 더 κ°„κ²°ν•˜κ³  읽기 μ‰½κ²Œ μž‘μ„±λ˜λ©°, μž¬μ‚¬μš©μ„±λ„ μ¦κ°€ν•©λ‹ˆλ‹€.

ν›…μ˜ μ£Όμš” νŠΉμ§•

ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
λ¦¬μ•‘νŠΈμ˜ μƒνƒœ 관리와 λΆ€μˆ˜ 효과 처리 등을 κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.
μ»΄ν¬λ„ŒνŠΈμ˜ 생λͺ… μ£ΌκΈ° λ©”μ„œλ“œλ₯Ό 더 κ°„λ‹¨ν•˜κ³  μ§κ΄€μ μœΌλ‘œ λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.
μ£Όμš” λ¦¬μ•‘νŠΈ ν›…
λ¦¬μ•‘νŠΈ ν›…μ—λŠ” λ‹€μ–‘ν•œ μ’…λ₯˜κ°€ μžˆμ§€λ§Œ, κ·Έ μ€‘μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” κΈ°λ³Έ 훅듀은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1. useState

useState 훅은 μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” this.state와 this.setStateλ₯Ό μ‚¬μš©ν–ˆμ§€λ§Œ, ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” useState 훅을 μ‚¬μš©ν•˜μ—¬ μƒνƒœλ₯Ό μ„ μ–Έν•˜κ³  μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increase</button>
    </div>
  );
}



2. useEffect

useEffect 훅은 μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§λœ ν›„ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•  수 있게 ν•΄μ£ΌλŠ” ν›…μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 데이터λ₯Ό fetchingν•˜κ±°λ‚˜, DOM μ—…λ°μ΄νŠΈ 후에 side-effect μž‘μ—…μ„ μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œμ˜ componentDidMount, componentDidUpdate, componentWillUnmount 같은 생λͺ…μ£ΌκΈ° λ©”μ„œλ“œμ˜ 역할을 ν•©λ‹ˆλ‹€.

import React, { useState, useEffect } from 'react';

function Timer() {
  const [seconds, setSeconds] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => setSeconds(prev => prev + 1), 1000);
    return () => clearInterval(interval); // μ»΄ν¬λ„ŒνŠΈκ°€ μ–Έλ§ˆμš΄νŠΈλ  λ•Œ μΈν„°λ²Œμ„ ν΄λ¦¬μ–΄ν•©λ‹ˆλ‹€.
  }, []); // 빈 배열을 λ„£μœΌλ©΄ μ»΄ν¬λ„ŒνŠΈκ°€ 마운트될 λ•Œλ§Œ μ‹€ν–‰λ©λ‹ˆλ‹€.

  return <p>Time: {seconds}s</p>;
}



3. useContext

useContext 훅은 λ¦¬μ•‘νŠΈμ˜ μ»¨ν…μŠ€νŠΈ(Context)λ₯Ό μ‚¬μš©ν•  λ•Œ μ“°μž…λ‹ˆλ‹€. μ»¨ν…μŠ€νŠΈλŠ” 트리 κ΅¬μ‘°μ—μ„œ 데이터λ₯Ό μ „μ—­μ μœΌλ‘œ 전달할 λ•Œ μ‚¬μš©ν•˜λ©°, useContext 훅을 톡해 λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ‚΄λ €μ€€ 데이터λ₯Ό μžμ‹ μ»΄ν¬λ„ŒνŠΈμ—μ„œ κ°„νŽΈν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

import React, { useContext } from 'react';

const ThemeContext = React.createContext('light');

function ThemedComponent() {
  const theme = useContext(ThemeContext);
  return <div>The current theme is {theme}</div>;
}

function App() {
  return (
    <ThemeContext.Provider value="dark">
      <ThemedComponent />
    </ThemeContext.Provider>
  );
}



4. useRef

useRef 훅은 μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§λ˜μ–΄λ„ 값이 μœ μ§€λ˜λŠ” μ°Έμ‘°(ref)λ₯Ό λ§Œλ“­λ‹ˆλ‹€. 주둜 DOM μš”μ†Œμ— μ ‘κ·Όν•˜κ±°λ‚˜, λ Œλ”λ§ 간에 μœ μ§€λ˜μ–΄μ•Ό ν•  값을 μ €μž₯ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

import React, { useRef } from 'react';

function FocusInput() {
  const inputRef = useRef(null);

  const focusInput = () => {
    inputRef.current.focus();
  };

  return (
    <div>
      <input ref={inputRef} />
      <button onClick={focusInput}>Focus Input</button>
    </div>
  );
}



5. useMemo & useCallback

useMemoλŠ” 계산 λΉ„μš©μ΄ 많이 λ“œλŠ” 연산을 μ΅œμ ν™”ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. μ˜μ‘΄μ„± λ°°μ—΄μ˜ 값이 λ³€κ²½λ˜μ§€ μ•ŠμœΌλ©΄ 이전에 κ³„μ‚°λœ 값을 μž¬μ‚¬μš©ν•©λ‹ˆλ‹€.
useCallback은 ν•¨μˆ˜λ₯Ό λ©”λͺ¨μ΄μ œμ΄μ…˜ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. ν•¨μˆ˜κ°€ λΆˆν•„μš”ν•˜κ²Œ λ‹€μ‹œ μƒμ„±λ˜λŠ” 것을 λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

import React, { useState, useMemo } from 'react';

function ExpensiveComputation({ number }) {
  const expensiveResult = useMemo(() => {
    return number * 2; // 계산 λΉ„μš©μ΄ 높은 μ—°μ‚°
  }, [number]);

  return <div>{expensiveResult}</div>;
}



ν›… μ‚¬μš© μ‹œ μ£Όμ˜μ‚¬ν•­
훅은 항상 μ΅œμƒμœ„μ—μ„œλ§Œ ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€. μ‘°κ±΄λ¬Έμ΄λ‚˜ 반볡문 λ‚΄μ—μ„œ 호좜되면 μ•ˆ λ©λ‹ˆλ‹€.
훅은 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œλ§Œ μ‚¬μš©ν•΄μ•Ό ν•˜λ©°, ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
ν›…μ˜ μ˜μ‘΄μ„± λ°°μ—΄(특히 useEffect, useCallback, useMemoμ—μ„œ)을 μ •ν™•ν•˜κ²Œ μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ˜μ‘΄μ„± 배열을 잘λͺ» μ„€μ •ν•˜λ©΄ λ Œλ”λ§ μ΅œμ ν™”κ°€ 잘λͺ»λ  수 μžˆμŠ΅λ‹ˆλ‹€.

λ¦¬μ•‘νŠΈ ν›…μ˜ μž₯점
가독성: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄, ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈλ³΄λ‹€ μ½”λ“œκ°€ κ°„κ²°ν•˜κ³  μ΄ν•΄ν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
μž¬μ‚¬μš©μ„±: 훅을 μ»€μŠ€ν„°λ§ˆμ΄μ¦ˆν•˜μ—¬ μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ™μΌν•œ λ‘œμ§μ„ μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ„±λŠ₯ μ΅œμ ν™”: useMemo, useCallback 등을 ν™œμš©ν•˜λ©΄ μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


마무리

λ¦¬μ•‘νŠΈ 훅은 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μƒνƒœ, λΆ€μˆ˜ 효과, μ°Έμ‘° 등을 λ‹€λ£¨λŠ” 데 큰 μž₯점을 μ œκ³΅ν•˜λ©°, μ½”λ“œμ˜ 간결함과 가독성을 λ†’μ—¬μ€λ‹ˆλ‹€. λ¦¬μ•‘νŠΈμ˜ ν›… μ‹œμŠ€ν…œμ€ λ”μš± 직관적인 개발 κ²½ν—˜μ„ μ œκ³΅ν•˜κ³ , λ¦¬μ•‘νŠΈμ˜ μ§„ν™”λ₯Ό μ΄λ„λŠ” μ€‘μš”ν•œ μš”μ†Œμž…λ‹ˆλ‹€. λ¦¬μ•‘νŠΈμ—μ„œ 훅을 잘 ν™œμš©ν•˜λŠ” 방법을 읡히면, 더 효율적이고 μœ μ§€λ³΄μˆ˜ν•˜κΈ° 쒋은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€.