티스토리 뷰

MPA(Multiple Page Application)

: 페이지마다 새로운 html을 받아와 화면에 보여주는 방식(깜빡인다고 표현함)

웹사이트가 복잡해지고 애플리케이션 형태를 가지게 되면서

사용자와 서비스 사이의 상호작용이 많아지고

트래픽 증가, 느린 반응성으로 사용자 경험의 저하를 야기시킴

(Header, Navigation Bar 등 중복되는 요소들을 매번 불러오는 것은 불필요한 트래픽 발생시킴)


SPA(Single Page Application)

: html 문서 전체가 아니라 필요한 데이터만 받아 업데이트하는 방식

 

업데이트에 필요한 데이터만 서버에서 전달받아 동적으로 HTML요소를 생성해서 화면에 보여주는 방식

JS와 historyAPI를 이용해 구현할 수 있는데

이를 쉽게하도록 도와주는 라이브러리가 react-router-dom

 

SPA 장점

1. 사용자와 상호작용이 빠름

2. 서버 과부하 문제가 줄어듦

=> 더 나은 유저경험 제공

ex) 유튜브, 페이스북, 구글, 에어비앤비, 넷플릭스

 

SPA 단점

1. JS파일 크기가 커서 첫 화면 로딩 시간이 긺

(대부분의 코드가 JS파일에 들어있기 때문에 html은 거의 비어있음)

2. 검색엔진최적화(SEO)가 좋지 않음

검색엔진들은 HTML파일의 태그나 링크를 분석하는 방식으로 검색 기능 구동

검색엔진최적화에 대한 대응책 마련

-> SPA 검색엔진최적화를 위해 검색엔진이 발전하고 있어서 이 단점은 없어지는 중임

3. 앱 내에서 앞으로 가기, 뒤로 가기 등 상태 관리에 주의 필요

-> 개발 복잡도가 늘어남

 

 

create-react-app, react-router-dom 이용하여 간단한 SPA 만들기

1. 라이브러리 설치

npx create-react-app@latest simpleroute

npm install react-router-dom@^6.3.0

* Semantic Versioning 틸드(~), 캐럿(^) 참고

 

아래부터 routing 주소에 따라 다른 뷰를 보여주는 과정

2. react-router-dom을 사용하기 위한 기본 설정(BrowserRouter)

// index.js

// 라이브러리 불러오기
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';

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

// React Version 17
ReactDOM.render(<BrowserRouter><App/></BrowserRouter>, document.querySelector('#root'));

BrowserRouter

: History API를 이용해 페이지를 새로고침하지 않고도 주소를 변경할 수 있게 해 줌

 

3. 페이지 이동(주소창 path 변경) 시 보여질 컴포넌트 설정(Routes, Route)

import React from 'react';
import { BrowserRouter, Routes, Route, Link, useNavigate } from "react-router-dom";

import Sidebar from './Sidebar';
import Tweets from './Pages/Tweets';
import About from './Pages/About';

const App = () => {
  return (
    <BrowserRouter>
      <div className="App">
        <main>
          <Sidebar />          
          <Routes>
            <Route path="/" element={<Tweets />} />
            <Route path="/about" element={<About />} />
          </Routes>
        </main>
      </div>
    </BrowserRouter>
  );
};

export default App;

Routes

여러 Route 컴포넌트를 감싸고, 그중 경로가 일치하는 단 하나의 라우터만 렌더링 시켜줌.

불러오고 싶은 자리에 위치시킴

Routes로 감싸지 않는다면 매칭되는 모든 요소를 렌더링

 

Route

path 속성을 지정하여 주소(경로) 설정, 해당 주소에서 보여줄 컴포넌트를 element 속성으로 지정한다

path="*"와 element로 의도하지 않은 페이지에 접근할 경우 제어할 수 있음 

 

4. 주소(path)를 바꿔줄 메뉴 만들기

const Sidebar = () => {
  return (
    <section className="sidebar">
      <Link to="/about">
        <i className="far fa-question-circle"></i>
      </Link>
    </section>
  )
}

Link

경로를 연결해 주는 역할. 페이지 전환을 방지하는 기능이 내장

a 요소는 페이지를 새로 불러옴(처음부터 다시 렌더링= 새로고침)

 

useNavigate

함수 내부에서 주소를 바꿔야 할 때 사용

특정 행동을 했을 때 해당 주소로 이동시켜 주는 역할

function MypageForm() {
  let navigate = useNavigate();

  function handleClick() {
    if(로그인 한 상태) {
        navigate('/mypage');
    } else {
        navigate('/login');	
    }
  }

  return <button onClick={handleClick}>마이페이지</button>;
}
let navigate = useNavigate()

// 뒤로 가기
navigate(-1)
// 앞으로 가기
navigate(1)
// 새로고침
navigate(0)

(참고 historyAPI)

// 뒤로 가기
history.back()
history.go(-1)

// 앞으로 가기
history.forward()
history.go(1)

// 새로고침
history.go(0)

 

5. 라우트(Route)에 연결할 컴포넌트 만들기

- 컴포넌트, 변경할 화면

const About = (props) => {
  return (
    <section className="aboutTwittler">
    // 생략
    </section>
  )
}

 

 

 

 

22.11.28

코스 S2U5

'코드스테이츠(SEB_FE_42)' 카테고리의 다른 글

[React] Local/ Redux state, useEffect, Virtual DOM  (0) 2022.11.30
[React] state, prop  (0) 2022.11.28
[JS] React Intro  (0) 2022.11.25
[Web API] fetch API, axios 라이브러리  (0) 2022.11.24
[JS, Node.js] Promise, callback  (0) 2022.11.23
댓글
공지사항