react-nextjs-pages
Next.js Pages Router 프로젝트 컨벤션. 라우팅, pageInfo, Import 순서, 컨테이너/뷰 패턴.
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
Next.js Pages Router 프로젝트 컨벤션. 라우팅, pageInfo, Import 순서, 컨테이너/뷰 패턴.
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
세션 핸드오프. 컨텍스트가 차기 전에 중요 맥락을 progress.md에 문서화하고 새 세션 킥오프 프롬프트를 클립보드에 복사한다. "핸드오프", "세션 정리하고 넘기자", "컨텍스트 정리", "이어갈 준비" 등의 요청에 사용.
MD 파일 또는 텍스트로 작업을 정의하면, 분석 → 디자인 확인 → 구현 → 검증 → 커밋 → PR까지 전체 플로우를 수행한다. "이거 만들어줘", "기능 구현해줘", "작업 시작하자", "이 티켓 진행해줘" 등 코드 작업 착수 발화에 사용.
Claude + OpenAI Codex 협업 스킬. MCP 서버 설정 시에만 사용 가능.
code-forge 상태 대시보드. REFLECT flag, quality 이벤트, notepad/decisions, usage 집계를 한 번에. forge-glow 같은 외부 도구는 --json으로 파싱.
교차 모델 토론. Agent Teams / Codex CLI / self-debate 모드 선택. 설계 결정, 아키텍처 선택 시 활용. "어느 쪽이 나을까", "설계 비교해줘", "토론시켜줘", "교차 검증해줘" 등의 요청에 사용.
화면 단위 E2E 테스트 자동화. Figma/코드 기반 테스트 케이스 도출 → Playwright 코드 생성 → Forge Loop(에스컬레이션 기반 자율 실행). "E2E 돌려줘", "화면 테스트 만들어줘", "이 페이지 자동 테스트" 등의 요청에 사용.
| name | react-nextjs-pages |
| description | Next.js Pages Router 프로젝트 컨벤션. 라우팅, pageInfo, Import 순서, 컨테이너/뷰 패턴. |
이 프로젝트는 Next.js 14 Pages Router를 사용한다. App Router 패턴을 적용하지 않는다.
apps/{app}/
├── pages/ # 라우팅 진입점 (얇게 유지)
└── src/ # 도메인별 로직
pages/ 파일은 얇게 유지src/{도메인}/ 아래에 분리페이지 컴포넌트에 pageInfo static 속성으로 레이아웃을 지정한다:
const OrderPage: NextPageWithLayout = () => {
return <OrderContainer />;
};
OrderPage.pageInfo = {
routeKey: RouteKey.ORDER,
layout: Layout.ORDER,
};
export default OrderPage;
// ✅ 좋은 예: 페이지는 얇게, 로직은 src로 분리
// pages/order/[orderId].tsx
import { OrderContainer } from '@/order/containers/OrderContainer';
const OrderPage: NextPageWithLayout = () => {
return <OrderContainer />;
};
OrderPage.pageInfo = {
routeKey: RouteKey.ORDER,
layout: Layout.ORDER,
};
export default OrderPage;
// ❌ 나쁜 예: 페이지에 로직이 모두 포함됨
// pages/order/[orderId].tsx
const OrderPage = () => {
const { orderId } = useRouter().query;
const { data } = useQuery(...);
// 수백 줄...
};
아래 순서를 반드시 지킨다:
// 1. 외부 라이브러리
import { useState } from 'react';
import { useQuery } from '@tanstack/react-query';
// 2. @repo/shared (모노레포 공유 패키지)
import { Button } from '@repo/shared/components';
import { useOrderQuery } from '@repo/shared/queries/order';
// 3. 상대 경로 (현재 앱 내부)
import { OrderHeader } from './components/OrderHeader';
import { formatPrice } from '../utils/format';
// ❌ 나쁜 예: 순서가 뒤섞임
import { OrderHeader } from './OrderHeader';
import { useState } from 'react';
import { Button } from '@repo/shared/components';
const PageName: NextPageWithLayout = () => {}const ComponentName = () => {} 또는 function ComponentName() {}interface OrderCardProps {
order: Order;
onSelect: (id: string) => void;
}
const OrderCard = ({ order, onSelect }: OrderCardProps) => { ... };
@/는 각 앱의 src 기준 (예: apps/{app-1}/src)@repo/shared는 모노레포 공용 패키지/api/* → NEXT_PUBLIC_API_URL로 프록시// ❌ 나쁜 예: 프론트엔드에서 직접 외부 API 호출
const data = await axios.get('https://api.example.com/orders');
// ✅ 좋은 예: /api 프록시 경유
const data = await api.get('/api/orders');
| 유형 | 규칙 | 예시 |
|---|---|---|
| 페이지 | kebab-case 또는 [param] | order-list.tsx, [orderId].tsx |
| 컴포넌트 | PascalCase | OrderCard.tsx |
| 훅 | camelCase, use 접두사 | useOrderStatus.ts |
| 유틸리티 | camelCase | formatDate.ts |
| 타입 | PascalCase, types 접미사 | order.types.ts |
| 스타일 | 컴포넌트명.styles | OrderCard.styles.ts |
새로운 기능을 구현하기 전에 반드시 기존 코드에서 유사 패턴을 찾는다:
| 구현 대상 | 탐색 경로 |
|---|---|
| 앱 도메인 관련 | apps/{앱이름}/src/{도메인}/ |
| 공용 컴포넌트 | packages/shared/components/ |
| 공용 훅 | packages/shared/hooks/ |
| 공용 타입 | packages/shared/types/ |
새 코드 작성 전 체크리스트: