2 minute read

2022.11.28

💡 React SPA

📌 SPA [ Single Page Application ]

서버로부터 완전한 새로운 페이지를 불러오지 않고 페이지 갱신에 필요한 데이터만 받아 그 정보를 기준으로 현재의 페이지를 업데이트함으로써 사용자와 소통하는 웹 어플리케이션이나 웹 사이트를 의미한다.

ex ) Youtube에서 동영상을 재생하고 다른 요청을 할 수 있는 것

장점

  • 전체 페이지가 아닌 필요한 부분의 데이터만 받아올 수 있어 빠르다
  • 서버는 요청 받은 데이터만 넘겨주기에 과부하 문제가 현저히 줄어든다.
  • 전체 페이지를 렌더링 하지 않아도 된다. ( 더 나은 유저경험 제공 )

단점

  • JavaScript 파일의 크기가 크다. ( 첫 화면 로딩 시간이 길어진다. )
  • 검색 엔진 최적화가 안좋다.

📌 Routing

SPA는 하나의 페이지를 가지고 있지만 사실 한 종류의 화면만 사용하지 않는다.

스크린샷 2022-11-29 17 34 55

이렇게 다른 주소에 따라 다른 뷰를 보여주는 과정을 Routing이라고 한다.

React에는 이 기능이 내장되어 있지 않기때문에 React Router를 사용해야 한다.

React Router의 주요 컴포넌트

<BrowserRouter>  // router
  <Routes>			// route matchers
    <Route>			// route matchers
      <Link>		// route changers

이 컴포넌트들을 사용하기 위해서는 React Router를 라이브러리에서 따로 불러와야 한다.

터미널을 통해 설치

npm install react-router-dom@^6.3.0

import로 라이브러리 불러오기

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

이렇게 하면 React Router를 사용하여 SPA를 구현하기 위한 모든 준비는 끝났다.

이제 과제를 통해 이를 활용하자

👨🏻‍💻React-Twittler-SPA

구현과제

ezgif com-gif-maker

📍 App.js

const App = () => {
  return (
    <BrowserRouter>
    <div>
      {/* TODO - BrowserRouter 컴포넌트를 작성합니다. */}
      <div className="App">
        <main>
          <Sidebar />
          <section className="features">
            {/* TODO - Routes와 Route 컴포넌트를 이용하여 경로(path)를 설정하고 Tweets, Mypage, About 컴포넌트를 연결합니다. */}
        <Routes>
          <Route path='/' element={<Tweets />}/>
          <Route path='/about' element={<About />}/>
          <Route path='/mypage' element={<MyPage />}/>
        </Routes>
          </section>
        </main>
      </div>
    </div>
    </BrowserRouter>
  );
};

📍Tweets.js

<ul className="tweets">
  {dummyTweets.map((tweet) => {
    return (
		<li className="tweet" key={tweet.id}>
			<div className="tweet__profile">
         <img src={tweet.picture} />
       </div>
       <div className="tweet__content">
         <div className="tweet__userInfo">
         	 <span className="tweet__username">{tweet.username}</span>
           <span className="tweet__createdAt">{tweet.createdAt}</span>
          </div>
          <div className="tweet__message">{tweet.content}</div>
        </div>
      </li>
      )
      })}
</ul>
{/* TODO - Footer 컴포넌트를 작성합니다. */}
<Footer />

📍Mypage.js

			<ul className="tweets__mypage">
        {/* TODO : dummyTweets중 kimcoding 이 작성한 트윗 메세지만 있어야 합니다. */}
        {filteredTweets.map((tweet) => {
          return(
            <li className="tweet" key={tweet.id}>
            <div className="tweet__profile">
              <img src={tweet.picture} />
            </div>
            <div className="tweet__content">
            <div className="tweet__userInfo">
              <span className="tweet__username">{tweet.username}</span>
              <span className="tweet__createdAt">{tweet.createdAt}</span>
            </div>
            <div className="tweet__message">{tweet.content}</div>
          </div>
        </li>
          )
        })}
        
      </ul>
      <Footer />

📍Sidebar.js

const Sidebar = () => {
  const navigate = useNavigate();
  const goBack = () => {
    navigate(-1)
  }
  return (
    <section className="sidebar">      
      {/* TODO : About 메뉴 아이콘과 Mypage 메뉴 아이콘을 작성하고 Link 컴포넌트를 이용하여 경로(path)를 연결합니다. */}
        <Link to='/'>
          <i className="far fa-comment-dots"></i>
        </Link>
        <Link to='/about'>
          <i className="far fa-question-circle"></i>
        </Link>
        <Link to='/mypage'>
          <i className="far fa-user"></i>
        </Link>
        <a><i onClick={goBack} className="fas fa-undo"></i></a>
    </section>
  );
};

뒤로가기 기능까지 구현해보았다. 사실 이외에도 많은 코드들이 있지만 중점적인 것 위주로만 포스팅해보았다.

스크린샷 2022-11-29 17 56 57

Comments