๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ“บ Front End/- React, Next.js

[๋ฆฌ์•กํŠธ ๋ถ„์„ํ•˜๊ธฐ] ๋ฆฌ์•กํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŒ… ํ•˜๋Š” ๋ฐฉ๋ฒ• (2) ๋ถ€์ œ :: Broswer History API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ํ•˜๊ธฐ

by Wonit 2020. 7. 20.
์ด ๊ธ€์€ ๋ฆฌ์•กํŠธ์˜ ์ดˆ์‹ฌ์ž๋“ค์„ ์œ„ํ•œ ๊ธ€๋กœ ๊นŠ์€ ๋‚ด์šฉ์€ ์ตœ๋Œ€ํ•œ ๋ฐฐ์ œํ•˜๊ณ  ์‰ฌ์šด ๊ฐœ๋…์— ๋Œ€ํ•ด ์ž‘์„ฑํ•˜์˜€๊ณ , ๋ฆฌ์•กํŠธ์˜ ์ง„์ž… ์žฅ๋ฒ…์„ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•œ ์š”์†Œ๋กœ ์–ด๋ ค์šด ๋‚ด์šฉ์ด ์ƒ๋žต๋˜์–ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์€ ๊ฝค๋‚˜ ํ•ต์‹ฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— 3๋ถ€์ž‘์œผ๋กœ ๋‚˜๋ˆ ์„œ ์„ค๋ช…ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

ํ•ด๋‹น ๊ธ€์— ๋Œ€ํ•ด์„œ ๋ณธ์ธ์ด ์ด ๋ถ€๋ถ„์€ ๋„˜์–ด๊ฐ€๋„ ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ถ€๋ถ„์€ ๋„˜์–ด๊ฐ€์„œ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ธธ์ง€ ์•Š์€ ๊ธ€์ด๋ฏ€๋กœ ๊ฐ€๋ณ๊ฒŒ ์ฝ๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

  1. 1๋ถ€ ๋ฆฌ์•กํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŒ… ํ•˜๋Š” ๋ฐฉ๋ฒ•
  2. 2๋ถ€ Broswer History API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ํ•˜๊ธฐ
  3. 3๋ถ€ react-router-dom์„ ์ด์šฉํ•ด์„œ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ํ•˜๊ธฐ

์šฐ๋ฆฌ๋Š” ์ €๋ฒˆ ์‹œ๊ฐ„์— ๋ฆฌ์•กํŠธ๊ฐ€ ํŽ˜์ด์ง€์—์„œ ์–ด๋–ค ์‹์œผ๋กœ ๋ผ์šฐํŒ… ๋˜๊ธธ ์›ํ•˜๋Š”์ง€? ์— ๋Œ€ํ•ด์„œ ์ž ๊น ์•Œ์•„๋ณด์•˜๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  SPA๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ž ๊น ์‹คํ—˜์„ ํ•ด๋ณด์•˜๋Š”๋ฐ, ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ API์— ๋Œ€ํ•ด์„œ ๋” ๊นŠ๊ฒŒ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ API์— ๋Œ€ํ•ด์„œ๋Š” ๋” ์ž์„ธํžˆ ์•Œ๊ณ ์‹ถ์€ ์‚ฌ๋žŒ์€ MDN Docs์—์„œ ํ™•์ธํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ API

SPA๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ์ค‘์š”ํ•œ ๊ฐœ๋…์ด ์žˆ๋‹ค.

  • ์„œ๋ฒ„๋กœ์˜ ์š”์ฒญ์ด ์—†์ด ํŽ˜์ด์ง€ ์ „ํ™˜๊ณผ ๋’ค๋กœ๊ฐ€๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.

์ด๋Ÿฐ ๊ฐœ๋…์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ History Api์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค ์•Œ ํ•„์š”๋Š” ์—†๋‹ค. ๋”ฑ 3๊ฐ€์ง€๋งŒ ์•Œ์•„๋ณด์ž.

  1. pushstate
  2. replacestate
  3. popstate

pushstate() ํ•จ์ˆ˜

pushstate()ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค

 

pushstate(state, title, url)

