React Routing

Understanding The Fundamentals of Routing in React λ‚΄μš©μ„ λ²ˆμ—­ν•˜κ³ , 좔가적인 μ„€λͺ…을 λ§λΆ™μ˜€μŠ΅λ‹ˆλ‹€.

λΌμš°νŒ…(Routing) 은 λ¦¬μ•‘νŠΈ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ•ˆμ—μ„œ μ‚¬μš©μžκ°€ URL을 μž…λ ₯ν•˜κ±°λ‚˜ μ–΄λ–€ μš”μ†Œ(링크, λ²„νŠΌ, μ•„μ΄μ½˜, 이미지 λ“±)을 ν΄λ¦­ν–ˆμ„ λ•Œ 자유둭게 이동할 수 μžˆλ„λ‘ ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.

뷰의 μ „ν™˜μ΄ μ—†λŠ” κ°„λ‹¨ν•œ ν”„λ‘œμ νŠΈλ₯Ό λ„˜μ–΄ ν•˜λ‚˜μ˜ λ·°μ—μ„œ λ‹€λ₯Έ 뷰둜 μ „ν™˜μ΄ ν•„μš”ν•˜λ‹€λ©΄ λ¦¬μ•‘νŠΈμ˜ λΌμš°νŒ…μ— λŒ€ν•΄ μ•Œκ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

이 μ±•ν„°μ—μ„œ μš°λ¦¬λŠ” λ¦¬μ•‘νŠΈ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΌμš°νŒ…μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. λΌμš°νŒ…μ΄ κ°€λŠ₯ν•˜λ„λ‘ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν™•μž₯ν•˜λ €λ©΄ React-Router 라이브러리λ₯Ό ν™œμš©ν•©λ‹ˆλ‹€.

React-Router λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 3κ°€μ§€λ‘œ λ‚˜λ‰©λ‹ˆλ‹€.

  • react-router: μ½”μ–΄ 라이브러리 μž…λ‹ˆλ‹€. react-router-domκ³Ό react-router-nativeλ₯Ό ν•©μΉœ νŒ¨ν‚€μ§€ μž…λ‹ˆλ‹€.

  • react-router-dom: μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ— μ‚¬μš©λ©λ‹ˆλ‹€.

  • react-router-native: λͺ¨λ°”일 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ— μ‚¬μš©λ©λ‹ˆλ‹€.

상황에 λ”°λΌμ„œλŠ” react-router 라이브러리λ₯Ό μ„€μΉ˜ν•  ν•„μš”μ—†μ΄ react-router-domμ΄λ‚˜ react-router-native μ€‘μ—μ„œ μ„ νƒν•©λ‹ˆλ‹€. react-router-domκ³Ό react-router-native λͺ¨λ‘ react-router 라이브러리의 κΈ°λŠ₯듀을 λΆˆλŸ¬λ“€μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ œμž‘ν•˜λŠ” 이 ν”„λ‘œμ νŠΈμ—μ„œλŠ” react-router-dom을 μ‚¬μš©ν•©λ‹ˆλ‹€.

npm install --save react-router-dom

Routers(λΌμš°ν„°)

react-router packageμ—λŠ” λŒ€μƒ ν”Œλž«νΌμ— 따라 ν™œμš©ν•  수 μžˆλŠ” μ—¬λŸ¬ λΌμš°ν„°κ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” BrowserRouter, HashRouter, MemoryRouter λ“± μ—¬λŸ¬ λΌμš°ν„°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μš°λ¦¬κ°€ λ§Œλ“€κ³  μžˆλŠ” λΈŒλΌμš°μ € 기반의 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ BrowserRouter 와 HashRouter κ°€ μ ν•©ν•©λ‹ˆλ‹€.

BrowserRouter λŠ” μ—¬λŸ¬ νƒ€μž…μ˜ URL을 λ‹€λ£¨λŠ” 동적인 μ„œλ²„λ₯Ό 가진 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ‚¬μš©λ©λ‹ˆλ‹€. λ°˜λ©΄μ— HashRouter λŠ” μ„œλ²„κ°€ μ•Œλ €μ§„ νŒŒμΌμ— λŒ€ν•œ μš”μ²­μ—λ§Œ μ‘λ‹΅ν•˜λŠ” 정적인 μ›Ή μ‚¬μ΄νŠΈμ— μ‚¬μš©λ©λ‹ˆλ‹€.

