๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

WINK-(Web & App)/React.js ์Šคํ„ฐ๋””

[2025 1ํ•™๊ธฐ React.js ์Šคํ„ฐ๋””] ์ด์ƒ๋ž˜ #6์ฃผ์ฐจ

๋ฐ˜์‘ํ˜•

๐Ÿ”  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ in JS

๋™๊ธฐ์ 

  • ํ•œ ์ž‘์—…์ด ๋๋‚˜์•ผ ๋‹ค์Œ ์ž‘์—… ์ง„ํ–‰

๋™๊ธฐ์ 

  • ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๋™์‹œ์— ์ง„ํ–‰/ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ณผ์ •์—์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋„ ํ˜ธ์ถœ ๊ฐ€๋Šฅ

๐Ÿ‘€ Promise

: ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์™„๋ฃŒ ๋˜๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด

 

promise๊ฐ€ ๊ฐ€์ง€๋Š” ์ƒํƒœ

  1. pending : ๋Œ€๊ธฐ ์ƒํƒœ (์•„์ง ๊ฒฐ๊ณผ x)
  2. fulfilled : ์ดํ–‰๋จ (์ž‘์—… ์„ฑ๊ณต)
  3. rejected : ๊ฑฐ๋ถ€๋จ (์ž‘์—… ์‹คํŒจ)

๊ธฐ๋ณธ๋ฌธ๋ฒ• ์˜ˆ์ œ

const promise = new Promise((resolve, reject) => {
  // ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰
  if (์„ฑ๊ณต) {
    resolve('๊ฒฐ๊ณผ');
  } else {
    reject('์—๋Ÿฌ ๋ฉ”์‹œ์ง€');
  }
});

resolve() : fulfilled ์ƒํƒœ๋กœ ์ „ํ™˜์‹œํ‚ค๋Š” ํ•จ์ˆ˜

 

๐Ÿ‘€ async/await

๊ธฐ๋ณธ ๋ฌธ๋ฒ•

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function process() {
  console.log('์•ˆ๋…•ํ•˜์„ธ์š”!');
  await sleep(1000); // 1์ดˆ์‰ฌ๊ณ 
  console.log('๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค!');
}

process();
  • ํ•จ์ˆ˜๋ฅผ ์„ ์–ธ ํ•  ๋•Œ ํ•จ์ˆ˜์˜ ์•ž๋ถ€๋ถ„์— async ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์คŒ
  • Promise ์˜ ์•ž๋ถ€๋ถ„์— await ์„ ๋„ฃ์–ด์คŒ => ํ•ด๋‹น ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‹ค์Œ ์ž‘์—… ์ˆ˜ํ–‰
  • ํ•จ์ˆ˜์—์„œ async๋ฅผ ์‚ฌ์šฉ => ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ Promise๋ฅผ ๋ฐ˜ํ™˜

๐Ÿ”  API ์—ฐ๋™์˜ ๊ธฐ๋ณธ