์ด๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„ธ์…˜ ์Šคํƒœ์ดํŠธ๋ฅผ ์Šคํƒ์— ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ํ•ด๋‹น url๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

์„œ๋ฒ„์˜ ์š”์ฒญ ์—†์ด

replacestate() ํ•จ์ˆ˜

replacestate() ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.


replacestate(state, title, url)

 

์ด๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ˜„์žฌ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ•ด๋‹น url๋กœ ์ €์žฅํ•˜๊ณ  ์ง์ ‘ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 

์„œ๋ฒ„์˜ ์š”์ฒญ ์—†์ด

popstate() ํ•จ์ˆ˜

popstate() ํ•จ์ˆ˜๋Š” ๋น ๋ฅธ ์„ค๋ช…์„ ์œ„ํ•ด MDN์˜ ๋ฌธ์„œ ์ผ๋ถ€๋ฅผ ์บก์ณํ•˜์˜€๋‹ค.

MDN ๋ฌธ์„œ


์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด์ž.

React์™€ Broswer Histroy APi๋กœ SPA ๊ตฌ์„ฑํ•˜๊ธฐ

๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ๋Š” ์ง€๋‚œ ์‹œ๊ฐ„์—๋„ ์ž ๊น ํ–ˆ์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ์กฐ๊ธˆ ๋” ๋‹ค์–‘ํ•œ ์ปจํ…์ธ ๋ฅผ ์ถ”๊ฐ€์‹œ์ผœ์„œ ๊ตฌ์„ฑํ•ด๋ณด์ž.

 

๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ์šฐ๋ฆฐ ์ด๋Ÿฐ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.

ํŽ˜์ด์ง€ ํ™ˆ์€ localhost:3000 ์ด๊ณ  ๊ฐ๊ฐ์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์ด ๋“ฑ์žฅํ•  ๊ฒƒ์ด๋‹ค.

๋žญํ‚น์„ ํด๋ฆญํ•˜๋ฉด ์‚ฌ์šฉ์ž ๋žญํ‚น์ด ๋‚˜์˜ค๊ณ  ์‚ฌ์šฉ์ž๋ฅผ ํด๋ฆญํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ๋‚˜์˜ค๊ฒŒ ํ•  ๊ฒƒ์ด๋‹ค. ์–ด๋–ป๊ฒŒ? ์„œ๋ฒ„์˜ ์š”์ฒญ ์—†์ด

์†Œ์Šค ์ฝ”๋“œ

import React, { Component } from 'react';
import './App.css';

class App extends Component {

  state = {
    pageName : '', // ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ์ƒํƒœ ๊ฐ’์œผ๋กœ ๊ด€๋ฆฌ
  };

  componentDidMount(){
    window.onpopstate = event => { // popstate ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜
      this.onChangePage(event.state);
    }
  }

  onChangePage = pageName => { // ๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜๋ฉด pageName์ด๋ผ๋Š” ์ƒํƒœ๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ
    this.setState({ pageName });
  };

  onLankingClick = () => { // ๋žญํ‚น ํŽ˜์ด์ง€ ๋ฒ„ํŠผ ํด๋ฆญ
    const pageName = 'lanking';
    window.history.pushState(pageName, '', '/lanking');
    this.onChangePage(pageName);
  }

  onUserClick = () => { // ์‚ฌ์šฉ์ž ํŽ˜์ด์ง€ ๋ฒ„ํŠผ ํด๋ฆญ
    const pageName = 'user';
    window.history.pushState(pageName, '', '/user');
    this.onChangePage(pageName);
  }

  render() {
    const { pageName } = this.state;
    return (
      <div>
        <button className="lanking" onClick={this.onLankingClick}>Lanking</button>
        <button className="user" onClick={this.onUserClick}>User</button>
        {!pageName && <Home />}
        {pageName === 'lanking' && <Lanking />}
        {pageName === 'user' && <User />}
      </div>
    );
  }
}

function Home() {
  return <h2>๋ฉ”์ธ ํŽ˜์ด์ง€ ์ž…๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”</h2>;
}

