πŸ’¬ Q&A λͺ¨μŒ #03

BOOaΒ·2025λ…„ 1μ›” 12일

Q&A

λͺ©λ‘ 보기
3/5
post-thumbnail

πŸ”— 2025λ…„ 01μ›” λ‘˜μ§Έ μ£Ό ( 01.06 ~ 01.12 ) - μ€‘μš” Q&A λͺ¨μŒ


Q. React Routerλ₯Ό μ‚¬μš©ν•  λ•Œ, νŽ˜μ΄μ§€ 이동은 μ–΄λ–€ λ°©μ‹μœΌλ‘œ ν•  수 μžˆμ„κΉŒ?

"Link, useNavigate, Navigate λ“±λ“± λ‹€μ–‘ν•˜κ²Œ μžˆλŠ”λ° 각각 μ–΄λ–€ μƒν™©μ—μ„œ μ‚¬μš©ν•˜λŠ” 게 μ’‹μ„κΉŒ?"

πŸ“ κ²°λ‘ 

"정적 이동은 Linkλ₯Ό, 동적 μ΄λ™μ΄λ‚˜ 이벀트 기반 이동은 useNavigateλ₯Ό, 쑰건뢀 λ Œλ”λ§μ„ ν™œμš©ν•œ 이동은 Navigateλ₯Ό μ‚¬μš©ν•˜λ©΄ μ ν•©ν•˜λ‹€."

  • React Routerμ—μ„œ μ‚¬μš©λ˜λŠ” μ»΄ν¬λ„ŒνŠΈλ‘œ, HTML의 <a> νƒœκ·Έμ™€ λΉ„μŠ·ν•œ 역할을 ν•œλ‹€.
  • 전체 νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œκ³ μΉ¨ν•˜μ§€ μ•Šκ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ 경둜λ₯Ό 이동할 수 μžˆλ‹€.
  • SPA 의 μž₯점을 ν™œμš©ν•˜μ—¬ λ¦¬μ†ŒμŠ€λ₯Ό μ ˆμ•½ν•˜λ©° λΆ€λ“œλŸ¬μš΄ νŽ˜μ΄μ§€ μ „ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€.
  • SEO λ₯Ό κ³ λ €ν•œ μ΅œμ ν™” μ²˜λ¦¬κ°€ λ˜μ–΄μžˆλ‹€.
<Link to="/about">Go to About</Link>
  • β­• μž₯점
    • κ°„λ‹¨νžˆ νŠΉμ • 경둜둜 이동 κ°€λŠ₯ν•˜λ‹€.
    • λΈŒλΌμš°μ € νžˆμŠ€ν† λ¦¬μ— 기둝이 λ‚¨λŠ”λ‹€.
  • ❌ 단점
    • λ™μ μœΌλ‘œ 이동해야 ν•˜λŠ” κ²½μš°μ—” μ‚¬μš©λ  수 μ—†κ³ , 정적 링크에 μ ν•©ν•˜λ‹€.

πŸ€” 정적 μ΄λ™μ΄λž€?

  • URL κ²½λ‘œκ°€ κ³ μ •μ μœΌλ‘œ κ²°μ •λ˜μ–΄ μžˆμ–΄ μ‚¬μš©μžκ°€ νŠΉμ • 링크λ₯Ό ν΄λ¦­ν•˜λ©΄ ν•΄λ‹Ή νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜λŠ” 상황을 λ§ν•œλ‹€.
  • 즉, μ‚¬μš©μžμ˜ 행동과 λ¬΄κ΄€ν•˜κ²Œ 항상 λ™μΌν•œ 경둜둀 μ΄λ™ν•˜λŠ” κ²½μš°μ΄λ‹€.
function Navbar() {
  return (
    <nav>
      <Link to="/">Home</Link>
      <Link to="/about">About</Link>
      <Link to="/contact">Contact</Link>
    </nav>
  );
}