๐Ÿ‘€ REST API 

  • ๋ฉ”์„œ๋“œ
    1. GET: ๋ฐ์ดํ„ฐ ์กฐํšŒ ex) axios.get('API ์ฃผ์†Œ');
    2. POST: ๋ฐ์ดํ„ฐ ๋“ฑ๋ก ex) axios.post('API ์ฃผ์†Œ, {๋“ฑ๋กํ•  ์ •๋ณด});
    3. PUT : ๋ฐ์ดํ„ฐ ์ˆ˜์ •
    4. DELETE: ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ
    5. + PATCH, HEAD ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋„ ์กด์žฌ

๐Ÿ‘€ useState ์™€ useEffect ๋กœ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉํ•˜๊ธฐ

์ปดํฌ๋„ŒํŠธ์— api ๋ฐ›์•„์˜ค๊ณ  ๋ Œ๋”๋ง ํ•ด์คฌ๋”๋‹ˆ ์ž˜ ๋œน๋‹ˆ๋‹ค

  • useEffect์— ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋“ฑ๋กํ•˜๋Š” ํ•จ์ˆ˜์—๋Š” async ์‚ฌ์šฉ ๋ถˆ๊ฐ€ => ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ async๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์„ ์–ธ ํ•„์š”
  • ๋กœ๋”ฉ ์ƒํƒœ์ผ๋•Œ๋Š” ๋กœ๋”ฉ์ค‘.. ๋ฌธ๊ตฌ
  • users๊ฐ’์ด ์—†์„ ๋•Œ null์„ ๋ณด์—ฌ์ฃผ๋„๋ก
  • users ๋ฐฐ์—ด์„ ๋ Œ๋”๋ง

๐Ÿ‘€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ API ์žฌ์š”์ฒญํ•˜๊ธฐ

์™ผ์ชฝ ์ฝ”๋“œ ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•ด์„œ ๋ฒ„ํŠผ๋งŒ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋ฒ„ํŠผ์œผ๋กœ API ์žฌ์š”์ฒญ์ด ๊ฐ€๋Šฅ !


๐Ÿ”  ๋ผ์šฐํŒ…

: ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ URL์— ๋”ฐ๋ผ ์•Œ๋งž๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธ

ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ or ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

 

โ“์—ฌ๋ŸฌํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ

๋งŒ์•ฝ์— ๋ธ”๋กœ๊ทธ๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด :

  • ๊ธ€์“ฐ๊ธฐ ํŽ˜์ด์ง€
  • ํฌ์ŠคํŠธ ๋ชฉ๋ก ํŽ˜์ด์ง€
  • ํฌ์ŠคํŠธ ์ฝ๊ธฐ ํŽ˜์ด์ง€

์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฆฌ์•กํŠธ์—์„œ ๋ผ์šฐํŠธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ์„ ํƒ์ง€

  • ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ(React Router) : ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฆฌ์•กํŠธ์˜ ๋ผ์šฐํŒ… ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ์˜ค๋ž˜๋๊ณ , ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ผ์šฐํŒ… ์‹œ์Šคํ…œ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ.
  • Next.js : ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋ ˆ์ž„์›Œํฌ,  ๋ผ์šฐํŒ… ์‹œ์Šคํ…œ์€ ํŒŒ์ผ ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™

 

๐Ÿ”  ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

: ํ•œ ๊ฐœ์˜ ํŽ˜์ด์ง€(HTML)๋กœ ์ด๋ฃจ์–ด์ง„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

 

๐Ÿ’ก ํ•ต์‹ฌ ๊ฐœ๋…:

  • ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ์ƒˆ๋กœ๊ณ ์นจ์ด ์—†๋‹ค.
  • ์„œ๋ฒ„๋Š” ํ•œ ๋ฒˆ๋งŒ HTML์„ ์ œ๊ณตํ•˜๊ณ , ์ดํ›„์—๋Š” ํ•„์š”ํ•œ ์ฝ˜ํ…์ธ ๋งŒ JavaScript๋กœ ๋™์ ์œผ๋กœ ๊ต์ฒดํ•จ.
  • React๋Š” ์ด ๋ฐฉ์‹์„ ์“ฐ๋Š” ๋Œ€ํ‘œ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๐Ÿ”  ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ ์ ์šฉ ๋ฐ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

๐Ÿ‘€ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ / ๋ผ์šฐํ„ฐ ์ ์šฉ

BrowserRouter๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์‹ธ๋ฉด ๋œ๋‹ค๊ณ  ํ•˜๋„ค์š”

๐Ÿ‘€ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

์›น ์‚ฌ์ดํŠธ๋ฅผ ์†Œ๊ฐœํ•˜๋Š” AboutํŽ˜์ด์ง€ & ๊ฐ€์žฅ ๋จผ์ € ๋ณด์—ฌ์ง€๋Š” Home ํŽ˜์ด์ง€

๐Ÿ‘€ Route ์ปดํฌ๋„ŒํŠธ๋กœ ํŠน์ • ๊ฒฝ๋กœ์— ์›ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ณด์—ฌ์ฃผ๊ธฐ

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { BrowserRouter } from 'react-router-dom';

ReactDOM.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>,
  document.getElementById('root')
);

index.js๋ฅผ ์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋ฉด ๋ฆฌ์•กํŠธ 18์ด์ƒ์—์„  ์•ˆ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค !!!

๋ฐ”๊ฟ”์คฌ๋”๋‹ˆ ์ž˜ ๋˜๋„ค์š” ใ…‹

๐Ÿ‘€ Route ์ปดํฌ๋„ŒํŠธ๋กœ ํŠน์ • ๊ฒฝ๋กœ์— ์›ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ณด์—ฌ์ฃผ๊ธฐ

Link ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๋งํฌ๋ฅผ ๋ณด์—ฌ์คŒ

-์›น ํŽ˜์ด์ง€์—์„œ๋Š” ์›๋ž˜ aํƒœ๊ทธ ์‚ฌ์šฉ : ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ a ํƒœ๊ทธ๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋จ.

=> aํƒœ๊ทธ๋ฅผ ํด๋ฆญํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ

 

Link ์ปดํฌ๋„ŒํŠธ๋„ aํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธด ํ•˜์ง€๋งŒ

ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ๋ง‰๊ณ  ,History API๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์˜ ๊ฒฝ๋กœ๋งŒ ๋ฐ”๊พธ๋Š” ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Œ

 

