nuqs๋ Next.js์์ URL ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ํ์ฒ๋ผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์ค๋์ 'nuqs'์ useQueryState์ ๋ํด ์์๋ณผ ๊ฒ์ด๋ค.
๊ธฐ๋ณธ ๊ฐ๋
useQueryState๋ React์ useState์ ๋น์ทํ๊ฒ ๋์ํ์ง๋ง, ์ํ๋ฅผ ์ปดํฌ๋ํธ ๋ด๋ถ๊ฐ ์๋ URL ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ์ ์ฅํฉ๋๋ค.
import { useQueryState } from 'nuqs'
function SearchComponent() {
const [search, setSearch] = useQueryState('search')
// URL: /?search=hello
// search ๊ฐ: "hello"
return (
<input
value={search || ''}
onChange={(e) => setSearch(e.target.value)}
/>
)
}
์ฃผ์ ํน์ง
URL๊ณผ ์๋ ๋๊ธฐํ
- ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด URL์ด ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค
- ๋ค๋ก๊ฐ๊ธฐ/์์ผ๋ก๊ฐ๊ธฐ ๋ฒํผ์ด ์ ์ ์๋ํฉ๋๋ค
- URL์ ๊ณต์ ํ๋ฉด ๊ฐ์ ์ํ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค
ํ์ ์์ ์ฑ
- ํ์(parser)๋ฅผ ์ฌ์ฉํด ํ์ ์ ์ง์ ํ ์ ์์ต๋๋ค
import { useQueryState, parseAsInteger, parseAsBoolean } from 'nuqs'
const [page, setPage] = useQueryState('page', parseAsInteger.withDefault(1))
const [isActive, setIsActive] = useQueryState('active', parseAsBoolean)
๊ธฐ๋ณธ๊ฐ ์ค์
const [sort, setSort] = useQueryState('sort', { defaultValue: 'name' })
์ฌ๋ฌ ํ๋ผ๋ฏธํฐ ๋์ ๊ด๋ฆฌ
import { useQueryStates } from 'nuqs'
const [filters, setFilters] = useQueryStates({
search: parseAsString,
page: parseAsInteger.withDefault(1),
category: parseAsString
})
// ์ฌ๋ฌ ๊ฐ์ ํ ๋ฒ์ ์
๋ฐ์ดํธ
setFilters({ search: 'test', page: 1 })
์ค์ ์ฌ์ฉ ์์
๊ฒ์๊ณผ ํํฐ๋ง์ด ์๋ ์ํ ๋ชฉ๋ก:
function ProductList() {
const [search, setSearch] = useQueryState('search')
const [category, setCategory] = useQueryState('category')
const [page, setPage] = useQueryState('page', parseAsInteger.withDefault(1))
return (
<div>
<input
value={search || ''}
onChange={(e) => setSearch(e.target.value)}
placeholder="๊ฒ์..."
/>
<select
value={category || ''}
onChange={(e) => setCategory(e.target.value)}
>
<option value="">์ ์ฒด</option>
<option value="electronics">์ ์์ ํ</option>
<option value="clothing">์๋ฅ</option>
</select>
{/* URL: /?search=laptop&category=electronics&page=2 */}
</div>
)
}
์ฅ์
- SEO ์นํ์ : ํํฐ๋ง๋ ์ํ๊ฐ URL์ ์์ด ํฌ๋กค๋ฌ๊ฐ ์ธ๋ฑ์ฑ ๊ฐ๋ฅ
- ๊ณต์ ๊ฐ๋ฅ: URL๋ง์ผ๋ก ์ ํํ ํ์ด์ง ์ํ ๊ณต์
- ์๋ก๊ณ ์นจ ์์ : ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํด๋ ์ํ ์ ์ง
- ๋ธ๋ผ์ฐ์ ํ์คํ ๋ฆฌ: ๋ค๋ก๊ฐ๊ธฐ/์์ผ๋ก๊ฐ๊ธฐ ์ง์
Next.js์ App Router์ Pages Router ๋ชจ๋์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ํนํ ๊ฒ์, ํํฐ๋ง, ํ์ด์ง๋ค์ด์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.