본문 바로가기

Frontend/React

라우팅 (Routing)

라우팅 (Routing)

  • 다른 URL 주소에 따라 다른 화면을 부여해 주는 것 (페이지 이동)
  • 기존의 이동 방법 (<a> 태그) : 완전히 새로운 페이지로 이동 (상태 정보 잃음)
  • SPA : 현재 페이지에 삽입 해서 보여 줌 (상태 정보 유지)
  • 리액트 라이브러리 자체에는 라우팅 기능이 내장되어 있지 않음 -> 라우터 라이브러리 설치해서 쉽게 구현 가능

Link 컴포넌트

라우팅 기능 구현 과정

1. 프로젝트 생성 및 react-router-dom 라이브러리 설치

npx create-react-app router-app  // 프로젝트 생성
npm install react-router-dom  // 라우터 설치

package.json에 "react-router-dom": "^6.2.1" 있으면 정상적으로 설치된 것

 

2. index.js에 다음과 같은 변경사항 반영

import { BrowserRouter } from 'react-router-dom'

<BrowserRouter>
    <App />
</BrowserRouter>

import + App 컴포넌트를 <BrowserRouter> 컴포넌트로 감싸줌

 

3. 라우트로 사용할 컴포넌트 페이지 작성 - 함수형 컴포넌트로 작성 (Home.js, About.js)

// Home.js
function Home() {
    return (
      <div>
        <h1>Home 입니다.</h1>
        <p>방문을 환영합니다 ^^</p>
      </div>
    );
  }
  
  export default Home;
  
  
//  About.js
function About() {
    return (
      <div>
        <h1>사이트 소개</h1>
        <p>리액트 라우터 연습 프로젝트 입니다.</p>
      </div>
    );
  }
  
  export default About;

 

4. Route 컴포넌트로 특정 주소에 연결

- Routes 태그로 Route 태그들을 묶어줘야 함

- 라우트 하고 싶은 컴포넌트를 Route 컴포넌트로 감싸줌

- path : 어디로 갈건지. 주소 path

- element : 사용자 정의 태그 (작성한 컴포넌트들 (~.js) )

import { Link, Routes, Route } from 'react-router-dom'
import About from './components/About';
import Home from './components/Home';

function App() {
  return (
    <div className="App">
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </div>
  );
}

export default App;

http://localhost:3000/ -> Home 컴포넌트로 이동

http://localhost:3000/about -> About 컴포넌트로 이동

위 코드는 눈에 안 보이게 내부에서 라우팅 해주는거

 

5. Link 태그 연결

<Link> 태그 사용하여 사용자가 클릭하여 이동할 수 있도록 보이는 영역 만들어주기

import { Link, Routes, Route } from 'react-router-dom'
import About from './components/About';
import Home from './components/Home';

function App() {
  return (
    <div className="App">
      <ul>
        <li><Link to="/">Home 화면 보기</Link></li>
        <li><Link to="/about">About 화면 보기</Link></li>
        {/*새로운 페이지로 넘어감 : _blank -> 새 창으로 열도록 설정 */}
        <li><a href='https://www.naver.com' target="_blank">네이버로 이동</a></li>
      </ul>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </div>
  );
}

export default App;

 

(+) URL 파라미터 사용하기 : path를 통해 파라미터 전달

예제 : Movie.js

import { useParams } from "react-router-dom";

const data = {
    spider : {
        title:'스파이더 노 웨이 홈',
        director : '존 왓츠',
        actor:'톰 홀랜드',
        date : '2021-12-15',
        genre : '액션'
    },
    king : {
        title:'킹스맨:퍼스트 에이전트',
        director : '매튜 본',
        actor:'팔프 파인즈',
        date : '2021-12-22',
        genre : '액션'
    }
}

function Movie() {
    // 넘어온 파라미터 받아줌
    const params = useParams();
    // 해당되는 키워드에 따른 파라미터 받아줌
    const movie = data[params.keyword];

    if (!movie) {
        return <div><hr/><div>영화 정보가 없습니다.</div></div>
    }

    return (
      <div>
        <hr/>
        <h3>{params.keyword} : {movie.title}</h3>
        <p>감독 : {movie.director}</p>
        <p>배우 : {movie.actor}</p>
        <p>개봉일 : {movie.date}</p>
        <p>장르 : {movie.genre}</p>
      </div>
    );
  }
  
  export default Movie;

 

예제 : App.js

import { Link, Routes, Route } from 'react-router-dom'
import Movie from './components/Movie';

function App() {
  return (
    <div className="App">
      <ul>
        <li><Link to="/movie/spider">스파이더맨</Link></li>
        <li><Link to="/movie/king">킹스맨</Link></li>
        <li><Link to="/movie/squid">오징어 게임</Link></li>
      </ul>
      <Routes>
        <Route path="/movie/:keyword" element={<Movie />} />
      </Routes>
    </div>
  );
}

export default App;

useParam() 함수를 통해 해당 키워드에 대한 파라미터 받아, 각 링크 클릭 시 Movie.js에서 data[키워드]에 해당하는 객체의 값 출력

import { useParams } from "react-router-dom"; 해줘야 함

 

라우팅 연습문제

App.js

import { Link, Routes, Route } from 'react-router-dom';
import Home from './components/Home';
import Content from './components/Content';
import Book from './components/Book';
import About from './components/About';

function App() {
  return (
    <div className="App">
      <ul>
        <li><Link to="/">Home</Link></li>
        <li><Link to="/content">전체 도서 정보 조회</Link></li>
        <li><Link to="/book/pig">아기 돼지 삼형제</Link></li>
        <li><Link to="/book/duck">미운 오리 새끼</Link></li>
        <li><Link to="/about">About...</Link></li>
      </ul>

      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/content" element={<Content />} />
        <Route path="/book/:keyword" element={<Book />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </div>
  );
}

export default App;

 

Home.js

import React from 'react';

function Home() {
    return (
        <div>
            <h1>Home</h1>
            <p>환영합니다.</p>
        </div>
    );
};

export default Home;

 

Content.js

import React from 'react';

function Content() {
    return (
        <div>
            <table border='1'>
                <tr><th>제목</th><th>저자</th><th>출판사</th><th>발행일</th></tr>
                <tr><td>아기 돼지 삼형제</td><td>김작가</td><td>꿀꿀출판사</td><td>1972-07-15</td></tr>
                <tr><td>미운 오리 새끼</td><td>이작가</td><td>꽥꽥출판사</td><td>1974-05-02</td></tr>
            </table>
        </div>
    );
};

export default Content;

 

Book.js

import React from 'react';
import { useParams } from "react-router-dom";

const books = {
    pig : {
        title:'아기 돼지 삼형제',
        author:'김작가',
        publisher:'꿀꿀출판사',
        date:'1972-07-15'
    },
    duck : {
        title:'미운 오리 새끼',
        author:'이작가',
        publisher:'꽥꽥출판사',
        date:'1974-05-02'
    }
}
function Book() {
    const params = useParams();
    const book = books[params.keyword];
    
    if (!book) {
        return <div><hr/><div>영화 정보가 없습니다.</div></div>
    }
    
    return (
    <div>
        <hr/> <h3>{params.keyword} : {book.title}</h3>
        <p>작가 : {book.author}</p>
        <p>출판사 : {book.publisher}</p>
        <p>출판일 : {book.date}</p>
    </div>
    );

};

export default Book;

 

About.js

import React from 'react';

function About() {
    return (
        <div>
            <h1>About</h1>
            <p>도서 정보 제공 페이지 입니다.</p>
        </div>
    );
};

export default About;