implement
스타3
포크1
업데이트2026년 4월 28일 14:43
FE 코드 구현 실행 (FSD 아키텍처 준수)
설치
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SKILL.md
readonly메뉴
FE 코드 구현 실행 (FSD 아키텍처 준수)
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
DEV 환경 배포 (develop 브랜치 머지)
로컬 개발 서버 기동 (Next.js dev + Turbopack)
PROD 환경 배포 (main 브랜치 머지)
FE 구현 계획 수립 (FSD 아키텍처, 컴포넌트, API 연동)
PR 생성 & GitHub 푸시
요구사항 분석 & FE 변경 영향도 파악
| name | implement |
| description | FE 코드 구현 실행 (FSD 아키텍처 준수) |
| context | fork |
| allowed-tools | Read, Grep, Glob, Bash, Write, Edit |
구현 계획을 기반으로 실제 코드를 작성한다. FSD 아키텍처 규칙을 엄격히 준수하며, 구현 순서를 따른다.
TICKET_ID: 티켓 ID.plan/{TICKET_ID}/plan.md.ai/rules/architecture.md.ai/rules/coding-standards.mdgit checkout -b {feat|fix|modify}/{TICKET_ID}-{kebab-summary}
반드시 아래 파일을 먼저 읽는다:
.ai/rules/architecture.md — FSD 계층 규칙, 참조 제약.ai/rules/coding-standards.md — 네이밍, 스타일, 디자인 시스템 규칙반드시 이 순서를 따른다. 건너뛰지 않는다.
1a. 공통 타입 (필요 시)
// src/shared/type/{Domain}.ts
export interface Todo {
id: string;
content: string;
// ...
}
1b. 도메인 타입
// src/model/{domain}/types.ts
export interface CreateTodoRequest {
content: string;
// ...
}
model/)2a. API 함수
// src/model/{domain}/api.ts
import { apiClient } from '@/shared/lib/apiClient';
const TodoApi = {
getList: (params: Params) => apiClient.get<Response>('/todos', { params }),
create: (req: CreateRequest) => apiClient.post<Response>('/todos', req),
};
2b. Query Key 팩토리
// src/model/{domain}/queryKeys.ts
export const TodoQueryKeys = {
all: ['todo'] as const,
list: (params: Params) => [...TodoQueryKeys.all, 'list', params] as const,
detail: (id: string) => [...TodoQueryKeys.all, 'detail', id] as const,
};
2c. Query/Mutation Options
// src/model/{domain}/queries.ts
import { queryOptions, mutationOptions } from '@tanstack/react-query';
export const TodoQuery = {
getList: (params: Params) => queryOptions({
queryKey: TodoQueryKeys.list(params),
queryFn: () => TodoApi.getList(params),
}),
};
export const TodoMutation = {
create: () => mutationOptions({
mutationFn: TodoApi.create,
}),
};
2d. React Context (필요 시)
// src/model/{domain}/{contextName}/context.tsx
// Split State/Actions 패턴 사용
interface State { /* 상태 필드 */ }
interface Actions { /* 액션 함수 */ }
const StateContext = createContext<State | null>(null);
const ActionsContext = createContext<Actions | null>(null);
export function Provider({ children }: { children: React.ReactNode }) {
// ...
}
export const useXxxState = () => { /* ... */ };
export const useXxxActions = () => { /* ... */ };
shared/) — 필요 시에만기존 디자인 시스템 컴포넌트를 수정하거나 새로 추가하는 경우에만.
// src/shared/components/{category}/{ComponentName}.tsx
'use client';
interface ComponentNameProps {
// Props 정의
}
export default function ComponentName({ ...props }: ComponentNameProps) {
return (
// Tailwind + CSS 변수로 스타일링
);
}
feature/)4a. 도메인 UI 컴포넌트
// src/feature/{domain}/components/{ComponentName}.tsx
'use client';
import { Button } from '@/shared/components/input/Button/Button';
import { useQuery } from '@tanstack/react-query';
import { TodoQuery } from '@/model/todo/queries';
interface Props { /* ... */ }
export default function TodoItem({ ...props }: Props) {
// 디자인 시스템 컴포넌트 활용
return (
<div className="flex items-center gap-2">
<Button variant="primary" size="sm">완료</Button>
</div>
);
}
4b. 도메인 커스텀 훅 (필요 시)
// src/feature/{domain}/hooks/use{HookName}.ts
export function useTodoForm() {
// React Hook Form + Zod
}
4c. 도메인 폼 (필요 시)
// src/feature/{domain}/forms/{FormName}.tsx
'use client';
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';
const schema = z.object({
content: z.string().min(1, '내용을 입력해주세요').max(100, '100자를 초과할 수 없습니다'),
});
4d. 배럴 export
// src/feature/{domain}/index.ts
export { default as TodoItem } from './components/TodoItem';
export { default as TodoForm } from './forms/TodoForm';
composite/)// src/composite/{domain}/{pagePart}/{ComponentName}.tsx
'use client';
import { TodoItem } from '@/feature/todo';
import { useTodoState } from '@/model/todo/todoList/context';
export default function TodoListSection() {
const { todos } = useTodoState();
return (
<section>
{todos.map(todo => <TodoItem key={todo.id} todo={todo} />)}
</section>
);
}
app/)// src/app/(home)/{domain}/page.tsx
import TodoListSection from '@/composite/{domain}/todoList/TodoListSection';
export default function TodoPage() {
return <TodoListSection />;
}
구현 완료 후 반드시 실행:
cd /Users/sagwangjin/Desktop/growit-test/DDD-12-GROWIT-FE && yarn lint
cd /Users/sagwangjin/Desktop/growit-test/DDD-12-GROWIT-FE && npx tsc --noEmit
cd /Users/sagwangjin/Desktop/growit-test/DDD-12-GROWIT-FE && yarn build
모든 검증 통과 후 커밋한다.
git add {specific files}
git commit -m "{type}: {description}"
feat: 새 기능fix: 버그 수정refactor: 리팩토링style: 스타일/포맷chore: 기타docs: 문서test: 테스트git add -A 또는 git add . 금지. 파일 지정만 사용.
<button>, <input>) 대신 디자인 시스템 컴포넌트 사용.any 타입 사용 금지.useEffect 내 직접 API 호출 금지 — TanStack Query 사용.