- Link 컴포넌트
- 클릭 시 바로 페이지를 이동하기 때문에, 조건 없이 페이지를 이동할 때 적합합니다.
- Nav Bar의 메뉴 혹은 Aside Menu 등 바로 페이지를 이동하는 경우 사용하는 것이 좋습니다.
- useNavigate hook
- 조건에 따라 페이지를 전환 해야할 때 사용하기 적합합니다.
- 로그인 버튼 클릭 시 백엔드 API 로 데이터를 전송하는 작업을 하거나, 인증 혹은 인가가 필요한 경우, 혹은 로그인 작업 이후 응답 메세지에 따른 분기 처리를 해야 하는 상황일 때, useNavigate를 사용하는 것이 좋습니다.
개요
SAP
가 무엇인지 알아보고, 웹에서 화면을 전환하는Routing
, 스타일링을 편하게 할 수 있는CSS 전처리기
에 대해서 배워봅시다.
SPA
가 무엇인지 설명할 수 있다.react-router-dom
을 이용해 Router Component
를 구현할 수 있다.react-router-dom
을 이용해 Routing
을 하는 방법 2가지와 차이점에 대해 설명할 수 있다.<Link> Component
와 <a> tag
의 차이점에 대해 설명할 수 있다.css 전처리기
의 역할에 대해 설명할 수 있다.sass
에서 제공하는 문법을 이용하여 css
파일을 scss
파일로 변환할 수 있다.경로
, Routing은 경로를 찾는 행위
라는 의미를 가지고 있는데, Router는 Routing을 해주는 '도구' 라고 할 수 있습니다.react-router-dom
은 React에서의 라우팅을 위해 가장 많이 사용되는 라이브러리 입니다.$ npm install react-router-dom
// package.json
{
"name": "react-project",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"react-router-dom": "^6.3.0",
"react-scripts": "3.4.3"
}
}
package.json
의 dependencies
항목에서 해당 패키지 명과 버전이 잘 추가되었는지 반드시 확인해 줍니다.npm start
를 터미널에 입력하면, 최초 화면에서 App 컴포넌트의 내용을 볼 수 있게 됩니다.- Router.js 파일은 `src` 폴더 안 `index.js` 와 같은 위치에 생성하고, App.js와 App.css 파일은 제거해줍니다.
// Router.js
import React from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
react-router-dom
패키지에는 여러 컴포넌트가 포함되어 있고, 이 중에서 Router 컴포넌트를 구현하기 위해서는 BrowserRouter, Routes, Route 컴포넌트를 import 해야 합니다.// Router.js
import React from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
const Router = () => {
return (
<BrowserRouter> // 1
<Routes> // 2
<Route path='/' element={<Components />} /> // 3
</Routes>
</BrowserRouter>
);
};
export default Router;
import 한 3개의 컴포넌트를 이용해서 Router 컴포넌트를 구현해보겠습니다.
1. BrowserRouter
컴포넌트로 전체를 감싸줍니다.
2. BrowserRouter
컴포넌트의 자식 요소로 Routes
컴포넌트를 넣어줍니다.
3. Routes
컴포넌트의 자식 요소로 Route
컴포넌트를 넣어줍니다.
Router 컴포넌트를 구성하는 각각의 컴포넌트들은 어떤 역할을 하는 지 알아봅시다.
1. BrowserRouter : 주소 변경에 대해 다양한 편의 기능을 제공해주는 컴포넌트. 대표적인 기능으로는 페이지가 새로고침 되지 않ㅎ아도 주소 변경이 가능하게 하는 기능이 있습니다.
2. Routes : 여러 Route를 감싸서 그 중 규칙이 일치하는 라우트 단 하나만을 렌더링 시켜주는 역할을 합니다.
3. Route : 형식을 보면 html 에서 사용한 태그의 형식과 유사합니다.
예를 들어 input 태그에서 type 속성을 사용했던 것처럼 `Route` 컴포넌트에서는 path와 element 속성을 사용하고 있습니다.
- `path` : 경로를 속성하는 속성
- `element` : path 속성에서 설정한 경로로 이동 했을 때, 어떤 컴포넌트를 보여줄 지 결정하는 속성 (화면에 그려지는 UI를 담은 컴포넌트)
// Router.js
import React from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Login from './pages/Login/Login'; ⌉
import Signup from './pages/Signup/Signup'; ⎮ // 1
import Main from './pages/Main/Main'; ⌋
const Router = () => {
return (
<BrowserRouter>
<Routes>
<Route path='/' element={<Login />} /> ⌉
<Route path='/signup' element={<Signup />} /> ⎮ // 2
<Route path='/main' element={<Main />} /> ⌋
</Routes>
</BrowserRouter>
);
};
export default Router;
Route
컴포넌트의 path 속성에 따라 화면에 그려줄 UI를 담은 컴포넌트를 import 합니다.
Route
컴포넌트의 path 속성을 설정해 주고, 설정한 경로(url) 로 이동했을 때, 화면에 그려질 UI를 담은 컴포넌트를 element 속성에 설정합니다.
http://localhost:3000
이라는 주소를 기준으로 했을 때, url이 http://localhost:3000
이라면 Login 컴포넌트를 내용에 화면을 그려주고, url이 http://localhost:3000/signup
일 때는 Signup 컴포넌트의 내용을 화면에 그려주게 됩니다./
는 디폴트 값으로 경로가 지정되지 않은 경우와 같기 때문에, url에서 아무런 경로를 지정해주지 않은 경우에는 Route
컴포넌트의 path 속성에서 /
을 찾아 일치하는 element의 컴포넌트를 그려주기 때문입니다.// Router.js
import React from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Nav from './components/Nav/Nav';
import Footer from './components/Footer/Footer';
import Login from './pages/Login/Login';
import Signup from './pages/Signup/Signup';
import Main from './pages/Main/Main';
const Router = () => {
return (
<BrowserRouter>
<Nav /> // nav 컴포넌트
<Routes>
<Route path='/' element={<Login />} />
<Route path='/signup' element={<Signup />} />
<Route path='/main' element={<Main />} />
</Routes>
<Footer /> // footer 컴포넌트
</BrowserRouter>
);
};
export default Router;
Routes
컴포넌트는 여러 Route를 감싸서 그 중 규칙이 일치하는 라우트 단 하나만을 렌더링 시켜줍니다.Routes
컴포넌트의 밖에 위치 시켜봅시다. Nav
와 Footer
컴포넌트는 특정 경로에 따라 보여지는 것이 아니라 어떤 경로가 오더라도 항상 화면에 보여지게 됩니다.// index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import Router from './Router';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Router />);
npm start
를 통해 화면을 띄우고 Router 컴포넌트에서 설정해 주었던 path 값을 직접 url에 입력해서 UI가 변경되는 것을 확인하면 됩니다.// Login.js
import React from 'react';
import { Link } from 'react-router-dom';
const Login = () => {
return <Link to='/signup'>회원가입</Link>;
};
export default Login;
react-router-dom
에서 제공하는 컴포넌트 중 Link
컴포넌트를 이용해 라우팅 기능을 구현할 수 있습니다. react-router-dom
으로부터 Link 컴포넌트를 import해서 JSX 내부의 원하는 곳에 사용할 수 있습니다.to
라는 속성에 /signup
이라는 경로가 적혀 있습니다./signup
이라는 경로로 이동하게 되고, Route 컴포넌트의 path 값 중 일치하는 경로를 찾아 해당 컴포넌트를 화면에 그려주게 됩니다.[React] Link vs a
1. a 태그 : 페이지 이동 시 서버로부터 매번 새로운 페이지를 요청해서 받아 오게 됩니다.
그렇다면 현재 화면에서 몇 가지가 랜더링 되어야 하는 작업에서도 전체 화면을 매번 다시 렌더링 하기 때문에 비효율적으로 동작하게 됩니다.
react-router-dom
에는 Link 컴포넌트 외에도 라우팅을 구현할 수 있게 해주는hook
이 있습니다. 여기서 hook은 함수 컴포넌트에서 다루지 못했던 기능들을 구현할 수 있게 도와주는 함수입니다.
// Login.js
import React from 'react';
import { useNavigate } from 'react-router-dom'; // 1
const Login = () => {
const navigate = useNavigate(); // 2
const goToMain = () => { // 3
navigate('/main');
};
return (
<button className='loginBtn' onClick={goToMain}> // 4
로그인
</button>
);
}
export default Login;
react-router-dom
에서 useNavigate
를 import 합니다.useNavigate
함수를 실행하고, 해당 함수가 반환한 결과를 navigate
라는 변수에 할당합니다. 여기서 useNavigate가 반환하는 값은 페이지를 이동하는 함수이기 때문에, 결국 navigate
변수는 페이지를 이동하는 함수가 됩니다.navigate
함수가 호출되도록 하고, 인자에는 이동할 경로를 넣어줍니다. 예를 들어 클릭 이벤트가 발생했을 때 goToMain
이라는 함수를 호출하고, 함수 내부에서 navigate('main')
을 호출하면서 Main 페이지로 이동하는 로직 입니다.onClick
이벤트를 생성하고, 이벤트 발생 시 실행될 함수를 넣어줍니다. React에서는 JSX 특징을 이용해서 이벤트를 걸어주고 싶은 태그에 속성을 설정하듯 직접 적용할 수 있습니다.Link 컴포넌트와 useNavigate hook
- Link 컴포넌트는 to 속성을 통해 무조건 해당 url로 이동하게끔 해주기 때문에 어떠한 조건에 의해 사용될 수 없습니다.
// 실제 활용 예시
const goToMain = () => {
if(response.message === 'valid user'){
navigate('/main');
} else {
alert('가입된 회원이 아닙니다. 회원가입을 먼저 해주세요.')
navigate('/signup');
}
}
navigate
는 함수의 호출 형태로 경로 이동을 하기 때문에 코드 상에서 조건에 따라 인자를 다르게 부여해 다른 경로로 이동할 수도 있고, 호출 자체를 안할 수도 있습니다.