react-nextjs-pages
Next.js Pages Router 프로젝트 컨벤션. 라우팅, pageInfo, Import 순서, 컨테이너/뷰 패턴.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Next.js Pages Router 프로젝트 컨벤션. 라우팅, pageInfo, Import 순서, 컨테이너/뷰 패턴.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| 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/ |
새 코드 작성 전 체크리스트:
세션 핸드오프. 컨텍스트가 차기 전에 중요 맥락을 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 돌려줘", "화면 테스트 만들어줘", "이 페이지 자동 테스트" 등의 요청에 사용.