Router - MoonGyeongHyeon/React_Study GitHub Wiki

React - Router

Router๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ URL์˜ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ Œ๋”๋งํ•ด์ค€๋‹ค. ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ์›น์•ฑ์—์„œ ์‚ฌ์šฉํ•  ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋จผ์ € ๋ถˆ๋Ÿฌ์™€๋‘๊ณ , ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ๋•Œ ๊ทธ๋•Œ ํŽ˜์ด์ง€๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋กœ๋”ฉํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋งŒ ๋‹ค์‹œ ๋ Œ๋”๋งํ•œ๋‹ค.

์˜ˆ์ œ

๊ธฐ๋ณธ ํŽ˜์ด์ง€("/")์™€ ํ•˜์œ„ ํŽ˜์ด์ง€ 3๊ฐœ("/home", "/About", "Articles")๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค. ๋ผ์šฐํŒ… ํ•  3๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜์ž.

ํŽธ์˜๋ฅผ ์œ„ํ•ด App.js์— ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ํ–ˆ๋‹ค.

import React from 'react';
import ReactDOM from 'react-dom';
import {
    BrowserRouter as Router,
    Route,
    Link,
} from 'react-router-dom';

class App extends React.Component {
    render() {

        return (
            <div>
                <ul>
                    <li><Link to="home">Home</Link></li>
                    <li><Link to="about">About</Link></li>
                    <li><Link to="articles">Articles</Link></li>
                </ul>
                {this.props.children}
            </div>
        );
    }
}

class Home extends React.Component {
    render() {
        return (
            <h2>Hey, I am HOME!</h2>
        );
    }
}

class About extends React.Component {
    render() {
        return (
            <h2>Hey, I am ABOUT!</h2>
        );
    }
}

class Articles extends React.Component {
    render() {
        return (
            <h2>Hey, I am ARTICLES!</h2>
        );
    }
}

var rootElement = document.getElementById('app');
ReactDOM.render((
    <Router>
        <div>
            <Route path="/" component={App}/>
            <Route path="/home" component={Home}/>
            <Route path="/about" component={About}/>
            <Route path="/articles" component={Articles}/>
        </div>
    </Router>
), rootElement);

๋ถ€๋ถ„๋ถ€๋ถ„ ๋ณด๋„๋ก ํ•˜์ž.

import React from 'react';
import ReactDOM from 'react-dom';
import {
    BrowserRouter as Router,
    Route,
    Link,
} from 'react-router-dom';

ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ importํ•œ๋‹ค.

class App extends React.Component {
    render() {

        return (
            <div>
                <ul>
                    <li><Link to="home">Home</Link></li>
                    <li><Link to="about">About</Link></li>
                    <li><Link to="articles">Articles</Link></li>
                </ul>
                {this.props.children}
            </div>
        );
    }
}

๋ฉ”์ธ("/")์—์„œ ๋ณด์—ฌ์ค„ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. Link ๋Š” Router ์— ๋‚ด์žฅ๋˜์–ด์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ์ค‘ ํ•˜๋‚˜๋กœ, return <a {...props} onClick={this.handleClick} /> ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค. ๋งํฌ๋ฅผ ํ•ด์ฃผ๋Š” a ํƒœ๊ทธ์™€ ๊ฐ™์•„๋ณด์ด์ง€๋งŒ ๋‹ค๋ฅธ์ ์€ ํด๋ฆญํ–ˆ์„ ๋•Œ, <a href=".."> ํƒœ๊ทธ๋Š” ํŽ˜์ด์ง€ ์ž์ฒด๋ฅผ ๋ฆฌ๋กœ๋”ฉํ•ด๋ฒ„๋ฆฌ์ง€๋งŒ, <Link> ๋Š” this.props.children ๋ถ€๋ถ„๋งŒ ๋ฆฌ๋กœ๋”ฉํ•ด์ค€๋‹ค.

this.props.children ์€ ๋”ฐ๋กœ ์„ค์ •ํ•˜๋Š” props๊ฐ€ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ, ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ <Component> <...> </Component> ์—์„œ <...> ๋ถ€๋ถ„์ด this.props.children ์œผ๋กœ ์ž๋™ ์„ค์ •๋œ๋‹ค.

์ฆ‰, "Home" ๋งํฌ๋ฅผ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด ".../home" ์— ํ•ด๋‹นํ•˜๋Š” URL ์š”์ฒญ์ด ์ด๋ฃจ์–ด์ง€๊ณ , ๊ทธ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ this.props.children ๋ถ€๋ถ„์— ๋ฆฌ๋กœ๋”ฉ์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

var rootElement = document.getElementById('app');
ReactDOM.render((
    <Router>
        <div>
            <Route path="/" component={App}/>
            <Route path="/home" component={Home}/>
            <Route path="/about" component={About}/>
            <Route path="/articles" component={Articles}/>
        </div>
    </Router>
), rootElement);

๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•, <Router> <Route ...> ... </Route> </Router> ์˜ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. path ์†์„ฑ์€ URL ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, component๋Š” ํ•ด๋‹น URL์— ์ƒ์‘ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Œ€๋กœ ์‹คํ–‰ํ•œ๋‹ค๋ฉด Cannot GET /Home ๋ผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ์ฃผ์†Œ๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„์ชฝ ๋ผ์šฐํ„ฐ์—์„œ ๋จผ์ € ์—ฐ๊ฒฐํ•  ๊ณณ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋Š”๋ฐ, ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์„œ๋ฒ„์— ๋”ฐ๋กœ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. webpack ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ, webpack.config.js ํŒŒ์ผ์— ์ฝ”๋“œ ํ•œ์ค„์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋„๋ก ํ•˜์ž.

devServer: {
	/*...*/
        historyApiFallback: true
    },

historyApiFallback์„ ํ™œ์„ฑํ™”ํ•ด์ฃผ๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