πŸ’› λ¦¬μ•‘νŠΈ SPA 01 (λΈŒλΌμš°μ € νžˆμŠ€ν† λ¦¬ API)

leehyunjuΒ·2021λ…„ 5μ›” 3일
0

SPA (Single Page Application)λž€ ?

μ‹±κΈ€ νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 약어이닀. 뜻 κ·ΈλŒ€λ‘œ ν•œ 개의 νŽ˜μ΄μ§€λ‘œ 이루어진 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ !

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λΈŒλΌμš°μ €μ— λΆˆλŸ¬μ™€μ„œ μ‹€ν–‰μ‹œν‚¨ 후에 μ‚¬μš©μžμ™€μ˜ μΈν„°λž™μ…˜μ΄ λ°œμƒν•˜λ©΄ ν•„μš”ν•œ λΆ€λΆ„λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ μ—…λ°μ΄νŠΈ 해쀄 수 μžˆλ‹€. 그리고 λ‹€λ₯Έ μ£Όμ†Œμ— λ‹€λ₯Έ 화면을 λ³΄μ—¬μ£ΌλŠ” 것을 λΌμš°νŒ…μ΄λΌκ³  ν•œλ‹€. λ¦¬μ•‘νŠΈ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λ¦¬μ•‘νŠΈ λΌμš°ν„°, 리치 λΌμš°ν„°, Next.js κ°€ μžˆλ‹€.

단점

μ•±μ˜ 규λͺ¨κ°€ μ»€μ§€λ©΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 파일이 λ„ˆλ¬΄ μ»€μ§„λ‹€λŠ” 것. ν•˜μ§€λ§Œ 이 단점을 보완해쀄 μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…μ΄ μžˆμ–΄μ„œ 이 것을 μ‚¬μš©ν•˜λ©΄ λΌμš°νŠΈλ³„λ‘œ νŒŒμΌλ“€μ„ λ‚˜λˆ„μ–΄μ„œ νŠΈλž˜ν”½κ³Ό λ‘œλ”© 속도λ₯Ό κ°œμ„ ν•  수 μžˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 싀행될 λ•ŒκΉŒμ§€ νŽ˜μ΄μ§€κ°€ λΉ„μ–΄ 있기 λ•Œλ¬Έμ— μžλ°”μŠ€ν¬λ¦½νŠΈ 파일이 λ‘œλ”©λ˜μ–΄ μ‹€ν–‰λ˜λŠ” 짧은 μ‹œκ°„ λ™μ•ˆ 흰 νŽ˜μ΄μ§€κ°€ λ‚˜νƒ€λ‚  수 μžˆλ‹€. μ΄λŸ°μ λ„ μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§μ„ 톡해 λͺ¨λ‘ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λΈŒλΌμš°μ € νžˆμŠ€ν† λ¦¬ API

단일 νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ €λ©΄ λ‹€μŒ 두 가지 κΈ°λŠ₯이 ν•„μš”ν•˜λ‹€.

  1. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λΈŒλΌμš°μ €λ‘œ νŽ˜μ΄μ§€ μ „ν™˜ μš”μ²­μ„ 보낼 수 μžˆλ‹€. 단, λΈŒλΌμš°μ €λŠ” μ„œλ²„λ‘œ μš”μ²­μ„ 보내지 μ•Šμ•„μ•Ό ν•œλ‹€.
  2. λΈŒλΌμš°μ €μ˜ λ’€λ‘œ 가기와 같은 μ‚¬μš©μžμ˜ νŽ˜μ΄μ§€ μ „ν™˜ μš”μ²­μ„ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ²˜λ¦¬ν•  수 μžˆλ‹€. μ΄λ•Œλ„ λΈŒλΌμš°μ €λŠ” μ„œλ²„λ‘œ μš”μ²­μ„ 보내지 μ•Šμ•„μ•Ό ν•œλ‹€.

μ΄λŸ¬ν•œ 쑰건을 λ§Œμ‘±ν•˜λŠ” λΈŒλΌμš°μ € apiλŠ” pushState, replaceState ν•¨μˆ˜μ™€ popstate μ΄λ²€νŠΈμ΄λ‹€. apiμ΄λ¦„μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ λΈŒλΌμš°μ €μ—λŠ” νžˆμŠ€ν† λ¦¬μ— stateλ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒμ΄ μ‘΄μž¬ν•œλ‹€.

import React, { useEffect } from "react";

