이전 글

1. 2022.02.09 - [React] - [ React ] React Router #1

2. 2022.02.10 - [React] - [ React ] React Router #2


URL Parameter

예시 : /profile/kitez

 

Query

예시 : /profile?isMobile=true

 

페이지주소를 정의할 때 유동적인 값을 전달해야 할 경우도 있다. 이때 유동적인 값을 URL parameter나 Query를 통해서 전달을 하는데 일반적으로 특정 아이디 혹은 이름 등을 조회하는 경우에는 URL parameter를 사용하며, 우리가 어떤 키워드를 검색하거나, 페이지에 대한 옵션을 전달하는 경우에는 Query를 사용한다. 


URL parameter

// src/Profile.js

import {useParams} from "react-router-dom";

const data = {
    kitez : {
        name : "장연지",
        description : "애기 개발자"
    },
    arin : {
        name : "오아린",
        description : "얼굴 천재"
    }
};

const Profile = () => {

    const { username }  = useParams();
    const profile = data[username];

    if(!profile){
        return <div><h1>존재하지 않는 사용자입니다.</h1></div>;
    }
    return(
        <div>
            <h1>{username}({profile.name})</h1>
            <h4>description : {profile.description}</h4>
        </div>
    );
};

export default Profile;

 

// src/App.js

import './App.css';
import {Link, Route, Routes, useRoutes} from "react-router-dom";
import Home from "./Home";
import About from "./About";
import Profile from "./Profile";


function App() {
    let element = useRoutes([
        { path : "/", element : <Home /> },
        { path : "/home", element : <Home /> },
        { path : "/about", element : <About /> }
    ]);

  return (
      //element
    <div className="App">
        <h1> 라우팅 프로젝트 </h1>

        <ul>
            <li>
                <h2><Link to="/">Home</Link></h2>
            </li>

            <li>
                <h2><Link to="/about">About</Link></h2>
            </li>

            <li>
                <h2><Link to="/profile/kitez">Profile : kitez</Link></h2>
            </li>

            <li>
                <h2><Link to="/profile/arin">Profile : arin</Link></h2>
            </li>
        </ul>
        <Routes>
            <Route path='/' element={<Home />} />
            <Route path="/about" element={<About />} />
            <Route path="/profile/:username" element={<Profile />} />
        </Routes>
    </div>
  );
}

export default App;

 

실행결과

 

→ react-router-dom library의 useParams 라는 Hook을 사용하여 /profile/:username 의 파라미터 값을 읽어와 해당 parameter값에 해당하는 유저의 정보를 보여준다. 

 


URL Query

// src/About.js

import {useSearchParams} from "react-router-dom";

const About = () => {

    const [ searchParams ] = useSearchParams();
    const query = searchParams.get('detail');

    return(
        <div>
            <h1>I'm About!</h1>
            <h3>소개</h3>
            { query !== null ? <p>query is {query}</p> : <p>query is null</p>}
        </div>
    );
};

export default About;

 

실행결과

 

 

useSearchParams

useSearchParams는 Array()를 반환한다.  

useSearchParams()의 반환값을 아래 코드를 통해 콘솔에서 Array()인 것을 확인할 수 있다. 

우리가 사용할 것은 0 번째 index에 위치하는 URLSearchParams이기 때문에 대괄호 안에 객체를 받아올 변수 이름을 적어주어야 한다. 

 ex) const [ searchParams ] = useSearchParams();

    const q = useSearchParams();
    console.log(q);

 

parameter값이 여러개인 경우 parameter의 value와 done을 forEach method를 통해서 확인할 수 있다. 

    const [ searchParams ] = useSearchParams();
    // useSearchParams() 반환값이 Array
    // 0 : URLSearchParams
    // 1 : function
    

    searchParams.forEach( (done, value) => {
        console.log( value + " : "+ done);
    })

 

localhost:3000/about?detail=true&isMobile=false 인 경우 console 결과

728x90

이전 글

1. 2022.02.09 - [React] - [ React ] React Router


react-router-dom :: <Link> component

react-rotuer-dom library의 <Link> component는 html의 <a> tag와 같이 연결된 주소로 페이지를 전환시켜준다.

 

<a> tag의 경우 페이지를 전환하는 과정에서 새로운 페이지를 불러오면서 애플리케이션이 가지고 있던 모든 상태를 날려버려 렌더링되어있던 모든 컴포넌트들도 모두 사라지고 페이지를 모두 처음부터 다시 렌더링하게 된다.

 

그렇기 때문에 react-rotuer-dom library를 사용하여 라우팅 하는 경우에는 <a>태그로 이루어져 있지만 페이지 전환을 방지하는 기능이 내장되어 있는 <Link> component 를 사용하여 페이지 전환을 해야한다. 

 

<Link> component를 사용하여 페이지를 전환하면 페이지를 새로 불러오지 않고 애플리케이션은 유지를 한 상태에서 HTML 5 History API를 사용하여 페이지의 주소만 변경해준다. 

 

<Link> Component 사용방법

<Link to="주소">내용</Link>

 

 App.js

// src/App.js

import './App.css';
import {Link, Route, Routes} from "react-router-dom";
import Home from "./Home";
import About from "./About";


function App() {
  return (
    <div className="App">
        <h1> 라우팅 프로젝트 </h1>

        <ul>
            <li>
                <h2><Link to="/">Home</Link></h2>
            </li>

            <li>
                <h2><Link to="/about">About</Link></h2>
            </li>
        </ul>
        <Routes>
            <Route path="/" element={<Home />}>Home</Route>
            <Route path="/about" element={<About />}>About</Route>
        </Routes>
    </div>
  );
}