Link ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ๋ฒ•

<Link to="๊ฒฝ๋กœ">๋งํฌ ์ด๋ฆ„</Link>

 

Link ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ
์ด๋ ‡๊ฒŒ ์†Œ๊ฐœ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋งํฌ๋กœ ๊ฐ€๋Š” ๊ธฐ๋Šฅ์ด ์ƒ๊ธด๋‹ค~~


๐Ÿ”  URL ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง

  • URL ํŒŒ๋ผ๋ฏธํ„ฐ ex) /profile/velopert
    • ์ฃผ์†Œ์˜ ๊ฒฝ๋กœ์— ์œ ๋™์ ์ธ ๊ฐ’์„ ๋„ฃ๋Š” ํ˜•ํƒœ
    • ID ๋˜๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ
  • ์ฟผ๋ฆฌ์ŠคํŠธ๋ง ex) /articles?**page=1&keyword=react
    • ์ฃผ์†Œ์˜ ๋’ท๋ถ€๋ถ„์— ?๋ฌธ์ž์—ด ์ดํ›„์— key=value๋กœ ๊ฐ’์„ ์ •์˜ํ•˜๋ฉฐ &๋กœ ๊ตฌ๋ถ„์„ ํ•˜๋Š” ํ˜•ํƒœ
    • ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰,ํŽ˜์ด์ง€๋„ค์ด์…˜,์ •๋ ฌ ๋ฐฉ์‹ ๋“ฑ ๋ฐ์ดํ„ฐ ์กฐํšŒ์— ํ•„์š”ํ•œ ์˜ต์…˜์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ
URL ํŒŒ๋ผ๋ฏธํ„ฐ

 

  • useParams๋ผ๋Š” Hook์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์กฐํšŒ
  • URL ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์€ Route ์ปดํฌ๋„ŒํŠธ์˜ path props๋ฅผ ํ†ตํ•˜์—ฌ ์„ค์ •
์ฟผ๋ฆฌ์ŠคํŠธ๋ง

URL ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋‹ฌ๋ฆฌ Route ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณ„๋„๋กœ ์„ค์ •ํ•ด์•ผ ๋˜๋Š” ๊ฒƒ ์—†์Œ

 

  • useLoacation์ด๋ผ๋Š” Hook์„ ์‚ฌ์šฉ, location ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ (ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ณ ์žˆ๋Š” ํŽ˜์ด์ง€์˜ ์ •๋ณด๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์Œ)
  • ์ด ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” ๊ฐ’
    • pathname: ํ˜„์žฌ ์ฃผ์†Œ์˜ ๊ฒฝ๋กœ (์ฟผ๋ฆฌ์ŠคํŠธ๋ง ์ œ์™ธ)
    • search: ๋งจ ์•ž์˜ ? ๋ฌธ์ž ํฌํ•จํ•œ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง ๊ฐ’
    • hash: ์ฃผ์†Œ์˜ # ๋ฌธ์ž์—ด ๋’ค์˜ ๊ฐ’(์ฃผ๋กœ History API ๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ ํด๋ผ์ด์–ธํŠธ ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•  ๋•Œ ์“ฐ๋Š” ํ•ด์‹œ ๋ผ์šฐํ„ฐ์—์„œ ์‚ฌ์šฉ)
    • state: ํŽ˜์ด์ง€๋กœ ์ด๋™ํ• ๋•Œ ์ž„์˜๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ ๊ฐ’
    • key: location ๊ฐ์ฒด์˜ ๊ณ ์œ  ๊ฐ’, ์ดˆ๊ธฐ์—๋Š” default์ด๋ฉฐ ํŽ˜์ด์ง€๊ฐ€ ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ๊ณ ์œ ์˜ ๊ฐ’์ด ์ƒ์„ฑ๋จ

์ฟผ๋ฆฌ์ŠคํŠธ๋ง์€ location.search ๊ฐ’์„ ํ†ตํ•ด ์กฐํšŒ ๊ฐ€๋Šฅ

 

์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ์‰ฝ๊ฒŒ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ• !

  • useSearchParams๋Š” ๋ฐฐ์—ด ํƒ€์ž…์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜
  • ์ฒซ๋ฒˆ์งธ ์›์†Œ : ์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ/์ˆ˜์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์ด ๋‹ด๊ธด ๊ฐ์ฒด ๋ฐ˜ํ™˜
    • get(): ํŠน์ • ์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ
    • set() : ํŠน์ • ์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ ์—…๋ฐ์ดํŠธ
  • ๋‘๋ฒˆ์งธ ์›์†Œ: ์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ์ฒดํ˜•ํƒœ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜

 

๐Ÿ”  ์ค‘์ฒฉ๋œ ๋ผ์šฐํŠธ

