์ด ํ์ด์ง์ ์ํ๋ AI ์ด์์คํดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์์ฝํฉ๋๋ค
๋ฒ์ ๊ธฐ๋ก
- "usePathname ์ ํธ๋ฆฌํฐ ์ถ๊ฐ"v10.0.02026. 6. 23.
- "ํ์คํ ๋ฆฌ ์ด๊ธฐํ"v8.2.02026. 6. 22.
์ด ํ์ด์ง์ ์ฝํ ์ธ ๋ AI๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ๋์์ต๋๋ค.
์์ด ์๋ณธ ๋ด์ฉ์ ์ต์ ๋ฒ์ ์ ๋ณด๊ธฐ์ด ๋ฌธ์๋ฅผ ๊ฐ์ ํ ์์ด๋์ด๊ฐ ์์ผ์๋ฉด GitHub์ ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ์ฌ ์์ ๋กญ๊ฒ ๊ธฐ์ฌํด ์ฃผ์ธ์.
๋ฌธ์์ ๋ํ GitHub ๋งํฌ๋ฌธ์์ Markdown์ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Next.js ํตํฉ: usePathname ํ
๋ฌธ์
usePathname ํ
์ ๋ก์ผ์ผ ์ธ๊ทธ๋จผํธ๊ฐ ์ ๊ฑฐ๋ ํ์ฌ Next.js ๊ฒฝ๋ก ์ด๋ฆ์ ๋ฐํํฉ๋๋ค. ์๋์ผ๋ก ๋ก์ผ์ผ ์ ๋์ฌ๋ฅผ ์ ๊ฑฐํ์ง ์๊ณ ๋ ๋ก์ผ์ผ์ ์ธ์ํ๋ ํ์(์: ์ด๋ค ํ์ ํญ๋ชฉ์ด ํ์ฑํ๋์๋์ง ํ๋จ)์ ๊ตฌ์ถํ ๋ ์ ์ฉํฉ๋๋ค.
Next.js์์ usePathname ๊ฐ์ ธ์ค๊ธฐ
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๊ฐ์
usePathname์ next/navigation์ ๋ด์ฅ usePathname()์ ๋ํํ์ฌ ๊ฒ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๊ณ getPathWithoutLocale์ ํตํด ๋ก์ผ์ผ ์ ๋์ฌ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ํด๋ผ์ด์ธํธ ์ธก ํ์์ด ๋ฐ์ํ ๋๋ง๋ค ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค. ์ด ํ
์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค("use client" ํ์).
์ฌ์ฉ๋ฒ
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
"use client";
import type { FC } from "react";
import { usePathname } from "next-intlayer";
type NavItemProps = {
href: string;
label: string;
};
const NavItem: FC<NavItemProps> = ({ href, label }) => {
const pathname = usePathname();
const isActive = pathname === href;
return (
<a href={href} aria-current={isActive ? "page" : undefined}>
{label}
</a>
);
};
export default NavItem;
๋ฐํ ๊ฐ
ํ ์ด๋ธ์ ๋ชจ๋ฌ๋ก ์ด์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ช ํํ๊ฒ ํ์ธ
| ์ ํ | ์ค๋ช |
|---|---|
string | ๋ก์ผ์ผ ์ ๋์ฌ์ ๋ก์ผ์ผ ๋งค๊ฐ๋ณ์๊ฐ ์ ๊ฑฐ๋ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ ํ์ฌ ๊ฒฝ๋ก ์ด๋ฆ์ ๋๋ค. |
๋์ ๋ฐฉ์
- ๋ก์ผ์ผ ์ ๊ฑฐ: ์ ํ ๋ก์ผ์ผ ์ธ๊ทธ๋จผํธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค(์:
/ko/dashboardโ/dashboard). - ๊ฒ์ ๋งค๊ฐ๋ณ ์ ๊ฑฐ: ๊ฒ์ ๋งค๊ฐ๋ณ์ ๊ธฐ๋ฐ ๋ผ์ฐํ
๋ชจ๋๋ฅผ ์ฌ์ฉํ ๋
?locale=...์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ ์ ๊ฑฐํฉ๋๋ค. - ๋ฐ์ํ: Next.js App Router๋ฅผ ํตํ ๋ชจ๋ ํด๋ผ์ด์ธํธ ์ธก ํ์ ์ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
- SSR-์์ : ์ฒซ ๋ ๋๋ง ์์๋ ์๋ฒ ์ธก ๊ฒฝ๋ก ์ด๋ฆ์ ๋ฐํํ ํ ํด๋ผ์ด์ธํธ์์ ๊ฒ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋๊ธฐํํฉ๋๋ค.
useLocale๊ณผ์ ๋น๊ต
next-intlayer์ useLocale์ ์ด๋ฏธ ๋ฐํ ๊ฐ์ ์ผ๋ถ๋ก pathWithoutLocale์ ๋
ธ์ถํฉ๋๋ค. ๊ฒฝ๋ก๋ง ํ์ํ๊ณ ๋ก์ผ์ผ ์ ํ ๊ธฐ๋ฅ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ usePathname์ ์ฌ์ฉํ์ธ์.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
// ๋ก์ผ์ผ ์ํ์ ๊ฒฝ๋ก๊ฐ ๋ชจ๋ ํ์ํ ๋:
import { useLocale } from "next-intlayer";
const { locale, pathWithoutLocale } = useLocale();
// ๊ฒฝ๋ก๋ง ํ์ํ ๋:
import { usePathname } from "next-intlayer";
const pathname = usePathname();
์์
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
"use client";
import type { FC } from "react";
import { usePathname } from "next-intlayer";
const links = [
{ href: "/dashboard", label: "๋์๋ณด๋" },
{ href: "/settings", label: "์ค์ " },
];
const Sidebar: FC = () => {
const pathname = usePathname();
return (
<nav>
{links.map(({ href, label }) => (
<a
key={href}
href={href}
style={{ fontWeight: pathname === href ? "bold" : "normal" }}
>
{label}
</a>
))}
</nav>
);
};
export default Sidebar;
๊ด๋ จ
useLocaleโ ํ์ฌ ๋ก์ผ์ผ + ๋ก์ผ์ผ ์ค์์ฒ (pathWithoutLocale๋ ๋ ธ์ถ)getPathWithoutLocaleโ ์ด ํ ์์ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ ํธ๋ฆฌํฐ
