[React] Route / PrivateRoute(ProtectedRoute)

★개발일기★ ㅣ 2022. 12. 26. 13:22

반응형

 

React 에서 Router 를 우선 사용해보자.
Router 를 사용하기 위해 npm 모듈을 설치한다.

npm i react-router-dom

/router/Router.tsx 파일을 작성한다.

import MainLayout from 'components/common-components/Layouts/MainLayout'
import { NotFoundView } from 'components/common-components/NotFoundView'
import Loggin from 'components/component/sign/Loggin
import { BrowserRouter, Routes, Route } from 'react-router-dom'

export default function Router() {
	return (
		<BrowserRouter>
			<Routes>
				{/* { 인증 여부 상관 없이 접속 가능한 페이지} */}
				<Route index element={<MainLayout />} />
				<Route path="/signin" element={<Loggin />} />
				<Route path="/*" element={<NotFoundView />} />
			</Routes>
		</BrowserRouter>
	)
}

 

App.tsx

import { GlobalStyle } from 'components/common-components/GlobalStyle'
import Router from 'router/Router'

function App() {
	return (
		<>
			<GlobalStyle />
			<Router />
		</>
	)
}

export default App

 

Router 에 대한 기본설정은 끝났다. 위의 GlobalStyle 은 styled-componet 에 관한 것이므로, 나중에 리뷰를 해보겠다.
(Router 와 상관 없음)

그러면 Router 에 이제 권한별 ( login / 혹은 기타 필요한 권한들 ) 이 필요할때 라우팅을 어떻게 작업해줘야 할까?

먼저 기본적인 로그인 여부에 관한 예시로 예를 들어보겠다.

/router/ProtectedRoutes.tsx

import { ReactElement } from 'react'
import { Navigate, Outlet } from 'react-router-dom'

interface PrivateRouteProps {
	children?: ReactElement
	authentication: boolean
}

export default function PrivateRoute({
	authentication,
}: PrivateRouteProps): React.ReactElement | null {
     // 로그인 했을 경우 true 
     // 로그인 하지않았을 경우 null or false
	const isAuthenticated = sessionStorage.getItem('isAuthenticated')

	if (authentication) {
		// 인증 필수
		return isAuthenticated === null || isAuthenticated === 'false' ? (
			<Navigate to="/login" />
		) : (
			<Outlet />
		)
	} else {
		// 인증 반드시 필수 x
		return isAuthenticated === null || isAuthenticated === 'false' ? (
			<Outlet />
		) : (
			<Navigate to="/" />
		)
	}
}

 

/router/Router.tsx

import MainLayout from 'components/common-components/Layouts/MainLayout'
import { NotFoundView } from 'components/common-components/NotFoundView'
import Loggin from 'components/component/sign/Loggin'
import { Testrouter } from 'components/component/Testrouter'
import { Counter } from 'features/counter/Counter'
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import ProtectedRoutes from './ProtectedRoutes'

export default function Router() {
	return (
		<BrowserRouter>
			<Routes>
				{/* { 인증 여부 상관 없이 접속 가능한 페이지} */}
				<Route index element={<MainLayout />} />
				<Route path="/signin" element={<Loggin />} />
				<Route path="/*" element={<NotFoundView />} />

				{/* { 인증을 반드시 하지 않아야만 접속이 가능한 페이지} */}
				<Route element={<ProtectedRoutes authentication={false} />}>
					<Route path="/login" element={<Loggin />} />
				</Route>

				{/* { 인증을 반드시 해야지만 접속 가능한 페이지 } */}
				<Route element={<ProtectedRoutes authentication={true} />}>
					<Route path="/test" element={<Testrouter />} />
					<Route path="/counter" element={<Counter />} />
				</Route>
			</Routes>
		</BrowserRouter>
	)
}

 

위와 같이 설정하면 권한별 라우팅 기능이 구현 가능하다.

반응형