μš°λ¦¬λŠ” 동적인 μ„œλ²„λ₯Ό κ°€μ •ν•˜κ³  BrowserRouter λ₯Ό μ‚¬μš©ν•˜κ² μŠ΅λ‹ˆλ‹€. μ£Όλͺ©ν•  λ§Œν•œ 점은 λͺ¨λ“  λΌμš°ν„°κ°€ 였직 ν•˜λ‚˜μ˜ μžμ‹λ§Œ 받을 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

ReactDOM.render(
  <BrowserRouter>
    <App/>
  </BrowserRouter>,
  document.getElementById(β€˜root’));

이 μ˜ˆμ œμ—μ„œ <App/> μ»΄ν¬λ„ŒνŠΈλŠ” <BrowserRouter> μ»΄ν¬λ„ŒνŠΈμ˜ μžμ‹μž…λ‹ˆλ‹€. 이제 App μ»΄ν¬λ„ŒνŠΈ μ•ˆ μ–΄λ””μ—μ„œλ‚˜ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λͺ¨λ“  λΌμš°ν„°λ₯Ό κ·Έλ£Ήν™”ν•˜μ—¬ λ™μΌν•œ μœ„μΉ˜μ— λ°°μΉ˜ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. (λ‚˜μ€‘μ— 이 뢀뢄은 또 μ–ΈκΈ‰ν•˜κ² μŠ΅λ‹ˆλ‹€.)

History

각 λΌμš°ν„°λŠ” history 객체λ₯Ό μƒμ„±ν•˜μ—¬ ν˜„μž¬ μœ„μΉ˜λ₯Ό μΆ”μ ν•˜κ³ , 이 μœ„μΉ˜κ°€ 변경될 λ•Œλ§ˆλ‹€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ‹€μ‹œ λ Œλ”λ§ν•©λ‹ˆλ‹€. λ•Œλ¬Έμ— λ‹€λ₯Έ λ¦¬μ•‘νŠΈ λΌμš°ν„° μ»΄ν¬λ„ŒνŠΈλ“€μ€ history 객체가 ν˜„μž¬μ— μ‘΄μž¬ν•˜λŠ” 것에 μ‹ κ²½μ”λ‹ˆλ‹€. 이것이 λΌμš°ν„° μ»΄ν¬λ„ŒνŠΈλ“€μ΄ λΌμš°ν„° λ‚΄λΆ€μ—μ„œ λ Œλ” λ˜μ•Ό ν•˜λŠ” μ΄μœ μž…λ‹ˆλ‹€.

<BrowserRouter> λŠ” HTML5 history APIλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€κ°€ λΈŒλΌμš°μ € μ£Όμ†Œ ν‘œμ‹œμ€„μ˜ URLκ³Ό λ™κΈ°ν™”λ˜λ„λ‘ μœ μ§€ν•©λ‹ˆλ‹€.

λΌμš°ν„°λ‘œλΆ€ν„° μƒμ„±λœ history κ°μ²΄λŠ” μ—¬λŸ¬ 속성을 κ°€μ§€λŠ”λ° κ·Έ 쀑 ν•˜λ‚˜λŠ” 값이 객체인 location μ†μ„±μž…λ‹ˆλ‹€. location 속성이 μš°λ¦¬κ°€ 이 μ±•ν„°μ—μ„œ κ°€μž₯ μ€‘μ μ μœΌλ‘œ λ³΄λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€. (λ‹€λ₯Έ 속성은 이 μ±…μ˜ λ²”μœ„λ₯Ό λ„˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.)

λΈŒλΌμš°μ €μ— 이전 μ˜ˆμ œκ°€ λ Œλ”λ§ 될 λ•Œ, history 객체가 생성될 것을 React DevTool μ°½μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

history 객체 μ•ˆμ˜ location κ°μ²΄λŠ” μ•„λž˜μ™€ 같은 ꡬ쑰λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.

{
  pathname, search, hash, state;
}

location 객체의 속성듀은 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ URLλ‘œλΆ€ν„° νŒŒμƒλœ κ²ƒμž…λ‹ˆλ‹€.

Last updated