Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 중복문자제거
- 객체의 밸류값만 찾기
- lastIndexOf()
- 재귀스왑
- 중첩배열평탄화
- 스프링 데이타 JPA
- 배엘에서 스왑
- 우분투 시간 변경
- sql 문자열 패턴 검색
- 레디스 확인
- 중복단어제거
- 5.3.8 Modifying Queries
- 중복 문자열
- ...점점점문법
- indexOf()
- 객체의키값만 찾기
- 시퀄 문법
- 제로베이스
- 단어 제거
- 깃 토큰 만료
- 문자열순서바꾸기
- 중복된 단어
- @Moditying @Query
- 프론트엔드 스쿨
- ubuntu타임존
- js 문자열을 문자배열로
- 중첩배열
- 문자열 중복
- 코딩 어?
- 아래로펼치기
Archives
- Today
- Total
코딩기록
Next.js) 폴더명에 []대괄호 사용- 동적라우팅 본문
728x90
Next.js에서 폴더명에 [](대괄호)를 쓰는 건 **동적 라우팅(Dynamic Routing)**을 의미.
즉, 주소의 특정 부분을 변수처럼 처리하고 싶을 때 사용하는 방식이다.
✅ 예: [id] 폴더의 의미
src/app/items/[id]/page.tsx
이 구조는 /items/무언가 형태의 URL을 모두 이 페이지로 연결하겠다는 뜻이다.
예를 들어:
주소 처리되는 값 (id)
/items/check1 | "check1" |
/items/some-product | "some-product" |
/items/123 | "123" |
이때 이 id 값은 useParams() 또는 PageProps를 통해 접근할 수 있다.
✅ 어떻게 동작하나요?
1. URL 접속
브라우저에서 /items/check1에 접속
2. [id]/page.tsx 실행
Next.js는 check1을 id 값으로 인식
3. 코드에서 사용
export default function Page({ params }: { params: { id: string } }) {
return <div>상품 ID: {params.id}</div>;
}
혹은 클라이언트 컴포넌트라면:
"use client";
import { useParams } from "next/navigation";
const ItemDetail = () => {
const params = useParams(); // { id: "check1" }
return <div>상품 ID: {params.id}</div>;
};
✅ 왜 유용한가요?
- 상품 상세 페이지, 게시글 상세 페이지, 사용자 프로필 등 id 기반으로 조회되는 페이지를 만들 때 유용하다.
- URL에 따라 하나의 컴포넌트로 다양한 데이터를 렌더링할 수 있다.
📦 관련 기능
기능 설명
[id] | 경로의 동적 세그먼트를 의미함 |
generateStaticParams() | 빌드 시 가능한 id 목록을 미리 생성해줌 (정적 사이트용) |
useParams() | 클라이언트에서 URL param 접근 |
params: { id } | 서버 컴포넌트에서 param 접근 방식 |
Next.js에서는 동적 라우팅을 좀 더 유연하게 처리하기 위해 **선택적(optional)**이거나 여러 개를 한번에 잡는(catch-all) 경로를 만들 수 있다.
✅ 1. 기본 동적 라우팅
/pages/items/[id].tsx
- /items/123 → id = "123"
- id가 무조건 있어야 함
✅ 2. 선택적 경로 (Optional Catch-All)
/pages/items/[[...slug]].tsx
- slug는 배열로 들어옴
- 있어도 되고, 없어도 됨
예시
URL slug 값
/items | undefined |
/items/a | ["a"] |
/items/a/b | ["a", "b"] |
코드 예
import { useParams } from "next/navigation";
export default function Page() {
const params = useParams();
const slug = params?.slug ?? []; // [] or ['a', 'b']
return <div>경로: {slug.join(" / ")}</div>;
}
✅ 3. 캐치올 라우트 (Catch-All)
/pages/items/[...slug].tsx
- slug는 배열로 들어옴
- 최소 하나 이상 있어야 함
예시
URL slug 값
/items/a | ["a"] |
/items/a/b | ["a", "b"] |
/items | ❌ 404 (없음!) |
✨ 요약 비교
폴더명 or 파일명 필수 여부 값 형태 설명
[id] | ✅ 필수 | string | /items/1 |
[...slug] | ✅ 필수 | string[] | /items/a/b (없으면 404) |
[[...slug]] | ❌ 선택 | string[] | /items, /items/a 등 모두 가능 |
필요한 상황에 맞게 유동적으로 사용할 수 있다.
예를 들어:
- [id] → 단일 상품 조회
- [...slug] → 카테고리 + 필터 조건 등 다단계 경로
- [[...slug]] → 메인 페이지에서도 필터가 있을 수 있을 때
참고 쳇지피티
반응형
'프론트 > 리액트' 카테고리의 다른 글
리액트, Next.js) height를 부드럽게 열고 닫는 framer-motion 라이브러리 (2) | 2025.06.26 |
---|---|
색상에 따라 텍스트 배경 바꾸기 (0) | 2025.06.20 |
Carousel) Swiper(스와이퍼)- 반응형 슬라이드(캐러셀) 라이브러리 (0) | 2025.06.18 |
문법) 'use client'를 작성하는 이유- 서버 컴포넌트, 클라이언트 컴포넌트 (0) | 2025.06.11 |
반복되는 JSX 문법 .map으로 간략하게 (0) | 2025.06.10 |
Comments