티스토리 뷰

codestates/section2

Unit5 - [React] React SPA

나아눙 2023. 1. 24. 23:00

업데이트에 필요한 데이터만 받아 JavaScript가 이 데이터를 조작하여 HTML요소를 생성하여 화면에 보여주는 방식이 개발

 

SPA(Single-Page Application)

화면을 업데이트하기 위해 필요한 데이터만 서버에서 전달받아 브라우저에서 해당하는 부분만 업데이트하는 방식으로 작동하는 웹 애플리케이션이나 웹 사이트

 

SPA 장,단점

장점 : 사용자와의 행동에 빠르게 반응

서버에서는 요청 받은 데이터만 넘겨주면 되기 때문에 서버 과부하 문제가 현저하게 줄어둠

전체 페이지를 렌더링 할 필요가 없기 때문에 나은 사용자 경험 제공

 

단점 : JavaScript 파일의 크기가 크기 때문에 기다리는 시간으로 인해 첫화면 로딩시간이 길어진다.

검색엔진 최적화가 좋지 않다.

검색 로봇은 자료를 수집할 때에 웹 페이지의 URL은 물론이고 HTML 문서 내의 각종 태그나 링크 등을 분석한다.

SPA는 HTML이 거의 비어있다 보니 검색 로봇이 충분한 자료를 수집하지 못한다.

 

Wireframe

