โ๏ธ ๋ธ๋ก๊ทธ ์ด์ ์๋ด
์ด ๊ธ์ ์ด์ ์ ์ด์ํ๋ ๋ธ๋ก๊ทธ์ ์์ฑ๋ ๊ธ์ ๋๋ค. ๋ธ๋ก๊ทธ๋ฅผ ์ด์ ํ๋ฉฐ ๋ชจ๋ ๊ธฐ๋ก์ ์ด๊ณณ์ผ๋ก ์ฎ๊ฒจ์์ต๋๋ค. ๊ธ์ ํฌํจ๋ ์ ๋ณด๋ ์ต์ด ์์ฑ ์์ ์ ๊ธฐ์ค์ผ๋ก ํ๊ณ ์์ผ๋, ์ฐธ๊ณ ํด ์ฃผ์ธ์. ๋ณธ ๊ฒ์๊ธ์ 2024๋ 11์ 3์ผ์ ์์ฑ๋์ต๋๋ค.
์ง๋ 9์ ์ค์๋ถํฐ 10์๊น์ง, ํ๋ก์ ํธ ์บ ํ: Next.js 3๊ธฐ๋ผ๋ ๊ต์ก ํ๋ก๊ทธ๋จ์ ์ฐธ์ฌํ๊ฒ ๋์ต๋๋ค. 2์ฃผ๊ฐ์ ์ฌ์ ๊ต์ก ๊ธฐ๊ฐ ์ดํ 4์ฃผ๋์์ ํ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ , ์ด์ ๋ํ ํ๊ณ ๋ฅผ ํ์ด๋ณด๊ณ ์ ํฉ๋๋ค.
ํ ๋งํ ๋ค
์ ๋ํ์๋ค์ด ์ฐธ์ฌํ ์ ์๋ ๋์ธํ๋๊ณผ ๊ณต๋ชจ์ ์ ๋ณด๋ฅผ ์์ฝ๊ฒ ์ฐพ์ ์ ์๋๋ก ์ ๊ณตํ๊ณ , ์ทจ์
๊ณผ ๋ํ์ํ์ ๋์์ด ๋๋ ๋ค์ํ ์ ๋ณด๋ฅผ ์๋ดํ๋ ์น ์๋น์ค์
๋๋ค. ํ๋ก์ ํธ๋ ๊ธฐ์
๊ณผ์ ์ฐ๊ณ ๊ณผ์ ์ผ๋ก ์งํ๋์๊ณ , ํ์ํ ๋์์ธ ํ์ผ๊ณผ ์๋น์ค์ ๋ํ ์๊ฐ๋ ๋ฏธ๋ฆฌ ๊ธฐ์
์ธก์ผ๋ก๋ถํฐ ์ ๊ณต๋ฐ์์ต๋๋ค.
ํ ๋งํ ๋ค์ ์ฃผ์ ๊ธฐ๋ฅ์ ํฌ๊ฒ ํ, ๋งค๊ฑฐ์ง, ๋์ธํ๋ ๋ฐ ๊ณต๋ชจ์ ํ์ด์ง์ ๊ฒ์ ํ์ด์ง๋ก ๋๋ฉ๋๋ค.
์ ๋ ์ด ์ค์์ ๊ณต๋ชจ์ ๋ฐ ๋์ธํ๋ ํ์ด์ง์, ํค๋์ ํ์ด์ง๋ค์ด์ ๊ณตํต ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ธํ๋ ๋ฐ ๊ณต๋ชจ์ ํ์ด์ง์์ ์ฌ์ฉํ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ฅผ ํฌ๋กค๋งํ๋ ์์ ๋ ๋ด๋นํ์ต๋๋ค. ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์ด๋ค ๊ธฐ๋ฅ๋ค์ ์ด๋ป๊ฒ ๊ตฌํํ๊ณ , ๋ ์ด๋ค ๊ณ ๋ฏผ๋ค์ ํ๋์ง ์์๋ณด๊ธฐ์ ์์ ํ๋ก์ ํธ์ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ํด๋ณด๊ณ ์ ํฉ๋๋ค.
๊ฐ๋ฐ ํ๊ฒฝ์ ํฌ๊ฒ ํ๋ก ํธ/๋ฐฑ์๋์ ๊ธฐ์ ์คํ๊ณผ ํด๋ ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ก ๋๋์ด ๋ณด์์ต๋๋ค. ๋จผ์ ๊ธฐ์ ์คํ๋ถํฐ ์ดํด๋ณผ๊น์?
ํ๋ก ํธ์๋์์๋ Next.js
, TypeScript
, TailwindCSS
๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
Next.js
์ SSR์ ์ฌ์ฉํ๋ฉด ๋ค์ํ ๊ณต๋ชจ์ ๋ฐ ๋์ธํ๋ ์ ๋ณด์ ํ์ด์ง๋ฅผ ๋น ๋ฅด๊ฒ ๋ถ๋ฌ์ฌ ์ ์๊ณ , ํ์ผ ๊ตฌ์กฐ์ ๊ธฐ๋ฐ ๋ผ์ฐํ
์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ์ ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค๋ ์ฅ์ ์ด ์์ด์ ์ ํํ์ต๋๋ค.
TypeScript
๋ ์ด์ ๋ ์ฌ์ค์ Next.js๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์๋ ๋ํดํธ๊ฐ ๋ ์คํ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ์ด๋ฒ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ๊ทธ ์ด์ ๋ฅผ ๊ณ ๋ฅด์๋ฉด ๋จ์ฐ ํ์
๋๋ฌธ์
๋๋ค. ๋ค์ํ ์ปดํฌ๋ํธ์์ ๋ค์ํ ๋ฐ์ดํฐ ํ์
์ ์ฌ์ฉํด์ผ ํ๋๋ฐ, ํ์
์คํฌ๋ฆฝํธ์ ์ ์ ํ์
๊ฒ์ฌ ๊ธฐ๋ฅ์ ํตํด ์ด๋์ ์ด๋ค ๊ฐ์ด ๋ค์ด๊ฐ์ผ ํ๋์ง ๋ณด๋ค ๋ช
ํํ๊ฒ ์ ์ ์์์ต๋๋ค.
Tailwind CSS
๋ ์ฝ๊ณ ๋น ๋ฅธ ์ ์ฉ์ ์ํด ์ฌ์ฉํ์ต๋๋ค. ์ฌ์ ์ ์ ์๋ ์ ํธ๋ฆฌํฐ ํด๋์ค ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ๋ง์ผ๋ก ๊ฐํธํ๊ฒ ์คํ์ผ์ ์ ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์์๊ณ , Next.js์์ ๊ธฐ๋ณธ ํตํฉ์ด ๊ฐํธํ์ด์. ์ถํ์ ์ด์ผ๊ธฐ ํ ๋ด์ฉ์ง๋ง, ์ฌ์ ์ ์ ์๋ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ผ๋ ๊ฒ์ด ๋๋ก๋ ๋ง๋ฅ ์ข์ ๊ฒ๋ง์ ์๋๊ธฐ๋ ํ์ต๋๋ค.
๊ทธ ์ธ์๋ ๋ค์ํ ์ด์ ๊ฐ ์๊ฒ ์ง๋ง, ์ถ๊ฐ์ ์ผ๋ก 2์ฃผ๊ฐ์ ์ฌ์ ์ง๋ฌด ๊ต์ก์์ ์ ์ธ ๊ฐ์ง ๊ธฐ์ ์คํ์ ํ์ตํ๋ค๋ ์ ๋ ์์์ด์. ํ๋ก์ ํธ ๊ธฐ๊ฐ๋์ ์๋ก์ด ๊ธฐ์ ์คํ์ ๋ฐฐ์ฐ๊ธฐ๋ณด๋ค๋ ๋ชจ๋๊ฐ ์ด๋์ ๋ ์ต์ํด์ง ๊ธฐ์ ์คํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋น ๋ฅธ ์์ฐ์ฑ์ ๋ณด์ฅํ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐฑ์๋์์๋ Supabase
, Python
๋ฑ์ ์ฌ์ฉํ์ต๋๋ค.
์ ํฌ ํ์ ํ๋ก์ ํธ์์ ํ์ฉํ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ก ์ฃผ์ด์ง์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํฌ๋กค๋งํ ๋ค ๊ฐ๊ณตํด์ผ ํ๋๋ฐ, ๊ฐ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ DB์ ์ด๋ฅผ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํด์ค ์ ์๋ ์๋ฒ๊ฐ ํ์ํ์ต๋๋ค. ์ง๊ธ ์ฌ์ฉํ๊ณ ์๋ ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค๋ฉด์ Supabase
๋ฅผ ์ฌ์ฉํด ๋ณธ ์ ์ด ์์๋๋ฐ, ๋ง์นจ ๋ค๋ฅธ ํ์๋ ์ฌ์ฉํด ๋ณธ ์ ์ด ์๋ค๊ณ ํด์ ๋น ๋ฅด๊ฒ ์ต๋ํ๊ณ ํ์ฉ ๊ฐ๋ฅํ ํด๋น ๊ธฐ์ ์ ์ ํํ์ต๋๋ค.
Python
์ ๊ฒฝ์ฐ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์ ๋ง ์ค๋๋ง์ ์ฌ์ฉํด ๋ณธ ์ธ์ด์์ต๋๋ค. ๊ธฐ์ด์ ์ธ ๋ฌธ๋ฒ์ ์ ์ธํ๋ฉด ์์ ๋ชจ๋ฅด๊ณ ์๋ค๊ณ ๋งํด๋ ๊ณผ์ธ์ด ์๋ ์ ๋๋ก ๋ถ์กฑํ ์ดํด๋๋ฅผ ๊ฐ์ง๊ณ ์์ด์, ํฌ๋กค๋ง ๊ด๋ จ ๋ถ๋ถ์ ๋ํด์๋ LLM๊ณผ ํ์์ ๋์์ ๋ง์ด ๋ฐ์์ต๋๋ค.
Next.js๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํด์ง ํด๋ ๊ตฌ์กฐ๊ฐ ์์ด์, ํนํ app ํด๋์ ๊ฒฝ์ฐ ํด๋น ์ปจ๋ฒค์
์ ์ ๋ฐ๋ฅด๊ธฐ๋ง ํ๋ ๊ฒ์ผ๋ก๋ ์ถฉ๋ถํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณด๋ค ์ข์ ํด๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์ด์, ๊ด๋ จ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๋ ์ค containers
ํด๋๋ฅผ ํ์ฉํด UI ๋ฐ ๋ ์ด์์๊ณผ ๋ผ์ฐํฐ ๊ด๋ จ ๋ก์ง์ ๋ถ๋ฆฌํ๋ฉด ์ปดํฌ๋ํธ์ ๊ฐ๋
์ฑ์ ๋์ผ ์ ์๋ค๋ ๊ธ์ ์ฝ๊ฒ ๋์์ต๋๋ค.
์์ ๊ฐ์ด api๋ฅผ ์ ์ธํ๋ฉด app๊ณผ ์์ ํ ๋์ผํ ํํ์ ๊ตฌ์กฐ๋ฅผ containers์์ ๊ฐ์ถ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
import { fetchActivityContestAbstractWith } from '@/lib/fetchActivityAbstractWith';
import Activity from '@/containers/activity/Activity';
// ๋ฉํ๋ฐ์ดํฐ์ ๊ฐ์ ํ์ด์ง ์ปดํฌ๋ํธ์ ํ์ํ ๋ก์ง
export default async function Page({ searchParams }: PageProps) {
const filters = searchParams.filters?.split(',').filter(Boolean) || [];
const sort = searchParams.sort || '๊ด๋ จ๋์';
const { data: activitiesContests, error } =
await fetchActivityContestAbstractWith({
filters,
sort,
mainCategory: '๋์ธํ๋',
});
if (error) {
// ์๋ฌ ํธ๋ค๋ง ๋ก์ง
}
return <Activity activitiesContests={activitiesContests || []} />;
}
๊ทธ ๊ฒฐ๊ณผ ํ์ด์ง ์ปดํฌ๋ํธ์์ ์ด๋ ๊ฒ UI์ ํ์ด์ง์ ๋ก์ง์ ๋ถ๋ฆฌํด, ๋ณด๋ค ๊ฐ๋
์ฑ ๋์ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ์ ์๊ฒ ๋์์ด์. ๋๋จธ์ง ๋ค๋ฅธ ํด๋๋ ์ผ๋ฐ์ ์ธ ํด๋ ๊ตฌ์กฐ์ ๊ทธ ์ญํ ์ด ๋์ผํ์ต๋๋ค. ๋ฌํ๊ฒ ์ด์ง์ ์ธ ํด๋๊ฐ ํ๋ ์๋๋ฐ, ๋ฐ๋ก scripts
ํด๋์
๋๋ค. ์์ ๋ฐ์ดํฐ๊ฐ ์ฃผ์ด์ง์ง ์์๋ค๊ณ ํ๋๋ฐ, ์ด์ ๋ฐ์ดํฐ์ ํฌ๋กค๋ง์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
ํ ๋งํ ๋ค์๋ ํฌ๊ฒ ๋ ๊ฐ์ง์ ๋ฐ์ดํฐ๊ฐ ํ์ํ์ต๋๋ค. ๋ํ์ํ ๊ฟํ๊ณผ ๊ด๋ จ๋ ๋งค๊ฑฐ์ง ํ์ด์ง์์ ๋ณด์ฌ์ฃผ๋ ์ฝํ ์ธ ์ ํ์ํ ๋ฐ์ดํฐ์, ๊ณต๋ชจ์ ๋ฐ ๋์ธํ๋ ํ์ด์ง์์ ๋ณด์ฌ์ฃผ๋ ์ฝํ ์ธ ์ ํ์ํ ๋ฐ์ดํฐ์์ด์. ์ ๋ ๋ ์ค ํ์๋ฅผ ๊ตฌํด์ผ ํ์ต๋๋ค.
์์ ๊ฐ์ ํ์ด์ง์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ตฌํด์ผ ํ๋๋ฐ, ๋คํํ ๋ํ์์ ์ํ ๋์ธํ๋๊ณผ ๊ณต๋ชจ์ ์ ์๊ฐํ๋ ๊ธฐ์กด์ ์๋น์ค๋ ๋ง์๊ธฐ์ ๊ทธ์ค ํ ๊ณณ์ธ '์บ ํผ์คํฝ'์์ ๋ฐ์ดํฐ๋ฅผ ํฌ๋กค๋งํด ์ค๊ธฐ๋ก ํ์ต๋๋ค. ํฌ๋กค๋งํ ๋ฐ์ดํฐ๋ฅผ ๋ฌด๋จ์ผ๋ก ์์ ์ ์ธ ์ฉ๋๋ก ํ์ฉํ๋ฉด ๋น์ฐํ ๋ฒ์ ์ธ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์๊ธฐ ๋๋ฌธ์, ์ค๋ช ์ ์ด์ด๊ฐ๊ธฐ์ ์์ ์ ํฌ๊ฐ ํฌ๋กค๋ง ํ ๋ฐ์ดํฐ๋ ๋น์์ ์ ์ธ ์ฉ๋๋ก, ์ด๋ ํ ์์ต๋ ์ฐฝ์ถํ์ง ์์์ ๋ฏธ๋ฆฌ ๋ฐํ๋๋ค.
๊ฒฐ๊ตญ LLM๊ณผ ํจ๊ป ์ด์ฌํ ๊ณ ๋ฏผํ ๋ค, ์ฐ์ฌ๊ณก์ ๋์ ๋ฐ์ดํฐ๋ฅผ ํฌ๋กค๋งํ๊ธด ํ์ต๋๋ค. ํ์ง๋ง ํ์ด์ฌ์ ๋ํ ์ง์์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค ์คํฌ๋ฆฝํธ๋ฅผ ๋งค๋ฒ ์คํ์์ผ์ผ ํ๊ณ , ๋๋ถ์ ์ ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ป๋ ๋ฐ๊น์ง ๊ฝค๋ ์ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ํ์์ ๋์์ด ์์๋ค๋ฉด ๋ ๊ธด ์๊ฐ์ ํฌ๋กค๋ง์ ์๋ชจํด์ผ ํ์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ๋ฌธ์ ๋ ์ด๊ฒ ๋ฟ๋ง์ด ์๋์์ต๋๋ค.
ํ ๋งํ ๋ค์ ๋์ธํ๋๊ณผ ๊ณต๋ชจ์ ์์ ์ ์ฉ ๊ฐ๋ฅํ ๋ค์ํ ํํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ข ๋ฅ๊ฐ ์ด 84๊ฐ์ง๋ ๋์ด์. ํฌ๋กค๋ง๋ ๋ฐ์ดํฐ์๋ ํํฐ๊ฐ ์์๊ธฐ์ ๊ทธ ํํฐ๋ฅผ ์ง์ ์ ์ฉํด ์ค์ผ ํ๋๋ฐ, ์๋ง์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ์ฝ์ด๋ณด๋ฉด์ ์ง์ ์ข ๋ฅ์ ๋ง๋ ํํฐ๋ฅผ ์ฝ์ ํด ์ฃผ๋ ๊ฒ ๋ง๊ณ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ๋ ์ค๋ฅด์ง ์์์ต๋๋ค.
๊ฒฐ๊ตญ ์์๋ฐฉํธ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํฌ๋กค๋งํ ๋ค ์ ์ ํ๋ ๊ณผ์ ์์ ๋ฌด์์๋ก ํํฐ๋ฅผ ์ ์ฉํด ์ฃผ์์ต๋๋ค. ๊ทธ๋์ ํด์ธ ๋ด์ฌํ๋์ธ๋ฐ ๊ตญ๋ด ํํฐ๊ฐ ์ ์ฉ๋์ด ์๋ค๊ฑฐ๋ ํ๋ ์ํ๊น์ด ์ผ์ด ๋ฒ์ด์ง๊ณ ๋ง์์ง๋ง, ๋ฑํ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ๋ ์ค๋ฅด์ง ์์๊ณ ๊ธฐํ ๋ด์ ํ๋ก์ ํธ๋ฅผ ์์ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด์ฉ ์ ์์ด ์ด๋ฌํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ฒ ๋์์ต๋๋ค. ์ด๋ ๊ฒ ์ ์ ๋ ๋ฐ์ดํฐ๋ฅผ Supabase์ ์ ์ฅํ๊ณ , ํ์์ ๋ฐ๋ผ ์์ฒญ์ ๋ณด๋ด ๋ถ๋ฌ์ค๋ ์์ผ๋ก ํ์ฉํ์ต๋๋ค.
์ ๊ฐ ๋ด๋นํ๋ ํค๋์ ๋ด๋น๊ฒ์ด์ ๋ฐ ์ปดํฌ๋ํธ๋ ์น๊ณผ ๋ชจ๋ฐ์ผ์์ ๋ ์ด์์์ด ์์ดํ์ต๋๋ค.
๋ชจ๋ฐ์ผ์์๋ ์ด๋ ๊ฒ ๋ด๋น๊ฒ์ด์ ๋ฐ๊ฐ ๋ถ๋ฆฌ๋์ด ์คํฌ๋ฆฐ์ ํ๋จ์ ์์นํ๋ ํํ์์ต๋๋ค. ์ด๊ฑธ ๊ตฌํํ ์ ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ ์ฌ๋ ค ๋ดค๊ณ , ์ ๋ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ ํํ์ต๋๋ค.
const containerClasses =
'flex flex-1 items-center fixed md:static bottom-[30px] left-1/2 transform -translate-x-1/2 md:transform-none z-50';
const listClasses =
'flex gap-6 lg:gap-10 bg-white h-full px-8 md:px-0 py-4 md:py-0 whitespace-nowrap shadow md:shadow-none border md:border-none border-sub-gray-100 rounded-full md:rounded-none items-center';
const linkItemClasses =
'whitespace-nowrap text-base lg:text-xl font-medium lg:font-semibold rounded-full py-2 px-3';
const activeLinkClasses = 'bg-sub-yellow-500 text-sub-gray-500';
const inactiveLinkClasses = 'bg-sub-yellow-100 text-sub-gray-400';
์ด๋ ๊ฒ ์ปค์คํ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ๋ฐ์ํ์ผ๋ก ์ ์ฉ๋ ์ ์๋๋ก ๊ตฌํํ์ต๋๋ค.
ํค๋์ ๋ด๋น๊ฒ์ด์ ์ด ๋ง๋ณด๊ธฐ์๋ค๋ฉด, ํ์ด์ง๋ค์ด์ ๊ณผ ๊ทธ๋ฆฌ๋ ๋ทฐ๊ฐ ์ ์๊ฒ๋ ๋ฉ์ธ ๋์ฌ์์ต๋๋ค. ์์ฆ ๋ง๋ก๋ ํฅ์ด๋ผ๊ณ ํ ์๋ ์๊ฒ ๋ค์. ํํ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ํ์ํ์ง ์๊ณ ๋๋ ์ ํ์ํ๋ ๊ธฐ๋ฅ์ ํ์ด์ง๋ค์ด์ (Pagination)์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ํ ๋งํ ๋ค์์ ์ฌ์ฉ๋๋ ํ์ด์ง๋ค์ด์ ์ปดํฌ๋ํธ๋ฅผ ์ดํด๋ณผ๊น์?
์ ๋ ํ์ด์ง๋ค์ด์ ์ปดํฌ๋ํธ๋ฅผ ์ด๋ ๊ฒ ๋ถ๋ฆฌํ์ด์. ํ์ด์ง ์ปจํธ๋กค๊น์ง ํฌํจํ๋ ์ปดํฌ๋ํธ๋ Pagination, ๋ด๋ถ ์ปจํ ์ธ ๋ฅผ ๊ทธ๋ฆฌ๋ ํํ๋ก ๋ ๋๋งํ๋ ์ปดํฌ๋ํธ๋ GridView ์์ต๋๋ค. ๋ฌธ์ ๋ ์ด ๋ ์ปดํฌ๋ํธ๊ฐ ์ ๋ง ๋ค์ํ ๊ณณ์์, ์ ๋ง ๋ค์ํ ํํ๋ก ์ฌ์ฉ๋๊ณ ์์์ด์. ๋จผ์ GridView ์ปดํฌ๋ํธ๋ถํฐ ์ดํด๋ณผ๊น์?
์ด๋ ๊ฒ GridView ์ปดํฌ๋ํธ๋ ์๋น์ค ๋ด์ ๋ง์ ๊ณณ์์ ๋ค์ํ ํํ๋ก ์ฌ์ฉ๋๊ณ ์์์ต๋๋ค. ๋ด๋ถ์ ๋ ๋๋ง๋๋ ์ฝํ ์ธ ์ ์๋ ํ์ด์ง๋ณ๋ก ๋ฌ๋๊ณ ์. ๊ทธ๋์ ๊ณต์ฉ ์ปดํฌ๋ํธ๋ฅผ ํ๋ ๋ง๋ค์ด ๋๋ค๋ฉด ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๊ณ , ๊ณ ๋ฏผ ๋์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก GridView ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ์ต๋๋ค.
export default function GridView<T>({
items,
GridItem,
columnStyle,
gapStyle,
}: GridViewProps<T>) {
const columnStyles = {
web4mobile2: 'grid-cols-2 sm:grid-cols-2 md:grid-cols-4 lg:grid-cols-4',
web3mobile1: 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3',
};
const gapStyles = {
gapStyle1: 'gap-x-4 gap-y-8 md:gap-x-8 md:gap-y-12',
gapStyle2: 'gap-x-6 gap-y-10 md:gap-x-10 md:gap-y-12',
gapStyle3: 'gap-x-2 gap-y-6 md:gap-x-8 md:gap-y-10',
};
const gridClass =
`grid ${columnStyles[columnStyle]} ${gapStyles[gapStyle]}`.trim();
return (
<div className={gridClass}>
{items.map((item, index) => (
<GridItem key={index} item={item} />
))}
</div>
);
}
GridView ์ปดํฌ๋ํธ๋ ๋ค์๊ณผ ๊ฐ์ props๋ฅผ ๋ฐ์ต๋๋ค:
์ฌ์ฉ์๊ฐ ํด๋น ์ปดํฌ๋ํธ์ ํ์ํ props๋ฅผ ์ ๋ฌํ๋ฉด, ์ด๋ฅผ ๋ด๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก ๊ตฌํํ์ต๋๋ค. ๋ณด๋ค ์ ์ฐํ ์ปดํฌ๋ํธ์ ์ฌ์ฉ์ ์ํด์, ์ ๋ค๋ฆญ ํ์ ์ ํ์ฉํ์ด์.
๊ทธ๋ฆฌ๊ณ JSDoc์ ์ฌ์ฉํด ์ปดํฌ๋ํธ๋ฅผ ์ฒ์ ์ฌ์ฉํ๋๋ผ๋ ๋น ๋ฅด๊ฒ ํ์ฉํ ์ ์๋๋ก ๋งค๊ฐ๋ณ์์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ช ์ํด ์ฃผ์์ต๋๋ค.
ํ์ด์ง๋ค์ด์ ์ปดํฌ๋ํธ๋ GridView ๋งํผ์ด๋ ์ฌ๋ฌ ํ์ด์ง์์ ๋ค์ํ๊ฒ ์ฌ์ฉ๋๊ณ ์์์ต๋๋ค.
๋ณด๋ค์ํผ, ํ์ด์ง๋ค์ด์ ์ ํ ํ์ด์ง๋น ํ์๋๋ ์ฝํ ์ธ ์ ๊ฐ์๊ฐ ํ์ด์ง๋ง๋ค, ์น๊ณผ ๋ชจ๋ฐ์ผ ํ๊ฒธ๋ง๋ค ์์ดํ์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก๋ ํ์ด์ง๋น ํ์๋๋ ์ปจํ ์ธ ๊ฐ ์น๊ณผ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ ๋์ผํ๊ฒ ์ ์ง๋๋ ๊ฒ์ด ์ฌ์ฉ์์๊ฒ ๋ ๋์ ๊ฒฝํ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํ์ง๋ง(๊ตฌํํ๊ธฐ๋ ๋ ์ฝ๊ณ ์), ์ต๋ํ ๋์์ธ์ ๋ฐ๋ฅด๊ธฐ๋ก ํ์ต๋๋ค. ๊ทธ ์ ์, ์ฐ์ ์ด๋ ๊ฒ ํ์ด์ง๋น ํ์๋๋ ์ปจํ ์ธ ๊ฐ ์น/๋ชจ๋ฐ์ผ์์ ๋ฌ๋ผ์ง ๊ฒฝ์ฐ ๋ฐ์ํ๋ ๋ฌธ์ ์ ์ ๋ํด์ ์ดํด๋ณผ๊น์?
๋จผ์ 60๊ฐ์ ์ปจํ ์ธ ์ ๋ํ ํ์ด์ง๋ค์ด์ ์ด ์ด๋ฃจ์ด์ง๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ์น์ ํ์ด์ง๋น 16๊ฐ์ ์ปจํ ์ธ ๋ฅผ, ๋ชจ๋ฐ์ผ์ ํ์ด์ง๋น 10๊ฐ์ ์ปจํ ์ธ ๋ฅผ ๋ ๋๋งํฉ๋๋ค. ์ด ๊ฒฝ์ฐ, ์์ฑ๋๋ ํ์ด์ง์ ์๋ ๊ฐ๊ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฒ์๋ถํฐ ๋ค๋ฅธ ํ๊ฒฝ์์ ์น๊ณผ ๋ชจ๋ฐ์ผ ํ์ด์ง๋ฅผ ํ์ธํ๊ณ ์๋ค๋ฉด ํฐ ๋ฌธ์ ๊ฐ ๋์ง๋ ์๊ฒ ์ง๋ง, ๋ง์ฝ ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ ๋ชจ๋ฐ์ผ๋งํผ ์ค์ฌ์ ๋ณด๋ค๊ฐ ์น์ ๊ฐ๋ก ํฌ๊ธฐ๋งํผ ๋๋ฆฐ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ๋ชจ๋ฐ์ผ์์ 6ํ์ด์ง๋ฅผ ๋ณด๊ณ ์์๋ค๋ฉด, ์น์์๋ ์กด์ฌํ์ง ์๋ ํ์ด์ง๋ฅผ ๋ณด๊ฒ ๋ฉ๋๋ค. ๋น์ฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ๋ฐ์ ์์ต๋๋ค.
export default function useResponsiveItemsPerPage(
webItemsPerPage: number,
mobileItemsPerPage: number,
) {
const [itemsPerPage, setItemsPerPage] = useState(webItemsPerPage);
useEffect(() => {
function handleResize() {
if (window.innerWidth >= 768) {
setItemsPerPage(webItemsPerPage);
} else {
setItemsPerPage(mobileItemsPerPage);
}
}
handleResize();
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, [webItemsPerPage, mobileItemsPerPage]);
return itemsPerPage;
}
๊ทธ๋์ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋๋ก ์ปค์คํ
ํ
์ ๋ง๋ค์์ต๋๋ค. ์ด ํ
์ ์น๊ณผ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ ํ์ํ ํ์ด์ง ๋น ์ปจํ
์ธ ์ ๊ฐ์๋ฅผ ํ
์ผ๋ก ๋ฐ์, ํ๋ฉด์ ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ ๊ฐ์งํ๊ณ ์ ์ ํ ์ปจํ
์ธ ๊ฐ์์ธ itermsPerPage
๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฅผ Pagination ์ปดํฌ๋ํธ์ ์ ์ฉ์์ผ ์คํฌ๋ฆฐ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ ํ์ด์ง๋ฅผ ์กฐ์ ํ ์ ์๋๋ก ํ์ด์.
const itemsPerPage = useResponsiveItemsPerPage(
webItemPerPage,
mobileItemPerPage,
);
const totalItems = contents.length;
const totalPages = Math.ceil(totalItems / itemsPerPage);
if (currentPage < 1 || currentPage > totalPages) {
notFound();
}
๋ํ, ์์ ๋งํ๋ ์กด์ฌํ์ง ์๋ ํ์ด์ง์ ์ ๊ทผํ๊ฒ ๋๋ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ
์ ์ฌ์ฉ์๊ฐ ์กด์ฌํ์ง ์๋ ํ์ด์ง์ ์ ๊ทผํ ๊ฒฝ์ฐ notFound()
๋ฅผ ํธ์ถํด ์ ์ด๋ ์ฌ์ฉ์์๊ฒ ์๋ชป๋ ์ ๊ทผ์์ ์๋ ค์ค ์ ์๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ์ต๋๋ค. ์ต์ข
์ ์ผ๋ก๋ ์น โ ๋ชจ๋ฐ์ผ, ๋ชจ๋ฐ์ผ โ ์น ์ ํ ์ ์ด๋ฅผ ๊ฐ์งํ๊ณ ์ฌ์ฉ์๊ฐ ๋ฐ๋ ๋ทฐ์์ ์์นํ๋ ํ์ด์ง๋ฅผ ์ด๋ฆผ์ก์ ๊ณ์ฐํด ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์ถ์์ง๋ง, ํด๋น ๋ถ๋ถ์ ๊ตฌํํ์ง ๋ชปํ์ต๋๋ค.
๋จผ์ ๊ณต๋ชจ์ /๋์ธํ๋์ ๋ฉ์ธ ํ์ด์ง๋ฅผ ์ดํด๋ณด๋ฉด, ์ด๋ฐ ์์ผ๋ก ํํฐ๋ฅผ ํ ๊ธํ๊ฑฐ๋, ์ ๋ ฌ ์ต์ ์ ์ ํํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์๊ฐ ์ ํํ๋ ํํฐ๋ ์ด๋ ๊ฒ ์์ธ ํ์ด์ง์์๋ ๋์ผํ๊ฒ ์ ์ฉ๋์ด ์์ด์ผ ํ์ด์. ๋ํ ์ด ํํฐ๋ฅผ ๋ฐํ์ผ๋ก ์นดํ ๊ณ ๋ฆฌ๋ณ ๋ฉ์ธ ํ์ด์ง์์ ํํฐ์ ๋ง๋ ์ปจํ ์ธ ๋ง์ ๋ถ๋ฌ์ค๋๋ก ํด์ผ ํ์ต๋๋ค. ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์๊น ๊ณ ๋ฏผํ๋ค๊ฐ, ์ฟผ๋ฆฌ ์คํธ๋ง์ด ๋ ์ฌ๋์ต๋๋ค.
const updateURL = (newTab: string, newFilters: string[], newSort: string) => {
const params = new URLSearchParams();
if (newTab) params.set('tab', newTab);
if (newFilters.length > 0) params.set('filters', newFilters.join(','));
if (newSort) params.set('sort', newSort);
router.push(`${pathname}?${params.toString()}`);
};
ํํฐ๋ฅผ ํ ๊ธํ ๋๋ง๋ค ํธ์ถ๋๋ updateURL
์ ์ ํ๋ ํํฐ์ ์ ๋ ฌ ์ต์
์ ๊ธฐ๋ฐ์ผ๋ก URL์ ์
๋ฐ์ดํธํ๋ ํจ์์
๋๋ค. Next.js์ router.push
๋๋ถ์, ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ์ง ์๊ณ ๋ URL์ ์
๋ฐ์ดํธํ ์ ์์์ด์. ์ด์ ํ์ด์ง์์ URL์ ๊ธฐ๋ฐ์ผ๋ก Supabase์ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ธ ๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ฒ๋ฆฌํด์ผ ํ๋๋ฐ, ์ด๋ searchParams
๋ฅผ ์ฌ์ฉํด ๊ตฌํํ์ต๋๋ค. ์๋์ ๊ฐ์ด ํ์ด์ง์์ searchParams๋ฅผ ๋ฐ์์ค๊ณ , ํํฐ์ ์ ๋ ฌ ์ต์
์ ์ถ์ถํด ๋ฐ์ดํฐ ํ์นญ ํจ์์ ์ ๋ฌํ๋ ๋ฐฉ์์
๋๋ค.
export default async function Page({ searchParams }: PageProps) {
const filters = searchParams.filters?.split(',').filter(Boolean) || [];
const sort = searchParams.sort || '๊ด๋ จ๋์';
const { data: activitiesContests, error } =
await fetchActivityContestAbstractWith({
filters,
sort,
mainCategory: '๋์ธํ๋',
});
if (error) {
// ์๋ฌ ํธ๋ค๋ง ๋ก์ง
}
return <Activity activitiesContests={activitiesContests || []} />;
}
ํ ๋งํ ๋ค์ ๊ทธ๋ ๊ฒ ๋ง๋ฌด๋ฆฌ๋์ง๋ง, ์์ฌ์ด ๋ถ๋ถ๋ค์ด ๋จ์์์์ต๋๋ค.
๊ธฐ์ ์ผ๋ก๋ถํฐ ๋์์ธ์ ์ ๊ณต๋ฐ์์ ๋, ๋์์ธ ์์คํ ์ด ์ค๋น๋์ด์๋ค๋ ์ด๊ธฐ ํ๋ก์ ํธ ์ค๋ช ํ์ ๋ง๊ณผ๋ ๋ฌ๋ฆฌ ํฐํธ์ ๊ณตํต ์ปดํฌ๋ํธ ๋ช ๊ฐ ์ ๋๊ฐ ๋์ด์์ต๋๋ค. ํ์ด์ง ์์ด์ดํ๋ ์๋ ์์ ์ ๊ณต๋์ง ์์ ๋ถ๋ถ๋ค์ด ๋ง์๊ณ (๊ฐ๋ฐ์์ ์์๋ ฅ์ ๋ฏฟ๊ณ ์์๋์ง), ๋์์ธ์ ์ผ๊ด์ ์ธ ๋ถ๋ถ์ด ์ ์์ด์.
๊ธฐ๋ฅ๋ช ์ธ๋ ์์ ์ ๊ณต๋์ง ์์์ต๋๋ค. ๋ฌผ๋ก ์ฃผ์ด์ง ์์ด์ดํ๋ ์์ ๋ณด๊ณ ์์ ๋งํ๋ '์์๋ฑ๊น์ผ' ์ ๋ฐํํด์ ๋ง๋ค์๋ ์์๊ฒ ์ง๋ง, ์ ๊ฐ ์ง์ํ ๊ณผ์ ์ โ๊ต์ก ํ๋ก๊ทธ๋จโ ๊ณผ์ ์ด์๊ณ , ๊ทธ๋์ ์ต์ํ์ ์ตํต์ฑ์ ๊ธฐ๋ํ์ด์. ๋ฐ์ดํฐ๋ ์ ํ ์ ๊ณต๋์ง ์์ ์ง์ ํฌ๋กค๋ง์ ์งํํ์ต๋๋ค. ๋์ฑ์ด ๊ฐ์ ๊ธฐ์ ์ ๋ค๋ฅธ ํ๋ก์ ํธ์๋ ์ ๊ณต๋ ๋์์ธ ์์คํ ๊ณผ ์ ์ ํ๋ก์ฐ ๋ฑ์ด ์ ํฌ ํ๋ก์ ํธ์๋ ์กด์ฌํ์ง ์์์, ๊ทธ ๋ถ์ฌ๊ฐ ๋์ฑ ํฌ๊ฒ ๋๊ปด์ก๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ธฐ์ ๊ณผ์ ์ํต๋ ๊ทธ๋ ๊ฒ ์ํ ํ์ง๋ ์์์ต๋๋ค. ๊ฐ ํ๋ณ ๋ฉํ ๋ ๋ค๋ฆ๊ฒ ๋ฐฐ์ ๋๊ณ , ํผ๋๋ฐฑ๋ ๋น ๋ฅด๊ฒ ๋ฐ์๋ณผ ์ ์์์ด์. ๋ฌผ๋ก ์ฐ๋ฝ์ ํ์๋ง์ ๋ฐ๋ก ๋ต๋ณ์ ์ค๋ค๊ฑฐ๋, ๊ผญ๋์๋ฒฝ๋ถํฐ ๋ต๋ณ์ ๋ฐ๋๋ ๊ฒ์ ์๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ํต์ ๊ฑธ๋ฆฌ๋ ํผ๋๋ฐฑ ์๊ฐ๋ณด๋ค๋ ์กฐ๊ธ์ ๋ ๊ธธ์๋ ๊ฒ ๊ฐ์์. ๋์์ธ๊ณผ ๊ด๋ จํด์๋, ๋์์ด๋์ ์ง์ ์ ์ธ ์ํต์ ํ ์ ์์๋ค๋ฉด ํผ๋ธ๋ฆฌ์ฑ ๊ณผ์ ์ด ๋ ์ํํ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ ๋ค๊ณ ์ผ๋ฐฉ์ ์ผ๋ก ํ์ชฝ ํ๋ง ํ ์๋ ์์์ต๋๋ค. ์ค๋ฌด์์๋ ์ด๋ฐ ๊ฒฝ์ฐ๊ฐ ๋น์ผ๋น์ฌํ๋ค๊ณ ๋ค ํ๊ธฐ๋ ํ๊ณ (๋๋๊ฒ๋ ์ด๋ณด๋ค ๋ํ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ๋ ํ๊ณ ์), ์ ํฌ ํ๋ ์ด์จ๋ ์ฃผ์ด์ง ์๊ฐ ์์ ํ๋ก์ ํธ๋ฅผ ์ด๋ป๊ฒ๋ ์์ฑํด ๊ฒฐ๊ณผ๋ฌผ์ ๊ตฌํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ ๊ฐ๋ฐ ๋จ๊ณ์์ ์์ฌ์ด ๋ถ๋ถ๋ค๋ ์์์ต๋๋ค.
์ด๋ค ์ํฉ์์๋ ์ ์ฐํ๊ฒ ๋์ฒํ๋ ๊ฐ๋ฐ์ ์ํด์, ํ๋ก์ ํธ ์ด๊ธฐ์ ์๊ฐ์ ์ข ๋ ๋ค์ฌ ๋ณด๋ค ์ฒด๊ณ์ ์ธ ๊ณํ๊ณผ ์ค๊ณ๋ฅผ ๋ง๋ค์๋ค๋ฉด ํ๋ก์ ํธ ์ค๊ฐ์ ๊ณ ํต๋ฐ๋ ์ผ์ด ์์์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ํ์ง๋ง ์ผ๋จ ์ด๋ป๊ฒ๋ ๋ง๋ค๊ณ ๋ณด์๋ ๋ง์์ ์ ๋๋ก ์ค๋น๋ฅผ ํ์ง ๋ชปํ ์ฑ ๊ฐ๋ฐ์ ์์ํ๊ณ , ๊ทธ๋ฌ๋ค๋ณด๋ ๊ณ์ํด์ ์๊ฒฌ์ด ๋ฐ๋๋ ๋ฐ๋์ ๊ฐ์ ์ปดํฌ๋ํธ๋ ํ์ด์ง๋ฅผ ๋ช๋ฒ์ด๊ณ ๋ค์ ์์ ํด์ผ ํ๋ ์๊ฐ๋ค์ด ์์์ด์. ์ต์ํ ๊ธฐ๋ฅ ๋ช ์ธ๋ผ๋ ๋ง๋ค๊ณ ์์ํ์ด์ผ ํ๋ค๋ ์๊ฐ์ด ๋จธ๋ฆฌ๋ฅผ ์ค์ณค์ต๋๋ค.
๊ทธ๋์ ์ด๋ฐ์ ๋ฐ ์ํฉ์ ์๊ธฐ์๋ณ์์ผ๋ก ๋์ฒํ๋ค ๋ณด๋, ์ผ์ ์ ์ฐจ์ง์ด ์๊ธฐ๊ธฐ ์์ํ์ต๋๋ค. ๊ฒฐ๊ตญ ํธ๊ธฐ๋กญ๊ฒ ์์ํ๋ ํ๋ก์ ํธ๋ ์ด๋์ ์ด๊ฒ๋ง์ด๋ผ๋ ์ ๋๋ก ๊ตฌํํด๋ณด์๋ ์ํ๋ก ์งํ๋๊ณ , ๊ฒฐ๊ตญ ํ๋ก์ ํธ์์ 100% ํ์ฉํด ๋ณด๊ณ ์ถ์๋ ๊ฒ๋ค์ ํ์ฉํ์ง ๋ชปํ์ต๋๋ค.
ํ ๋งํ ๋ค ํ๋ก์ ํธ์ ์ฐ๊ธ๋ณต๊ถ์ ๊ณตํต์ ์ด๋ผ๋ฉด โ๋ญ๊ฐ ๊ณ์ ๋์จ๋คโ๋ผ๋ ๊ฒ๋๋ค.
๊ทธ๋๋ 3์ฃผ๋ผ๋ ๊ธฐ๊ฐ๋์ ์๋ฌด๊ฒ๋ ์ป์ด๊ฐ์ง ๋ชปํ ๊ฒ์ ์๋๋๋ค. ์ฐ์ Next.js๋ฅผ ํ์ฉํด ๋ณธ ๋ ๋ฒ์งธ ํ๋ก์ ํธ์ด๊ธฐ๋ ํ์ต๋๋ค. ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค๋ฉด์ ์ ์ฉํด ๋ณธ ๊ฒ๊ณผ, ํ ๋งํ ๋ค์ ๋ง๋ค๋ฉด์ ์ ์ฉํด๋ณธ ๋ถ๋ถ๋ค์ด ์๋ก ๋ฌ๋๊ธฐ์ ์ํธ๋ณด์์ ์ผ๋ก ๋ฆฌํฉํ ๋ง์ ์งํํ ์ ์์ ๊ฒ ๊ฐ์์. ๋ํ ๋ค์ํ ์ํฉ์ ๋์ฒํ๊ธฐ ์ํด์ ์ข์ ์ด์์ ์์์ผ ํ๋ ์ด์ ๋ฅผ ๋ชธ์ ๋๊ผ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด์ง๋ค์ด์ ๊ณผ ๊ฐ์ด ๋ ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด๋ณด๋ ๊ฒฝํ๋ ๊ฐ์ ธ๊ฐ ์ ์์๊ณ ์. ์ฒ์ ์ฌ์ฉํด๋ณด๋ ํด๋ ๊ตฌ์กฐ๋ฅผ ์ ์ฉํด ๋ณธ ๊ฒ๋ ์๊ณ , ๋์๋ณด๋ฉด ๋ฐฐ์ ๋ ์ ๋ค์ด ๊ฝค ๋ง์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ฌด์๋ณด๋ค๋, ๋ค์ ํ๋ฒ ๋ด๊ฐ ๋ฌด์์ ๋ชจ๋ฅด๋์ง ์๊ฒ ๋๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ๊ฒ ๊ฐ์ต๋๋ค. ์ค์ค๋ก ์ด๋ค ๋ถ๋ถ์ด ๋ถ์กฑํ๊ณ , ์ด๋ค ๋ถ๋ถ์ ์ด๋ป๊ฒ ์ฑ์๋๊ฐ์ผ ํ๋์ง๋ฅผ ์กฐ๊ธ ๋ ๋ช ํํ๊ฒ ์ ์ ์์๋ 3์ฃผ์์ด์. ํ๋ก๊ทธ๋จ ๊ธฐ๊ฐ์ ๋๋ฌ์ง๋ง ์์ง ํ ๋งํ ๋ค์ ๋๋์ง ์์๊ณ , ๋ค์์ฃผ๋ถํฐ ๋ ํ์๋ค๊ณผ ๋ฆฌํฉํ ๋ง ๊ณํ์ ๋ํด์ ์ด์ผ๊ธฐํด ๋ณผ ์์ ์ ๋๋ค.