βœ”γ…€useNavigate

  • React Routerμ—μ„œ μ œκ³΅λ˜λŠ” ν›…μœΌλ‘œ, 동적 λ˜λŠ” 이벀트 기반의 νŽ˜μ΄μ§€ 이동에 μ‚¬μš©λœλ‹€.
  • ν•¨μˆ˜ 호좜둜 νŽ˜μ΄μ§€λ₯Ό μ΄λ™μ‹œν‚€κΈ° λ•Œλ¬Έμ—, λ²„νŠΌ 클릭, 폼 제좜 λ“±κ³Ό 같이 λ™μž‘μ΄ ν•„μš”ν•œ 경우 μœ μš©ν•˜λ‹€.
  • λΈŒλΌμš°μ € νžˆμŠ€ν† λ¦¬λ₯Ό μ‘°μž‘ν•˜μ—¬ νŽ˜μ΄μ§€λ₯Ό μ΄λ™ν•œλ‹€.
  • λ’€λ‘œ κ°€κΈ°, μ•žμœΌλ‘œ 가기와 같은 κΈ°λŠ₯도 μ œκ³΅ν•œλ‹€.
const navigate = useNavigate();
navigate("/dashboard");
  • β­• μž₯점
    • 동적인 쑰건에 따라 이동 κ°€λŠ₯ν•˜λ‹€.
    • μ΄λ²€νŠΈμ™€ κ²°ν•©ν•˜μ—¬ μœ μ—°ν•œ νŽ˜μ΄μ§€ μ „ν™˜μ„ μ²˜λ¦¬ν•œλ‹€.
  • ❌ 단점
    • λ‹¨μˆœ μ΄λ™μ—λŠ” μ½”λ“œκ°€ λ‹€μ†Œ λ³΅μž‘ν•  수 μžˆλ‹€.

βœ”γ…€Navigate μ»΄ν¬λ„ŒνŠΈ

  • μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§μ„ 톡해 νŠΉμ • 경둜둜 μ΄λ™μ‹œν‚¬ λ•Œ μ‚¬μš©ν•œλ‹€.
  • 쑰건뢀 λ Œλ”λ§κ³Ό ν•¨κ»˜ ν™œμš©ν•˜λ©΄ νŠΉμ • 쑰건을 λ§Œμ‘±ν–ˆμ„ λ•Œ 경둜λ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.
function PrivateRoute({ isLoggedIn }) {
  if (!isLoggedIn) {
    return <Navigate to="/login" replace />;
  }
  return <h1>Welcome to the private page!</h1>;
}
  • β­• μž₯점
    • 쑰건뢀 λ Œλ”λ§κ³Ό κ²°ν•©ν•˜μ—¬ νŽ˜μ΄μ§€ 이동 μ œμ–΄κ°€ κ°€λŠ₯ν•˜λ‹€.
    • κ°„λ‹¨ν•œ λ¦¬λ‹€μ΄λ ‰μ…˜ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.
  • ❌ 단점
    • ν”„λ‘œκ·Έλž¨μ  μ œμ–΄κ°€ ν•„μš”ν•  λ•ŒλŠ” μ‚¬μš©μ΄ λΆˆνŽΈν•˜λ‹€.

πŸ€” ν”„λ‘œκ·Έλž¨μ  μ œμ–΄λž€?

  • μ½”λ“œλ‘œ νŠΉμ • λ™μž‘μ„ λ…Όλ¦¬μ μœΌλ‘œ κ²°μ •ν•˜κ±°λ‚˜ μ‹€ν–‰ν•˜λ„λ‘ μ œμ–΄ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.
  • React Routerμ—μ„œ ν”„λ‘œκ·Έλž¨μ  μ œμ–΄
    • μ‚¬μš©μžμ˜ ν–‰λ™μ΄λ‚˜ νŠΉμ • 쑰건에 따라 μ½”λ“œλ‘œ 이동을 μ œμ–΄ν•˜λŠ” 경우
    • 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈν•˜λ©΄ /dashboard 둜 μ΄λ™ν•˜κ±°λ‚˜, 인증이 μ‹€νŒ¨ν•˜λ©΄ /login 으둜 λ¦¬λ‹€μ΄λ ‰νŠΈ ν•˜λŠ” 상황
function Login({ isAuthenticated }) {
  const navigate = useNavigate();
  if (isAuthenticated) {
    // 둜그인 성곡 μ‹œ λŒ€μ‹œλ³΄λ“œλ‘œ 이동
    navigate("/dashboard");
  }
  return <button>Login</button>;
}

πŸ€” Link와 NavigateλŠ” μ»΄ν¬λ„ŒνŠΈ, useNavigateλŠ” Hook인데 μ™œ μ΄λ ‡κ²Œ λ‚˜λˆ μ‘Œμ„κΉŒ?