function Lanking(){ 
  return (
    <div>
        <h2>๋žญํ‚น ํŽ˜์ด์ง€ ์ž…๋‹ˆ๋‹ค.</h2>

        <br></br>
        <h4>๊ฒฝํ—˜์น˜ ๋žญํ‚น</h4>
        <br></br>
        <ol>
          <li>์‚ฌ์šฉ์ž 3 : 44012</li>
          <li>์‚ฌ์šฉ์ž 1 : 42019</li>
          <li>์‚ฌ์šฉ์ž 5 : 20919</li>
          <li>์‚ฌ์šฉ์ž 4 : 9918</li>
        </ol>
    </div>
  );
}

function User() {
  return (
    <div>
      <h2>์‚ฌ์šฉ์ž ์ •๋ณด ํŽ˜์ด์ง€ ์ž…๋‹ˆ๋‹ค.</h2><br></br>
      <div>
        <h4>์‚ฌ์šฉ์ž 1</h4><br></br>
        ์‚ฌ์šฉ์ž 1 ์ž…๋‹ˆ๋‹ค.
      </div>
      <div>
        <h4>์‚ฌ์šฉ์ž 2</h4><br></br>
        ์‚ฌ์šฉ์ž 2 ์ž…๋‹ˆ๋‹ค.
      </div>
      <div>
        <h4>์‚ฌ์šฉ์ž 3</h4><br></br>
        ์‚ฌ์šฉ์ž 3 ์ž…๋‹ˆ๋‹ค.
      </div>
    </div>
  );
}

export default App;

๋‹จ์ 

์ด๋Ÿฐ ์‹์œผ๋กœ ํžˆ์Šคํ† ๋ฆฌ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์‹ ๊ฒฝ์จ์•ผํ•  ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด๋‚˜๋„ ๋งŽ์•„์ง„๋‹ค.

 

๋‹จ๋…์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €์— API์— ์˜ํ•ด์„œ ๊ด€๋ฆฌ๋˜๋ฏ€๋กœ ๊ฐ๊ฐ์˜ ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋Š” ๊ฒƒ์ด๊ณ , ๋˜ ๊ทธ์— ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ ์ถœ๋ ฅ๋„ ๊ฐ๊ฐ์œผ๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฐ ๊ฒƒ์„ ์กฐ๊ธˆ ์—†์• ๊ณ ์ž ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ ์‹œ๊ฐ„์— react-router-dom์„ ์ด์šฉํ•ด์„œ ์กฐ๊ธˆ ๋” ์˜ˆ์ˆ ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

'๐Ÿ“บ Front End > - React, Next.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฆฌ์•กํŠธ ๋ถ„์„ํ•˜๊ธฐ] ๋ฆฌ์•กํŠธ์˜ ๊ฐ€์ƒ Dom์€ Native Dom๊ณผ ๋น„๊ตํ•ด์„œ ์™œ ๋น ๋ฅธ์ง€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.  (0) 2020.07.30
[๋ฆฌ์•กํŠธ ๋ถ„์„ํ•˜๊ธฐ] ๋ฆฌ์•กํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŒ… ํ•˜๋Š” ๋ฐฉ๋ฒ• (3) ๋ถ€์ œ :: react-router-dom์„ ์ด์šฉํ•ด์„œ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ํ•˜๊ธฐ  (0) 2020.07.20
[๋ฆฌ์•กํŠธ ๋ถ„์„ํ•˜๊ธฐ] ๋ฆฌ์•กํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŒ… ํ•˜๋Š” ๋ฐฉ๋ฒ• (1) ๋ถ€์ œ :: Single Page Application์ด ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ๋ฆฌ์•กํŠธ์—์„œ ์‚ฌ์šฉํ• ๊นŒ?  (2) 2020.07.20
[๋ฆฌ์•กํŠธ ๋ถ„์„ํ•˜๊ธฐ] ๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ JSX์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. (๋ถ€์ œ :: ๋ฆฌ์•กํŠธ์—์„œ๋Š” JSX๋ฅผ ์–ด๋–ป๊ฒŒ ์ด์šฉํ• ๊นŒ?)  (0) 2020.07.20
[๋ฆฌ์•กํŠธ ๋ถ„์„ํ•˜๊ธฐ] Create-React-App์œผ๋กœ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด๋ณด์ž.  (0) 2020.07.20

๋Œ“๊ธ€