import { Route, Routes } from 'react-router-dom';
import About from './pages/About';
import Article from './pages/Article';
import Articles from './pages/Articles';
import Home from './pages/Home';
import Profile from './pages/Profile';

const App = () => {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
      <Route path="/profiles/:username" element={<Profile />} />
      <Route path="/articles" element={<Articles />} />
      <Route path="/articles/:id" element={<Article />} />
    </Routes>
  );
};

export default App;

 

์ด๋Ÿฐ ์ฝ”๋“œ๋ฅผ ์ค‘์ฒฉ๋œ ๋ผ์šฐํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ

Outlet๊นŒ์ง€ ์จ์„œ
์ด๋Ÿฐ์‹์œผ๋กœ ๋œจ๊ฒŒ ๋งŒ๋“ค์–ด ์คฌ์Šต๋‹ˆ๋‹ค !!

๐Ÿ‘€ ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ

์ค‘์ฒฉ๋œ ๋ผ์šฐํŠธ์™€ Outlet์€ ํŽ˜์ด์ง€๋ผ๋ฆฌ ๊ณตํ†ต์ ์œผ๋กœ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ์ด ์žˆ์„๋•Œ๋„ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

ex) Home, About, Profile ํŽ˜์ด์ง€์—์„œ ์ƒ๋‹จ์— ํ—ค๋”๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š” ์ƒํ™ฉ

-์ค‘์ฒฉ๋œ ๋ผ์šฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋จ

Layout์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ Œ๋”๋ง ํ•ด์ฃผ๋ฉด
์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜๋งŒ์œผ๋กœ ์ด๋ ‡๊ฒŒ ๊ฐ™์€ ํ—ค๋”๋ฅผ ๋„์šธ์ˆ˜ ์žˆ๋‹ค !

๐Ÿ‘€ index props

Route ์ปดํฌ๋„ŒํŠธ์—๋Š” index๋ผ๋Š” props๊ฐ€ ์žˆ์Œ. ์ด props๋Š” path="/"์™€ ๋™์ผํ•œ ์˜๋ฏธ


๐Ÿ”  ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ ๋ถ€๊ฐ€๊ธฐ๋Šฅ

๐Ÿ‘€ useNavigate

: Link ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™์„ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ์‚ฌ์šฉํ•˜๋Š” Hook

 

์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™๊ฐ€๋Šฅ !!

navigate()

 

ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ˆซ์ž ํƒ€์ž…์ด๋ผ๋ฉด ์•ž์œผ๋กœ ๊ฐ€๊ฑฐ๋‚˜, ๋’ค๋กœ๊ฐ.

ex) navigate(-1) : ํ•œ ๋ฒˆ ๋’ค๋กœ 

ex) navigate(2) : ๋‘ ๋ฒˆ ์•ž์œผ๋กœ

 

replace

  • ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ํŽ˜์ด์ง€ ๊ธฐ๋ก์— ๋‚จ๊ธฐ์ง€ ์•Š์Œ

๐Ÿ‘€ NavLink(์ปดํฌ๋„ŒํŠธ)

: ๋งํฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ํ˜„์žฌ ๋ผ์šฐํŠธ์˜ ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ํŠน์ • ์Šคํƒ€์ผ ๋˜๋Š” CSS ํด๋ž˜์Šค๋ฅผ ์ ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ

- style ๋˜๋Š” className์„ ์„ค์ •ํ•  ๋•Œ { isActive: boolean } ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›๋Š” ํ•จ์ˆ˜ ํƒ€์ž…์˜ ๊ฐ’์„ ์ „๋‹ฌ

 

ex)

<NavLink 
  style={({isActive}) => isActive ? activeStyle : undefined} 
/>

<NavLink 
  className={({isActive}) => isActive ? 'active' : undefined} 
/>

 

์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋„ค์š”

๐Ÿ‘€ NotFound ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

: ์‚ฌ์ „์— ์ •์˜๋˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ์— ์‚ฌ์šฉ์ž๊ฐ€ ์ง„์ž…ํ–ˆ์„ ๋•Œ ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€(ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ํŽ˜์ด์ง€)

์ด๋Ÿฐ์‹์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค

๐Ÿ‘€ Navigate ์ปดํฌ๋„ŒํŠธ

: ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š” ์ˆœ๊ฐ„ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™์„ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ

 

์„ฑ๊ณต ~!

 

์ด๋ฒˆ์ด ์Šคํ„ฐ๋”” ๋งˆ์ง€๋ง‰์ด๋„ค์š”ใ… ใ…  ์•„์‰ฝ์Šต๋‹ˆ๋‹ค

 

๋ฐ˜์‘ํ˜•