πŸ“Œ Link와 Navigate 의 곡톡점 (μ»΄ν¬λ„ŒνŠΈ)

  • React μ»΄ν¬λ„ŒνŠΈλŠ” JSX둜 μž‘μ„±λ˜μ–΄ DOM에 λ Œλ”λ§ λœλ‹€.
  • νŽ˜μ΄μ§€μ—μ„œ UI μš”μ†Œμ²˜λŸΌ λ Œλ”λ§λ˜λ©° μ‚¬μš©μžκ°€ 직접 μƒν˜Έμž‘μš©ν•  수 μžˆλ‹€.

πŸ“Œ useNavigate 의 νŠΉμ§• (Hook)

  • Hook은 μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ μƒνƒœλ‚˜ λ‘œμ§μ„ μ²˜λ¦¬ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.
  • νŽ˜μ΄μ§€ 이동과 같은 λ™μž‘μ„ λ Œλ”λ§κ³Ό λ…λ¦½μ μœΌλ‘œ μ½”λ“œμ—μ„œ μ œμ–΄ν•  λ•Œ μœ μš©ν•˜λ‹€.

πŸ“Œ μ–΄λ–»κ²Œ κ΅¬λΆ„λ˜μ—ˆμ„κΉŒ?

  • 정적 이동이 ν•„μš”ν•œ 경우, UI둜 λͺ…ν™•νžˆ λ“œλŸ¬λ‚˜λŠ” Linkλ‚˜ Navigateκ°€ μ ν•©ν•˜λ‹€.
  • 동적 μ΄λ™μ΄λ‚˜ μ΄λ²€νŠΈμ— 따라 이동 경둜λ₯Ό λ³€κ²½ν•  경우, useNavigate와 같은 ν•¨μˆ˜ 기반 μ œμ–΄κ°€ μ ν•©ν•˜λ‹€.

Q. μ»΄ν¬λ„ŒνŠΈμ™€ 훅은 μ–΄λ–»κ²Œ κ΅¬λΆ„ν• κΉŒ?

βœ”γ…€μ»΄ν¬λ„ŒνŠΈλž€?

  • 화면에 UIλ₯Ό λ Œλ”λ§ν•˜λŠ” λ‹¨μœ„ 이닀.
  • 주둜 JSX둜 μž‘μ„±λ˜λ©°, μ‚¬μš©μžμ™€ μƒν˜Έμž‘μš© ν•  수 μžˆλŠ” μš”μ†Œλ‘œ ν‘œν˜„λœλ‹€.

βœ”γ…€ν›…μ΄λž€?

  • React μ»΄ν¬λ„ŒνŠΈμ—μ„œ μƒνƒœ κ΄€λ¦¬λ‚˜ λ‘œμ§μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 도ꡬ 이닀.
  • UIλ₯Ό 직접 λ Œλ”λ§ν•˜μ§€ μ•Šκ³ , μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ λ™μž‘μ„ μ œμ–΄ν•˜κ±°λ‚˜ 데이터λ₯Ό μ œκ³΅ν•œλ‹€.

Q. reducer ν•¨μˆ˜λŠ” 순수 ν•¨μˆ˜μ—¬μ•Ό ν•œλ‹€λŠ” 말이 μ–΄λ–€ 의미일까?

βœ”γ…€μˆœμˆ˜ ν•¨μˆ˜μ˜ 쑰건

  • λ™μΌν•œ μž…λ ₯ β†’ λ™μΌν•œ 좜λ ₯ : λ™μΌν•œ state 와 action 을 μž…λ ₯으둜 λ°›μœΌλ©΄ 항상 λ™μΌν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.
  • λΆ€μˆ˜ νš¨κ³Όκ°€ μ—†μ–΄μ•Ό ν•œλ‹€ : ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ™ΈλΆ€ μƒνƒœ(ex. μ „μ—­ λ³€μˆ˜)λ₯Ό λ³€κ²½ν•˜κ±°λ‚˜, λ„€νŠΈμ›Œν¬ μš”μ²­ 같은 μ™ΈλΆ€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©΄ μ•ˆ λœλ‹€.
  • 기쑴의 μƒνƒœλ₯Ό 직접 λ³€κ²½ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€ : reducerλŠ” 항상 μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ°˜ν™˜ν•˜λ©°, κΈ°μ‘΄ μƒνƒœ 객체λ₯Ό 직접 μˆ˜μ •ν•˜λ©΄ μ•ˆ λœλ‹€.

βœ”γ…€μˆœμˆ˜ ν•¨μˆ˜ μ˜ˆμ‹œ

const reducer = (state, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return { ...state, count: state.count + 1 }; // μƒˆλ‘œμš΄ μƒνƒœ λ°˜ν™˜
    case 'DECREMENT':
      return { ...state, count: state.count - 1 }; // μƒˆλ‘œμš΄ μƒνƒœ λ°˜ν™˜
    default:
      return state; // μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ λ°˜ν™˜
  }
};

βœ”γ…€λΉ„μˆœμˆ˜ ν•¨μˆ˜ μ˜ˆμ‹œ

const reducer = (state, action) => {
  switch (action.type) {
    case 'INCREMENT':
      state.count += 1; // κΈ°μ‘΄ μƒνƒœλ₯Ό 직접 μˆ˜μ • (λΉ„μˆœμˆ˜)
      return state;     // κΈ°μ‘΄ μƒνƒœ λ°˜ν™˜ (μƒˆλ‘œμš΄ 객체 λ°˜ν™˜ X)
    case 'DECREMENT':
      console.log("Decrementing..."); // μ™ΈλΆ€ λΆ€μˆ˜νš¨κ³Ό λ°œμƒ (λΉ„μˆœμˆ˜)
      return { ...state, count: state.count - 1 };
    default:
      return state;
  }
};

πŸ€” μ™œ 이런 순수 ν•¨μˆ˜κ°€ μ€‘μš”ν•œ 걸까?

  • 예츑 κ°€λŠ₯μ„± : λ™μΌν•œ μž…λ ₯에 λŒ€ν•΄ 항상 λ™μΌν•œ 좜λ ₯을 보μž₯ν•˜κΈ° λ•Œλ¬Έμ— 디버깅과 ν…ŒμŠ€νŠΈκ°€ μ‰¬μ›Œμ§„λ‹€.
  • μƒνƒœ λ³€κ²½ 좔적 κ°€λŠ₯ : κΈ°μ‘΄ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 객체λ₯Ό λ°˜ν™˜ν•˜λ©΄, μƒνƒœ λ³€κ²½ 이λ ₯을 μΆ”μ ν•˜κ±°λ‚˜, λΆˆλ³€μ„±μ„ μœ μ§€ν•  수 μžˆλ‹€.
  • React μ΅œμ ν™” 지원 : ReactλŠ” μƒνƒœ 객체가 변경될 λ•Œ 이λ₯Ό κ°μ§€ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μ‹œ λ Œλ”λ§ν•œλ‹€. κΈ°μ‘΄ μƒνƒœλ₯Ό 직접 μˆ˜μ •ν•˜λ©΄ 변경을 감지할 수 μ—†μœΌλ―€λ‘œ, μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.

Q. Reactμ—μ„œ μƒνƒœκ°€ λ³€κ²½λ˜μ—ˆλŠ”μ§€λŠ” μ–΄λ–»κ²Œ νŒλ‹¨ν• κΉŒ?

"Reactμ—μ„œλŠ” μƒνƒœκ°€ λ³€ν™”λ˜λ©΄ λ¦¬λ Œλ”λ§μ΄ λ°œμƒν•˜λŠ” 데, μ–΄λ–»κ²Œ νŒλ‹¨ν• κΉŒ?"

βœ”γ…€μƒνƒœ 변경을 κ°μ§€ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜

  • ReactλŠ” μƒνƒœκ°€ λ³€κ²½λ˜μ—ˆλŠ”μ§€ νŒλ‹¨ν•˜κΈ° μœ„ν•΄ 객체의 μ°Έμ‘°λ₯Ό 비ꡐ(얕은 비ꡐ)ν•œλ‹€.
  • μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ°˜ν™˜ν•˜λ©΄ μ°Έμ‘°κ°€ λ‹¬λΌμ§€λ―€λ‘œ ReactλŠ” μƒνƒœ 변경을 κ°μ§€ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μ‹œ λ Œλ”λ§ν•œλ‹€.
  • λ§Œμ•½ κΈ°μ‘΄ 객체λ₯Ό 직접 μˆ˜μ •ν•˜λ©΄ μ°Έμ‘°κ°€ κ°™κΈ° λ•Œλ¬Έμ— ReactλŠ” μƒνƒœκ°€ λ³€κ²½λ˜μ§€ μ•Šμ•˜λ‹€κ³  νŒλ‹¨ν•œλ‹€.

