) => {
+ event.preventDefault();
+
+ loginMutation.mutate(
+ { id, password },
+ {
+ onSuccess: (response: { accessToken: string }) => {
+ // API 호출이 성공했을 경우, useNavigate hook 을 사용하여 이동
+ navigation(from);
+ },
+ onError: () => {
+ alert("로그인 실패!");
+ },
+ }
+ );
+ };
+
+ return (
+
+ {/** 다른 컴포넌트... */}
+
+ );
+}
+```
+
+로그인이 성공했을 경우, 전달한 location 객체 정보를 활용하여 페이지를 이동하는 방식입니다.
+이를 통해 로그인 성공 시, 원래 가고자 했던 페이지로 이동하는 기능 또한 구현할 수 있습니다.
+
+### 새롭게 사용해보고 배운 것 - Outlet
+
+`Outlet` 은 react router dom 에서 제공하는 컴포넌트로
+중첩 라우팅, 중첩 레이아웃 (React 의 children 과 같은) 기능으로 활용할 수 있습니다.
+
+- [react router Outlet docs](https://reactrouter.com/en/main/components/outlet)
+
+공식 문서의 예제를 보면 사용법을 쉽게 이해할 수 있습니다.
+
+```tsx
+function Dashboard() {
+ return (
+
+
Dashboard
+
+ {/* This element will render either when the URL is
+ "/messages", at "/tasks", or null if it is "/"
+ */}
+
+
+ );
+}
+
+function App() {
+ return (
+
+ }>
+ } />
+ } />
+
+
+ );
+}
+```
+
+`/messages`, `/tasks` 로 이동할 경우, 항상 `Dashboard
` 와 함께 띄워지는 것을 볼 수 있습니다.
+`/messages`, `/tasks` router 상위에는 `/` 가 있고, 이 떄 Dashboard 컴포넌트를 출력합니다.
+
+그리고 Dashboard 에서는 내부에서는 `Outlet` 을 사용하여 `/messages`, `/tasks` 로 이동 시
+실행될 컴포넌트를 `Outlet` 의 위치에서 실행합니다.
+이러한 특징으로 인해 React 의 children 과 비슷한 동작이라고 말씀드렸습니다.
+
+그렇다면 이러한 중첩 라우팅, 레이아웃을 제공하는 `Outlet` 을 `Protected Route` 를 구현할 때 어떻게
+사용했을까요? 이는 아래 코드에서 확인할 수 있습니다.
+
+```tsx
+// routes/ProtectedRoute.tsx
+import { useRecoilValue } from "recoil";
+import { Navigate, Outlet, useLocation } from "react-router-dom";
+
+import { isLoginUserSelector } from "../recoil/user";
+
+function ProtectedRoute() {
+ const currentLocation = useLocation();
+ const isLoginUser = useRecoilValue(isLoginUserSelector);
+
+ if (!isLoginUser) {
+ return ;
+ } else {
+ return ;
+ }
+}
+// routes/index.tsx
+import { BrowserRouter, Routes, Route } from "react-router-dom";
+
+import Main from "../pages/Main";
+import Login from "../pages/Login";
+import MyPage from "../pages/MyPage";
+import Dashboard from "../pages/Dashboard";
+import ProtectedRoute from "./ProtectedRoute";
+
+function Routers() {
+ return (
+
+
+ } />
+ } />
+ }>
+ } />
+ } />
+
+
+
+ );
+}
+```
+
+`Outlet` 은 `ProtectedRoute` 컴포넌트에서 사용했습니다.
+로그인이 되었을 때, `` 컴포넌트를 return 합니다.
+
+그리고 Routes 컴포넌트에서는 이러한 `ProtectedRoute` 를 `/my-page`, `/dashboard` 상위의
+Route 로 감싼 형태로 구현되어 있습니다.
+
+우리가 구현한 `ProtectedRoute` 는 로그인이 되지 않았을 때는 login 페이지로,
+로그인이 되었을 땐 원래 이동하고자 했던 페이지로 이동하는 것이 목적입니다.
+이를 `Outlet` 을 통해 구현했습니다.
+로그인이 되었을 땐 `Outlet` 을 사용하여 그 하위에 위치한 Route 컴포넌트를 출력하는 방식으로요.
+
+이렇게 구현하게 될 경우 아래와 같은 장점이 있습니다.
+
+> 1. 다른 Route 에서 ProtectedRoute 의 기능이 필요하다면 동일하게 감싸주면 된다.
+> 2. 적용이 매우 쉽고, 각 컴포넌트(ProtectedRoute, 원래 출력하고자 하는 콤포넌트)는 각자 할일만 할 수 있다.
+> (관심사의 분리)
+
+## 후기
+
+Navigate 의 replace 의 경우, 어떤 경우에 사용하는지는 알고 있었으나 어떻게 동작하는지
+명확히 알고 있지 않았습니다. 이번 기회를 통해 '내가 모호하게 알고 있었구나' 라는 것을 꺠닫기도 했구요.
+아무래도 현업에서 유지보수를 하고 있고, 그렇기에 Protected Route 와 같이 초기에 셋업하는 방식을
+직접 코드로 안써본지 꽤 된터라 리마인드를 확실히 해봤다는 점에서 얻어가는 점이 있다고 생각합니다.
+
+또한 React Router Dom `Outlet` 은 듣기만 했었지 여태 활용해본 적이 없었기에 도움이 많이 되었습니다.
+중첩 라우팅, 레이아웃이라는 것이 어떻게 도움을 줄 수 있는지를 알 수 있었고, 직접 사용하면서
+그 원리를 파악했다는 점에서 좋은 경험이라고 생각합니다.
+_(확실히 직접 사용해봐야 알겠다는 점 또한 다시금 느끼게 되었습니다.)_
+
+기술적인 부분에서 얻어가는 부분도 많았고, 기존 시나리오에서 개발자가 구현하면서 더 생각해봐야할 점을
+고민하는 부분도 도움이 많이 되었습니다. 기획서를 분석하고, 개발하면서 목소리를 내는 것이 중요하기에
+아주 조그마한 스펙에서부터 생각하는 연습을 해봤다는 점에서 좋은 경험이라고 생각합니다.
+
+시나리오대로 구현하고 끝이 아닌, 직접 테스트해보면서 '이건 좀 불편한데?', '다른 곳은 어떻게 되어있지?'
+와 같은 연결된 생각, 솔루션 찾기 등 이를 지속적으로 체득화하는 것을 목표로 연습해볼 생각입니다.
+
+## 레퍼런스
+
+- [react router history docs](https://v5.reactrouter.com/web/api/history)
+- [kakao location replace 포스팅](https://fe-developers.kakaoent.com/2022/221124-router-without-library/#location-replace)
+- [replace method MDN](https://developer.mozilla.org/en-US/docs/Web/API/Location/replace)
+- [react router useLocation hook docs](https://reactrouter.com/en/main/hooks/use-location)
+- [react router Outlet docs](https://reactrouter.com/en/main/components/outlet)
diff --git a/public/images/protectedRoute/back-image.png b/public/images/protectedRoute/back-image.png
new file mode 100644
index 0000000..6a27845
Binary files /dev/null and b/public/images/protectedRoute/back-image.png differ
diff --git a/public/images/protectedRoute/protected-route.png b/public/images/protectedRoute/protected-route.png
new file mode 100644
index 0000000..87a7c41
Binary files /dev/null and b/public/images/protectedRoute/protected-route.png differ
diff --git a/public/images/protectedRoute/replace.png b/public/images/protectedRoute/replace.png
new file mode 100644
index 0000000..f8404ec
Binary files /dev/null and b/public/images/protectedRoute/replace.png differ
diff --git a/public/images/protectedRoute/thumbnail.jpg b/public/images/protectedRoute/thumbnail.jpg
new file mode 100644
index 0000000..546e10e
Binary files /dev/null and b/public/images/protectedRoute/thumbnail.jpg differ