export default function HistoryShow() {
  useEffect(() => {
    window.onpopstate = function (event) {
      console.log(`location: ${document.location}, state: ${event.state}`);
    };
  }, []);

  return (
    <div>
      <button onClick={() => window.history.pushState("v1", "", "/page1")}>
        page1
      </button>
      <button onClick={() => window.history.pushState("v1", "", "/page2")}>
        page2
      </button>
    </div>
  );
}

첫 번째 μœ„ μ½”λ“œλŠ” /page1κ³Ό /page2둜 λ²ˆκ°ˆμ•„ λ³€κ²½λ˜λŠ” 것을 확인할 수 μžˆλ‹€. μ΄λ•Œ μ„œλ²„λ‘œ μš”μ²­μ΄ 가지 μ•Šκ³  화면도 λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€. 단지 μŠ€νƒμ— stateκ°€ μŒ“μΌ 뿐이닀. onpopstate ν•¨μˆ˜λ„ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€. useEffect ν•¨μˆ˜λŠ” 이벀트 ν•Έλ“€λŸ¬λ₯Ό λ“±λ‘ν•˜κ±°λ‚˜, apiλ₯Ό ν˜ΈμΆœν•˜λŠ” λ“±μ˜ λΆ€μˆ˜ 효과λ₯Ό μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 훅이닀.

import React, { useEffect, useState } from "react";

export default function HistoryShow02() {
  const [pageName, setPageName] = useState("");
  useEffect(() => {
    window.onpopstate = (event) => {
      setPageName(event.state);
    };
  }, []);

  //λ²„νŠΌ 1
  function onClick1() {
    const pageName = "page1";
    window.history.pushState(pageName, "", "/page1");
    setPageName(pageName);
  }
  
  //λ²„νŠΌ 2
  function onClick2() {
    const pageName = "page2";
    window.history.pushState(pageName, "", "/page2");
    setPageName(pageName);
  }
  return (
    <>
      <button onClick={onClick1}>page1</button>
      <button onClick={onClick2}>page2</button>

      {!pageName && <Home />}
      {pageName === "page1" && <Page1 />}
      {pageName === "page2" && <Page2 />}
    </>
  );
}

function Home() {
  return <h2>μ—¬κΈ°λŠ” ν™ˆνŽ˜μ΄μ§€μž…λ‹ˆλ‹€.</h2>;
}
function Page1() {
  return <h2>μ—¬κΈ°λŠ” νŽ˜μ΄μ§€ 1μž…λ‹ˆλ‹€.</h2>;
}
function Page2() {
  return <h2>μ—¬κΈ°λŠ” νŽ˜μ΄μ§€ 2μž…λ‹ˆλ‹€.</h2>;
}

두 번째 이 μ½”λ“œλŠ” ν˜„μž¬ νŽ˜μ΄μ§€ 정보λ₯Ό pageName μƒνƒ―κ°’μœΌλ‘œ κ΄€λ¦¬ν•œλ‹€. popstate μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ©΄ νŽ˜μ΄μ§€λ₯Ό μ „ν™˜ν•œλ‹€λŠ” 의미둜 pageName 상탯값을 μˆ˜μ •ν•œλ‹€. λΈŒλΌμš°μ € νžˆμŠ€ν† λ¦¬ stateλ₯Ό νŽ˜μ΄μ§€ μ΄λ¦„μœΌλ‘œ μ‚¬μš©ν•˜κ³  μžˆλ‹€. νŽ˜μ΄μ§€ λ²„νŠΌ ν΄λ¦­μ‹œ ν˜ΈμΆœλ˜λŠ” 이벀트 처리 ν•¨μˆ˜λ‹€. νŽ˜μ΄μ§€ λ²„νŠΌμ„ λˆ„λ₯΄κΈ° μ „μ—λŠ” Home μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§λœλ‹€. 첫 번째 νŽ˜μ΄μ§€ λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ Page1 μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§λ˜κ³ , 두 번째 νŽ˜μ΄μ§€ λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ Page2 μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§λœλ‹€. νŽ˜μ΄μ§€ λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ λΈŒλΌμš°μ € μ£Όμ†Œμ°½μ˜ λ‚΄μš©μ΄ λ³€κ²½λ˜κ³ , λΈŒλΌμš°μ €μ˜ λ’€λ‘œ κ°€κΈ° λ²„νŠΌμ„ 클릭해도 μ˜λ„ν•œ λŒ€λ‘œ 잘 λ™μž‘ν•˜λŠ” 것을 확인할 수 μžˆλ‹€.

profile
μ•„λŠ‘ν•œ λ‡Œκ³΅κ°„ 🧠

0개의 λŒ“κΈ€