export default App;

 

실행화면

 

 

728x90

React Router 사용법

1.  프로젝트 생성 및 라이브러리 설치

npx create-react-app react-rotuer-tutorial // cra react project 생성
cd react-router-tutorial // 생성한 project dir로 이동
npm install react-router-dom // react-router-dom 라이브러리 설치

 

2.  프로젝트에 라우터 적용

// src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import {BrowserRouter} from "react-router-dom";

ReactDOM.render(
    <BrowserRouter>
        <App />
    </BrowserRouter>,
  document.getElementById('root')
);

reportWebVitals();

 

3.  라우팅할 페이지 만들기

// src/Home.js

const Home = () => {
    return(
        <div>
            <h1>I'm home!</h1>
        </div>
    )
}

export default Home;
// src/About.js

const About = () => {
    return(
        <div>
            <h1>I'm About!</h1>
        </div>
    )
}

export default About;

 

4.  Routes, Rotue 컴포넌트로 특정 주소에 컴포넌트 연결

// src/App.js

import logo from './logo.svg';
import './App.css';
import {Route, Routes} from "react-router-dom";
import Home from "./Home";
import About from "./About";


function App() {
  return (
    <div className="App">
        <h1> 라우팅 프로젝트 </h1>

        <Routes>
            <Route path="/" element={<Home />}>Home</Route>
            <Route path="/about" element={<About />}>About</Route>
        </Routes>
    </div>
  );
}

export default App;

 

5.  라우팅 잘 되는지 확인하기

npm start

 

localhost:3000

 

localhost:3000/about


react-router-dom v6 부터 문법이 조금 바뀌었다. 위에서 설명한 문법은 v6 문법이다. 

728x90

전통적인 웹 페이지

전통적인 웹 페이지는 아래의 그림과 같이 동작한다.

사용자가 다른 페이지로의 이동을 요청하면 서버에서 페이지에 해당하는 html 파일로 응답을 해주고, 브라우저가 해당 파일을 받아 해석한 후 사용자에게 보여주는 방식으로 사용자에게 보여주는 화면을 서버측에서 준비를 했다. 

요즘에는 웹에서 제공되는 정보가 매우 많기 때문에 새로운 화면을 보여 주어야 할 때마다 서버 측에서 모든 페이지를 준비하게 되면 성능상의 문제가 발생할 수 있다. 

ex)

1. 트래픽 과다

2. 사용자가 동시간대에 몰릴경우 서버에 무리를 줄 수 있다.

3. 새로운 페이지로 이동( 화면 전환 ) 할 때 마다 새로운 html 파일을 계속해서 유저와 서버가 요청/응답 하게 되면 상태 유지가 번거로울 뿐만 아니라 불필요한 페이지 로딩이 발생하게 되어 비효율적이다. 

 

► React같은 라이브러리 or 프레임워크를 사용하여 유저의 브라우저가 뷰 렌더링을 담당하도록 하면 이러한 성능상의 문제를 해결할 수 있다. 

 

Single Page Application

SPA는 이름 그래도 하나의 페이지로 이루어진 애플리케이션이라는 의미이다. SPA의 동작 방법은 아래의 그림과 같다.

사용자가 처음 서버에 접속 요청을 보내면 html 파일과 함께 정적 리소스 파일들을 함께 보내준다. 이후에 유저가 서버에게 요청을 하면 해당 요청에 필요한 JSON 파일들만 응답해주며 브라우저는 서버에게 받은 JSON파일을 해석하여 변경된 사항만을 반영하여 유저에게 보여준다. 

► SPA의 경우 페이지는 한 종류이지만, 해당 페이지에서 로딩된 JS와 현재 사용자 브라우저의 주소 상태에 따라 다양한 화면을 보여줄 수 있다. ( 다른 주소에 다른 화면을 보여주는 것을 라우팅 이라고 한다. ) 

 

[ + ] 리액트 라우팅 라이브러리 종류 

1. react-router

2. reach-router

3. Next.js .. 등

 

SPA의 단점

1. SPA의 단점은 앱의 규모가 커지면 JS 파일의 크기가 너무 커진다는 것이다. ( 페이지에 첫 방문 시 정적 리소스들을 html 파일과 함께 모두 보내주기 때문에 )  페이지 로딩 시 사용자가 실제로 방문하지 않을 수도 있는 페이지의 JS도 함께 불러오게되기 때문이다. 

→ 코드 스플리팅 ( code spliting ) 을 사용하면 라우트별로 파일들을 나누어서 트래픽과 로딩 속도를 개선할 수 있다. 

 

2. SEO ( Search Engine Optimization ) 검색엔진최적화 문제

JS를 실행하지 않는 일반 크롤러에서는 페이지의 정보를 제대로 수집해가지 못하여 검색 엔진의 검색 결과에 페이지가 나타나지 않을 수도 있다. → 검색엔진에 나타나지 않는다는 것은 큰 문제 ( 광고, 홍보, 유저가 구글, 네이버 등 포탈에서 검색을 통해 유입되지 못함. )→ SSR ( Server Side Rendering ) 을 통해 해결할 수 있다. 

 

3. JS가 실행될 때까지 페이지가 비어 있기 때문에 JS 파일이 로딩되어 실행되는 짧은 시간 동안 흰 페이지가 나타날 수 있다. → SSR ( Server Side Rendering ) 을 통해 해결할 수 있다. 

 

 

728x90

+ Recent posts