Wireframe : 웹페이지 레이아웃과 UI 요소 등에 대한 뼈대(Mockup : 데모 시연, 평가를 위한 최소한의 기능을 담은  모형(직관적으로 이해학 쉽게 디자인)

 

React Router 

React Router를 이용해 React SPA개발 방법

다른 주소에 따라 다른 뷰를 보여주는 과정을 "경로에 따라 변경한다."라는 의미로 라우팅(Routing)

xx.com/

xx.com/signup

xx.com/mypage

라우팅을 위해 React Router라는 라이브러리를 가장 많이 사용한다.

 

React Router 주요 컴포넌트

BrowserRouter(라우터 역할) - History API를 사용하여 UI를 URL과 동기화된 상태를 유지하는 역할

Routes와 Route(경로 매칭)  - Routes :Route로 생성된 자식 컴포넌트 중에서 매칭되는 첫번째 Route를 렌더링하는 역할

                                                Route : 경로지겅

Link(경로 변경) - 사용자를 원하는 경로로 이동시켜주는 역할

 

Import는 필요한 모듈을 불러오는 역할로 비구조화 할당(destructuring assignment)과 비슷하게 이용

import {BrowserRoutes,Routes,Route,Link} from "react-router-dom";

 

npx create-react-app routemake //routemake 폴더에 React App 설치

cd routemake

npm install react-router-dom@^6.3.0 //react-router 라이브러리 설치

 

실습

1.개발환경

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

2. 라우터 준비

페이지 표시하는 컴포넌트

 

function signup() {

    return <h1>signup</h1>

}

 

function Login(){

  return <h1>Login</h1>

}

 

3. 메뉴 준비

function App () {
  return (
      <div>
        <nav>
          <ul>
            <li>
              signup
            </li>
            <li>
              Login
            </li>
          </ul>
        </nav>
      </div>
  )
}

export default App;

4. 주소에 따라 페이지뷰 다르게 만들기

App.js 에 라우팅을 하기 위한 React Router의 주요 컴포넌트를 세팅

3개의 컴포넌트를 주소에 따라 다르게 만든다(주소에 따른 다른페이지 구현)

function App () {
  return (
    <BrowserRouter>
      <div>
        <nav>
          <ul>
            <li>
              signup
            </li>
            <li>
             Login
            </li>
          </ul>
        </nav>
      </div>
    </BrowserRouter>
  )
}

export default App;

index.js (React Version 18 기준)

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';

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

Routes,Route

<Routes> 컴포넌트는 여러 <Route> 컴포넌트를 감싸서 그중 경로가 일치하는 단 하나의 라우터만 렌더링을 시켜주는 역할

<Route> 컴포넌트는 path 속성을 지정하여 해당 path 에서 어떤 컴포넌트를 보여줄지 정한다.

<Link> 컴포넌트가 정해주는 URL 경로와 일치하는 경우에만 작동

 

function App () {
  return (
   <BrowserRouter>
      <div>
        <nav>
          <ul>
            <li>
              signup
            </li>
            <li>
              Login
            </li>
          </ul>
        </nav>

    {/* 주소 경로와 아까 만든 3개의 컴포넌트를 연결해 줍니다. */}
       {/* Routes 컴포넌트는 Route 컴포넌트들을 감싸고 있어야 합니다. */}
        <Routes>
          {/* 경로는 path로 컴포넌트는 element로 연결해 줍니다. */}
          <Route path="/" element={<Home />} /> 
          <Route path="/Login" element={<MyPage />} /> 
        </Routes>
      </div>
   </BrowserRouter>
  )
}

export default App;

Link

경로를 연결해 주는 역할을 하는 컴포넌트

애플리케이션을 그대로 유지,HTML5 History API를 이용해 페이지의 주소만 변경

ReactDOM으로 렌더를 시키게 되면 <Link> 컴포넌트는 <a> 요소로 바뀌게 된다.

<a> 요소는 새로고침 현상이 일어난다.

하지만 <Link> 컴포넌트는 페이지 전환을 방지하는 기능이 내장-> SPA를 구현할수 있다.

function App() {
  return (
    <BrowserRouter>
      <div>
        <nav>
          <ul>
            <li>
              <Link to="/">signup</Link>{/* Link 컴포넌트를 이용하여 경로를 연결합니다 */}
            </li>
            <li>
              <Link to="/mypage">Login</Link>
            </li>
          </ul>
        </nav>

         <Routes>
          <Route path="/" element={<signup />} /> 
					{/* 경로는 path로 컴포넌트는 element로 연결해 줍니다. */}
          <Route path="/Login" element={<Login />} /> 
        </Routes>
      </div>
    </BrowserRouter>
  );
}

npm run start로 실행

 

css에서 <router-link>태그에서 밑줄을 없애고 싶었다.

Link{

 text-decoration:none;

}을 했더니 적용이 되지 않았다.

HTML에서는 <router-link> 라는 태그를 <a> 태그로 인식한다는 것을 알게 되었다.

a{

 text-decoration:none;

}을 했더니 적용이 되었다.

 

app.js

/*import logo from './logo.svg';*/
import './App.css';

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

/*function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}*/

function App () {
  return (
    <BrowserRouter>
      <div>
        <nav>
          <ul>
           <li>
              <Link to="/">Home</Link>{/* Link 컴포넌트를 이용하여 경로를 연결합니다 */}
           </li>
           <li>
              <Link to="/mypage">MyPage</Link>
           </li>
           <li>
              <Link to="/dashboard">Dashboard</Link>
           </li>
          </ul>
        </nav>
        <Routes>
          {/* 경로는 path로 컴포넌트는 element로 연결해 줍니다. */}
          <Route path="/" element={<Home />} /> 
          <Route path="/mypage" element={<MyPage />} /> 
          <Route path="/dashboard" element={<Dashboard />} />
        </Routes>

      </div>
      </BrowserRouter>
  )
}

function Home() {
  return <h1>Home</h1>;
}

function MyPage() {
  return <h1>MyPage</h1>;
}

function Dashboard() {
  return <h1>Dashboard</h1>;
}

export default App;

app.css

.App {
  text-align: center;
}

ul{
  list-style-type : none;
  display:flex;
  justify-content: space-between;
  margin:20px;
  padding: 20px;
  
}
li{
  border: 20px;
  margin: 10px;
  padding:50px;
  border: 1px solid;
  background-color: antiquewhite;
}

a{
  text-decoration:none;
  font-size: 30px;
}
h1{
  text-align:center;
  font-size: 50px;
}

결과

'codestates > section2' 카테고리의 다른 글

React Twittler State & Props 과제  (0) 2023.01.27
Unit6 - [React] React State & Props  (0) 2023.01.26
Unit5 - [React] React SPA 과제  (0) 2023.01.25
Unit4 - [React] Intro  (0) 2023.01.20
Unit3 - [JS/Node] 비동기  (0) 2023.01.18
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함