πŸ”— React의 λ¦¬λ Œλ”λ§ 쑰건

  • μƒνƒœκ°€ λ³€κ²½λ˜μ—ˆμ„ λ•Œ (객체의 참쑰값이 변경됨)
  • λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ 전달받은 propsκ°€ λ³€κ²½λ˜μ—ˆμ„ λ•Œ
  • κ°•μ œλ‘œ λ Œλ”λ§μ„ νŠΈλ¦¬κ±°ν•˜λŠ” ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ ( ex. forceUpdate()

πŸ€” 얕은 λΉ„κ΅λž€?

  • 객체 λ‚΄λΆ€μ˜ κ°’κΉŒμ§€ λΉ„κ΅ν•˜μ§€ μ•Šκ³  μ°Έμ‘°κ°’λ§Œ λΉ„κ΅ν•˜λŠ” 것을 λ§ν•œλ‹€.

Q. indexOf와 findIndex의 μ°¨μ΄λŠ” 뭘까?

"두 λ©”μ„œλ“œ λ‹€ λ°°μ—΄ μš”μ†Œμ˜ 인덱슀λ₯Ό μ°ΎλŠ” 데 μ‚¬μš©λ˜λŠ” 데 μ–΄λ–€ 차이점이 μžˆμ„κΉŒ?"

βœ”γ…€indexOf

  • νŠΉμ • κ°’μ˜ 첫 번쨰 인덱슀λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • 값이 μ—†μœΌλ©΄ -1 을 λ°˜ν™˜ν•œλ‹€.
  • 직접적인 κ°’ 비ꡐλ₯Ό 톡해 μš”μ†Œλ₯Ό μ°ΎλŠ”λ‹€
  • μ—„κ²©ν•œ 동등 비ꡐ( === ) λ₯Ό μ‚¬μš©ν•œλ‹€.
  • λ°°μ—΄ μš”μ†Œκ°€ μ›μ‹œκ°’ 일 λ•Œ 주둜 μ‚¬μš©λœλ‹€.
array.indexOf(searchElement, fromIndex)
  • searchElement : 찾고자 ν•˜λŠ” κ°’
  • fromIndex (선택) : 검색을 μ‹œμž‘ν•  인덱슀(κΈ°λ³Έκ°’: 0)

βœ”γ…€findIndex

  • μ£Όμ–΄μ§„ ν…ŒμŠ€νŠΈ ν•¨μˆ˜λ₯Ό λ§Œμ‘±ν•˜λŠ” 첫 번째 μš”μ†Œμ˜ 인덱슀λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • λ§Œμ‘±ν•˜λŠ” μš”μ†Œκ°€ μ—†μœΌλ©΄ -1 을 λ°˜ν™˜ν•œλ‹€.
  • 쑰건 기반 검색이 κ°€λŠ₯ν•˜λ‹€.
  • 콜백 ν•¨μˆ˜λ‘œ 쑰건을 μ •μ˜ν•˜μ—¬ λ³΅μž‘ν•œ λ‘œμ§μ— μ ν•©ν•˜λ‹€.
  • κ°μ²΄λ‚˜ λ°°μ—΄ λ‚΄μ˜ 객체λ₯Ό μ²˜λ¦¬ν•  λ•Œ μœ μš©ν•˜λ‹€.
array.findIndex(callback(element, index, array), thisArg)
  • callback : μš”μ†Œλ₯Ό ν…ŒμŠ€νŠΈν•˜λŠ” ν•¨μˆ˜. trueλ₯Ό λ°˜ν™˜ ν•˜λ©΄ ν•΄λ‹Ή μš”μ†Œμ˜ 인덱슀λ₯Ό λ°˜ν™˜
  • element : λ°°μ—΄μ˜ 각 μš”μ†Œ
  • index : ν˜„μž¬ μš”μ†Œμ˜ 인덱슀
  • array : λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄
  • thisArg (선택) : 콜백 ν•¨μˆ˜μ—μ„œ this둜 μ‚¬μš©ν•  κ°’

0개의 λŒ“κΈ€