๋ค์ด๊ฐ๋ฉฐ
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๋ค ๋ณด๋ฉด โ๋ค๋ก๊ฐ๊ธฐโ ๋ฒํผ์ ๊ตฌํํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ํนํ ์์ธ ํ์ด์ง์์ ๋ชฉ๋ก์ผ๋ก ๋์๊ฐ๋ ๋ฒํผ์ ๊ฑฐ์ ํ์์ฃ .
๊ทธ๋ฐ๋ฐ ๋จ์ํ navigate(-1)๋ก ๊ตฌํํ๋ฉด ๋ฌธ์ ๊ฐ ์๊น๋๋ค. URL์ ํตํด ์์ธ ํ์ด์ง์ ์ง์ ์ ๊ทผํ ๊ฒฝ์ฐ, ๋ค๋ก๊ฐ๊ธฐ๋ฅผ ๋๋ฅด๋ฉด ๋ธ๋ผ์ฐ์ ๋น ํ์ด์ง๋ ์ด์ ์ ๋จธ๋ฌผ๋ ๋ ์ ํ ๋ค๋ฅธ ์ฌ์ดํธ๋ก ์ด๋ํ๊ฒ ๋๊ฑฐ๋ ์.
์ด ๊ธ์์๋ React Router 7์ location.key๋ฅผ ํ์ฉํด์, ์ํฉ์ ๋ง๊ฒ ๋์ํ๋ ๋๋ํ ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๊ณต์ ํฉ๋๋ค.
๋ฌธ์ ์ํฉ
์ ๊ฐ ๋ง๋ค๊ณ ์๋ ์๋น์ค์๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๊ฐ ์์์ต๋๋ค:
/books- ์ฑ ๋ชฉ๋ก ํ์ด์ง/books/:id- ์ฑ ์์ธ ํ์ด์ง
์๋๋ฆฌ์ค 1. ์ ์์ ์ธ ํ๋ฆ
๋ชฉ๋ก ํ์ด์ง(/books)
โ ์์ธ ํ์ด์ง ํด๋ฆญ(/books/123)
โ ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ ํด๋ฆญ
โ ๋ชฉ๋ก ํ์ด์ง(/books)๋ก ๋ณต๊ท โ
์ด ๊ฒฝ์ฐ๋ navigate(-1)๋ง์ผ๋ก๋ ์๋ฒฝํ๊ฒ ๋์ํฉ๋๋ค.
์๋๋ฆฌ์ค 2. ์ง์ ์ ๊ทผ
URL์ ํตํด ์์ธ ํ์ด์ง ์ง์ ์ ๊ทผ(/books/123)
โ ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ ํด๋ฆญ
โ ??? โ
๋ฌธ์ ๋ ์ด ๊ฒฝ์ฐ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ํ์คํ ๋ฆฌ์ ๋ญ๊ฐ ์๋์ง์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋๋ค.
- ๋ค๋ฅธ ์ฌ์ดํธ์์ ๋งํฌ๋ฅผ ํ๊ณ ์๋ค๋ฉด โ ๊ทธ ์ฌ์ดํธ๋ก ๋์๊ฐ
- ์ฃผ์์ฐฝ์ URL์ ์ง์ ์ ๋ ฅํ๋ค๋ฉด โ ๋ธ๋ผ์ฐ์ ๋น ํ์ด์ง(about:blank)
์ฌ์ฉ์ ์ ์ฅ์์๋ โ๋ค๋ก๊ฐ๊ธฐ๋ฅผ ๋๋ ๋๋ฐ ์๋น์ค๋ฅผ ๋ฒ์ด๋๋ฒ๋ฆฐโ ๋ ์ฉํ๋ ๊ฒฝํ์ด ๋ฉ๋๋ค.
ํด๊ฒฐ์ฑ : location.key๋ฅผ ํ์ฉํ ์กฐ๊ฑด๋ถ ๋ค๋น๊ฒ์ด์
React Router๋ ์ด๋ฐ ์ํฉ์ ๊ตฌ๋ถํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ก location.key์
๋๋ค.
import { useNavigate, useLocation } from "react-router";
export default function BookDetail() {
const navigate = useNavigate();
const location = useLocation();
const handleBackClick = () => {
if (location.key === "default") {
// ์ง์ ์ ๊ทผํ ๊ฒฝ์ฐ: ๋ชฉ๋ก ํ์ด์ง๋ก ์ด๋
navigate("/books");
} else {
// ํ์คํ ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ: ๋ค๋ก๊ฐ๊ธฐ
navigate(-1);
}
};
return (
<div>
<button onClick={handleBackClick}>โ ๋ค๋ก๊ฐ๊ธฐ</button>
<h1>์ฑ
์์ธ ์ ๋ณด</h1>
{/* ... */}
</div>
);
}
์ด์ ๋ ์๋๋ฆฌ์ค ๋ชจ๋ ์๋ฒฝํ๊ฒ ๋์ํฉ๋๋ค.
- ๋ชฉ๋ก์์ ์๋ค๋ฉด โ
navigate(-1)๋ก ๋ชฉ๋ก์ผ๋ก ๋ณต๊ท - URL๋ก ์ง์ ์๋ค๋ฉด โ
navigate("/books")๋ก ๋ชฉ๋ก์ผ๋ก ์ด๋
location.key๋ ๋ฌด์์ธ๊ฐ?
location.key๋ React Router๊ฐ ๊ฐ location(์์น)์ ๋ถ์ฌํ๋ ๊ณ ์ ์๋ณ์์
๋๋ค.
location ๊ฐ์ฒด์ ๊ตฌ์กฐ
interface Location {
pathname: string; // "/books/123"
search: string; // "?sort=title"
hash: string; // "#review"
state: any; // ์ปค์คํ
์ํ
key: string; // ๊ณ ์ ์๋ณ์ (์ฃผ๋ชฉ)
}
key์ ํน๋ณํ ์
This value is always โdefaultโ on the initial location.
location.key๋ ์ต์ด ์ง์ ์์ ํญ์ โdefaultโ ๊ฐ์ ๊ฐ์ง๋๋ค.
// ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ ์ง์ URL ์
๋ ฅ
location.key; // "default"
// ์ฑ ๋ด์์ navigate()๋ก ์ด๋
location.key; // "abc123" (๋๋คํ ๊ณ ์ ๋ฌธ์์ด)
key๋ ์ธ์ ์์ฑ๋๋?
React Router๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์๋ก์ด key๋ฅผ ์์ฑํฉ๋๋ค.
<NavLink>,<Link>์ปดํฌ๋ํธ๋ก ์ด๋navigate()ํจ์ ํธ์ถ<Form>์ ์ถ ํ ๋ฆฌ๋ค์ด๋ ํธ- ๋ธ๋ผ์ฐ์ ๋ค๋ก๊ฐ๊ธฐ/์์ผ๋ก๊ฐ๊ธฐ (์ด๋ฏธ ์กด์ฌํ๋ key ์ฌ์ฌ์ฉ)
๋ฐ๋๋ก ๋ค์์ ๊ฒฝ์ฐ key๋ โdefaultโ์ ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ URL ์ง์ ์ ๋ ฅ
- ์ธ๋ถ ๋งํฌ์์ ์ ๊ทผ
- ๋ถ๋งํฌ์์ ์ ๊ทผ
- ์ ํญ/์ฐฝ์ผ๋ก ์ด๊ธฐ
ํ์คํ ๋ฆฌ ์คํ๊ณผ key
React Router์ ํ์คํ ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ดํดํ๋ฉด key์ ์ญํ ์ด ๋ช ํํด์ง๋๋ค.
์ ์ ํ๋ฆ์ ํ์คํ ๋ฆฌ
1. ์ฑ ์์ (/)
key: "default"
ํ์คํ ๋ฆฌ: [/]
2. ๋ชฉ๋ก ํ์ด์ง๋ก ์ด๋ (/books)
key: "aaa111" (๋๋ค ๋ฌธ์์ด)
ํ์คํ ๋ฆฌ: [/, /books]
3. ์์ธ ํ์ด์ง๋ก ์ด๋ (/books/123)
key: "bbb222"
ํ์คํ ๋ฆฌ: [/, /books, /books/123]
4. ๋ค๋ก๊ฐ๊ธฐ ์คํ
โ navigate(-1)
โ ํ์คํ ๋ฆฌ์์ ํ ์นธ ๋ค๋ก
โ /books (key: "aaa111") ๋ณต๊ท
์ด ๊ฒฝ์ฐ location.key๋ โbbb222โ ๊ฐ์ ๊ฐ์ด๋ฏ๋ก, navigate(-1)์ด ์์ ํ๊ฒ ์๋ํฉ๋๋ค.
์ง์ ์ ๊ทผ์ ํ์คํ ๋ฆฌ
1. URL๋ก ์ง์ ์ ๊ทผ (/books/123)
key: "default"
ํ์คํ ๋ฆฌ: [/books/123]
2. ๋ค๋ก๊ฐ๊ธฐ ์คํ
โ navigate(-1) ์๋
โ ํ์คํ ๋ฆฌ๊ฐ ๋น์ด์์
โ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ๋์ (์ด์ ์ฌ์ดํธ/๋น ํ์ด์ง)
์ด ๊ฒฝ์ฐ location.key === "default"์ด๋ฏ๋ก, ์ฐ๋ฆฌ๋ navigate("/books")๋ก ๋ช
์์ ์ผ๋ก ๋ชฉ๋ก ํ์ด์ง๋ก ๋ณด๋ผ ์ ์์ต๋๋ค.
์ฃผ์์ฌํญ
1. HashRouter์์๋ ๋์ํ์ง ์์
location.key๋ BrowserRouter์์ ์ง์๋ฉ๋๋ค. HashRouter๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ด ํจํด์ ์๋ํ์ง ์์ต๋๋ค.
2. replace๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
navigate(path, { replace: true })๋ฅผ ์ฌ์ฉํ๋ฉด ํ์คํ ๋ฆฌ ์คํ์ ์ถ๊ฐํ์ง ์๊ณ ํ์ฌ ํญ๋ชฉ์ ๊ต์ฒดํฉ๋๋ค. ์ด ๊ฒฝ์ฐ key๋ ๋ณ๊ฒฝ๋์ง๋ง ํ์คํ ๋ฆฌ ๊ธธ์ด๋ ๊ทธ๋๋ก์
๋๋ค.
// ํ์คํ ๋ฆฌ: [/, /books]
navigate("/books/123", { replace: true });
// ํ์คํ ๋ฆฌ: [/, /books/123]
// key๋ ์๋ก ์์ฑ๋์ง๋ง, ๋ค๋ก๊ฐ๊ธฐํ๋ฉด /๋ก ์ด๋
์ค์ ์ฌ์ฉ ์ฌ๋ก
์ ํ๋ก์ ํธ์์ ์ด ํจํด์ ์ ์ฉํ ๊ฒฐ๊ณผ
AS-IS
- ์ฌ์ฉ์๊ฐ ๋ค์ด๋ฒ๋ฅผ ๋ณด๋ ์ค, ๋๋ฃ์๊ฒ ๊ณต์ ๋ฐ์ ๋งํฌ๋ก ์์ธ ํ์ด์ง์ ๋ค์ด๋ ํธ ์ ๊ทผ
- ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ ํด๋ฆญ
- ๋ค์ด๋ฒ๋ก ๋์๊ฐ (์๋น์ค ์ดํ) ใ ใ
TO-BE
- ์ฌ์ฉ์๊ฐ ๋ค์ด๋ฒ๋ฅผ ๋ณด๋ ์ค, ๋๋ฃ์๊ฒ ๊ณต์ ๋ฐ์ ๋งํฌ๋ก ์์ธ ํ์ด์ง์ ๋ค์ด๋ ํธ ์ ๊ทผ
- ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ ํด๋ฆญ
- ๋ชฉ๋ก ํ์ด์ง๋ก ์ด๋ (์๋น์ค ์ ์ง) ๐
๋ง์น๋ฉฐ
location.key๋ React Router๊ฐ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ์ง๋ง ์ ์๋ ค์ง์ง ์์ ๊ธฐ๋ฅ์
๋๋ค. ๋จ์ํ ๊ณ ์ ์๋ณ์ ์ญํ ๋ง ํ๋ ๊ฒ ์๋๋ผ, ์ฌ์ฉ์๊ฐ ์ด๋ป๊ฒ ํ์ด์ง์ ๋์ฐฉํ๋์ง๋ฅผ ํ๋จํ๋ ํค๊ฐ ๋๊ธฐ๋ ํฉ๋๋ค.
โdefaultโ๋ผ๋ ํ๋์ ๊ฐ๋ง ์ฒดํฌํ๋ ๊ฒ์ผ๋ก, ์ฐ๋ฆฌ๋ ์ฌ์ฉ์์๊ฒ ํจ์ฌ ๋ ๋์ ๋ค๋น๊ฒ์ด์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ธ๋ถ์์ ์ ๊ทผํ๋ , ์ฑ ๋ด์์ ์ด๋ํ๋ , ์ฌ์ฉ์๋ ํญ์ ์ ์ ํ ๊ณณ์ผ๋ก ๋์๊ฐ ์ ์์ต๋๋ค.
์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์๋ ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ด ์๋ค๋ฉด, ํ๋ฒ ์ ์ฉํด๋ณด์ธ์. ์ฌ์ฉ์๋ค์ด โ์ด? ์ด๋๋ก ๊ฐ ๊ฑฐ์ง?โ ํ๋ ๋นํฉ์ค๋ฌ์ด ๊ฒฝํ์ ํ์ง ์์ ๊ฒ๋๋ค.
์ฐธ๊ณ ์๋ฃ