3. React Hook

keyword

  • React Hook ์ด๋ž€

  • Hooks

    • useState

    • useEffect

    • useContext

    • useRef

    • useLayoutEffect

  • React StrictMode ๋ž€

1. React Hook?

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

๊ธฐ์กด ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ 

  • Wrapper Hell (HoC) -> ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ์˜ ์ค‘์ฒฉ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ

  • Huge Components -> ํฌ๊ธฐ๊ฐ€ ํฐ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ์ปดํฌ๋„ŒํŠธ

  • Confusing Classes -> ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ, ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ, ์ƒํƒœ ๊ด€๋ฆฌ ๋“ฑ์ด ์„ž์—ฌ ํ˜ผ๋ž€ ์•ผ๊ธฐ (ex. this ๋ฐ”์ธ๋”ฉ)

React Hooks์˜ ๋„์ž…

  • Functional Component๋งŒ ์‚ฌ์šฉ -> ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค.

  • ์ƒํƒœ ๊ด€๋ฆฌ ์œ ๋ฌด๋ฅผ ๋ฐ”๋กœ ์•Œ๊ธฐ ์–ด๋ ค์›€ -> React๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

  • ๋ณต์žกํ•œ ์š”์†Œ๋Š” ์ „๋ถ€ Hook์œผ๋กœ ๊ฒฉ๋ฆฌ ๋ฐ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ. -> custom hook์œผ๋กœ ๋กœ์ง ์žฌ์‚ฌ์šฉ


2. Hooks

2.1 useState

useState -> state๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Hook, useState() ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ƒํƒœ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•˜๋ฉฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋Š” ์ƒํƒœ๊ฐ’, ๋‘๋ฒˆ์งธ ์š”์†Œ๋Š” ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜

2.2 useEffect

useEffect -> Side-effect๋ฅผ ๋‹ค๋ฃฌ๋‹ค. Side-effect๋Š” React ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง๊ณผ ์ง์ ‘์ ์ธ ์—ฐ๊ด€์ด ์—†๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ ๋™๊ธฐํ™” ๊ฐ™์€ ์ž‘์—…๋“ค์„ ์˜๋ฏธํ•œ๋‹ค. ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ์™€ ์œ ์‚ฌํ•œ ์—ญํ• ์˜ Hook, useEffect() ํ•จ์ˆ˜์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” ํ•จ์ˆ˜๋ฉฐ, ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฐฐ์—ด๋กœ ์˜์กด์„ฑ ๋ฐฐ์—ด์ด๋ผ ๋ถ€๋ฅธ๋‹ค. ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ๊ฐ’๋“ค์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ฒซ๋ฒˆ์งธ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ์ฒซ๋ฒˆ์งธ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ์ด๋ฅผ cleanup์ด๋ผ ๋ถ€๋ฅด๋ฉฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ์ด ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

useEffect(() => {
  // ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ

  // cleanup ํ•จ์ˆ˜
  return () => {
    // cleanup ์ฝ”๋“œ
  };
}, []);

๋งŒ์•ฝ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ƒ๋žตํ•˜๋ฉด ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค Side-effect ํ•จ์ˆ˜์™€ cleanup ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ๊ณ„์† ํ˜ธ์ถ›๋ผ ๋ฌดํ•œ๋ฃจํ”„๋กœ ์ธํ•œ overflow๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

2.3 useContext

Context API์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” Hook์œผ๋กœ ์ปดํฌ๋„ŒํŠธ์— ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ณผ์ •, ์ฆ‰ Props driling์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

import React, { useContext } from 'react';

const UserContext = React.createContext();

function App() {
  return (
    <UserContext.Provider value="John">
      <UserProfile />
    </UserContext.Provider>
  );
}

function UserProfile() {
  const user = useContext(UserContext);

  return <p>Welcome, {user}!</p>;
}

Context ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Provider์— ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธํ•˜๋ฉด ๊ฐ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ useContext hook์„ ์‚ฌ์šฉํ•ด Context ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2.4 useRef

ref -> reference(์ฐธ์กฐ) ์ฐธ์กฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” Hook ๊ฐ’(current)์ด ๋ฐ”๋€Œ์–ด๋„ ๋ฆฌ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง๊ณผ ๊ด€๋ จ์—†์ด ๊ฐ’์„ ์œ ์ง€ํ•œ๋‹ค. useRef() ํ•จ์ˆ˜๋Š” DOM์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ๋ฒ•์œผ๋กœ input์— focus๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

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

  const focusInput = () => {
    // input ์š”์†Œ์— ํฌ์ปค์Šค๋ฅผ ์ค€๋‹ค.
    inputRef.current.focus(); 
  };

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

2.5 useLayoutEffect

useLayoutEffect๋Š” ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์ „, ๋ ˆ์ด์•„์›ƒ๊ณผ ํŽ˜์ธํŠธ ๊ณผ์ •์ด ์ผ์–ด๋‚˜๊ธฐ ์ง์ „์— ์‹คํ–‰๋œ๋‹ค. ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์ „์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ ์ด๋‹ค. ์‹ค๋ฌด์—์„œ ๊ฑฐ์˜? ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋˜ hook


3. React StrictMode?

React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ž˜ํผ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ํ™œ์„ฑํ™”๋˜๋ฉฐ, ํ”„๋กœ๋•์…˜์—์„œ๋Š” ๋ฌด์‹œ๋œ๋‹ค. ๋งŒ์•ฝ, Effect ๋‚ด๋ถ€์—์„œ console.log() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ์‹œ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์ฐฝ์— ๋กœ๊ทธ๊ฐ€ ๋‘ ๋ฒˆ ์ฐํžŒ๋‹ค๋ฉด StrictMode๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ํ™•๋ฅ ์ด ๋†’๋‹ค.

  • ์ค‘๋ณต๋œ Props ๊ฐ์ง€, ๋ ˆ๊ฑฐ์‹œ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ, ๋ถ€์ž‘์šฉ์„ ์œ ๋ฐœํ•˜๋Š” ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ๊ฒฝ๊ณ 


์ถ”๊ฐ€ ํ‚ค์›Œ๋“œ

  • HoC

HOC

Higher Order Component = ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ํŠน์ • ๋กœ์ง์„ ์žฌํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด์œผ๋กœ, ์ธ์ž๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ›๊ณ  ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์œ ์ € ๊ถŒํ•œ์— ๋”ฐ๋ฅธ ํŽ˜์ด์ง€ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ๋กœ HOC ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์ด ์žˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ

import { useEffect } from 'react';

const withLogger = WrappedComponent => props => {
  useEffect(() => {
  console.log(WrappedComponent.name);
  }, []);

  return <WrappedComponent {...props} />;
}

Last updated