[React] 기본 라우팅하기

Yunhye Park·2023년 10월 23일

지식 습득

목록 보기
7/11
post-thumbnail

바닐라 자바스크립트에서 페이지를 여러 개 만들고 싶으면 페이지마다 html을 만들어야 한다. 그리고 원하는 경로를 라우팅을 해서 html 파일을 전송하는 식이다.

하지만 리액트는 싱글 페이지 어플리케이션(SPA: Single Page Application) 이다. index.html 파일 딱 하나로 모든 게 구성된다. 그럼 세부 페이지는 어떻게 만들까? 페이지를 컴포넌트로 만들어서 라우팅 주소마다 if문 같은 조건문을 달아주면 된다.

이건 말이 쉽지.. 하나하나 코딩하려면 복잡하지 않겠는가.

그래서 react-router-dom 라이브러리를 대다수가 이용한다.

설치 및 세팅

  1. 터미널에서 npm i react-router-dom@버전 입력

  2. index.js 파일에 BrowserRouter import하고 App 감싸기

// index.js

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

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <BrowserRouter>
    <App />
    </BrowserRouter>
);

react-router-dom 사용법

  1. 페이지마다 다른 요소를 렌더하려면?
    • app.js에서 Routes, Route를 import
    • 원하는 위치에 Routes로 Route를 감싼다.
    • Route의 path는 라우팅할 주소, element는 그 주소에서 보여줄 요소를 중괄호{ }로 감싼다.
// app.js

import {Routes, Route} from 'react-router-dom'

function App() {
  return (
    // 다른 코드 생략
      <Routes>
        <Route path="/" element={<Main product={product}/>} />
        <Route path="/detail" element={<Detail />} />
      </Routes>
	// 다른 코드 생략

사실 Detail 컴포넌트는 새 파일로 만든 걸 import로 가져왔다.

  1. 이처럼 코드가 긴 페이지는?
    • 새 파일에 컴포넌트 작성하여 export default 하고
    • app.js에 import 해주기
//detail.js

import { Container, Row, Col } from 'react-bootstrap';

function Detail () {
    return (
      <Container>
        <Row className="card-row">
            <Col>
                <img src="/outer/jacket1.jpg"
      				 alt="jacket1 img"
      				 width="100%" />
            </Col>
            <Col >
                <h4 className="pt-5">상품명</h4>
                <p>상품설명</p>
                <p>120000</p>
                <button className="btn btn-danger">주문하기</button> 
            </Col>
        </Row>
  </Container> 
    )
  }

  export default Detail;
// app.js

import Detail from './detail';

덧붙이는 말

  • 페이지 대신 컴포넌트로 표현한다는 말을 이해할 것 같다. 페이지마다 html 파일을 생성하는 게 아니라, 컴포넌트 단위로 js 파일을 생성해 import 해주는 방식인 듯하다.

  • 페이지 통째로 파일로 만든다는 아이디어는 같다. 하지만 각각의 html 파일을 매번 통으로 렌더링하는 방식과 특정 부분만 처리하는 방식 사이엔 퍼포먼스 차이가 있지 않을까 예상해 본다. 있다면 얼마나 유의미할까?

profile
일단 해보는 편

0개의 댓글