CRUD 앱을 위한 vibe 코딩 프롬프트로 화면, 인증·역할, 그리고 PostgreSQL 기반 API까지 생성하세요. 복사-붙여넣기 가능한 프롬프트 세트와 문제 해결 팁 포함.

이 프롬프트 세트는 완전한 작동 CRUD 앱을 생성하도록 설계되었습니다: 사람들이 사용하는 화면(UI), 요청을 처리하는 API, 그리고 데이터를 저장하는 PostgreSQL 데이터베이스까지 포함합니다. 또한 로그인과 역할 기반 접근 제어(auth, RBAC)를 포함하므로 서로 다른 사용자가 서로 다른 것을 보고 수행할 수 있습니다.
CRUD는 앱이 필요로 하는 네 가지 일상적 동작일 뿐입니다:
프론트엔드에서는 예측 가능한 화면 세트가 나오게 됩니다: 목록 페이지, 상세 페이지, 생성 폼, 수정 폼, 그리고 로그인 페이지와 기본 네비게이션. 백엔드에서는 이러한 화면과 일치하는 엔드포인트(목록, id로 조회, 생성, 업데이트, 삭제)가 있고, Postgres 테이블과 간단한 검증으로 뒷받침됩니다.
프롬프트 품질이 모델 선택보다 더 중요합니다. 모델은 당신이 지정한 것만 따릅니다. 프롬프트가 모호하면 필드명이 어긋나고, 라우트가 빠지거나, 인증이 불완전하거나, UI와 API가 맞지 않는 결과가 나옵니다. 정확한 프롬프트는 계약처럼 작동합니다: UI, API, DB가 같은 이름과 규칙에 합의합니다.
시작하기 전에 몇 가지 세부사항을 결정하세요. 이러면 빌드 일관성이 유지됩니다:
Koder.ai를 사용하면 이 모든 과정이 하나의 대화로 React UI, Go API, PostgreSQL 스키마를 일관되게 생산할 수 있습니다.
좋은 CRUD 빌드의 시작은 작은 결정들에 있습니다. 먼저 적어두면 프롬프트가 명확해지고 화면도 올바르게 보이며 API가 DB와 일치합니다.
하나의 핵심 엔티티로 시작하세요. 이 엔티티는 앱이 매일 관리하는 “대상”(Item, Customer, Appointment)입니다. 두 번째 엔티티는 정말 처음부터 필요할 때만 추가하세요(예: Item에 Category가 꼭 필요할 때). 세 개나 네 개로 시작하면 관계 정리에 시간을 많이 쓰게 됩니다.
엔티티 필드는 타입과 예시를 함께 적으세요. 예시는 라벨, 포맷, 검증을 안내합니다.
다음으로 역할과 권한을 평문으로 나열하세요. 구체적으로 적되 간결하게. 많은 앱에서 2~3개의 역할이면 충분합니다:
마지막으로 5~10개의 샘플 레코드를 만드세요. 샘플 데이터는 현실적인 UI 레이블, 드롭다운 옵션, 기본값을 결정합니다. 예(재고): “Hand soap, qty 6, reorder_date 2026-01-20, status low”.
Koder.ai에서 작업한다면, 이 워크시트를 첫 프롬프트에 붙여 넣어 플랫폼이 화면, 인증, PostgreSQL 기반 API 전반에서 앱을 일관되게 유지하도록 하세요.
하나의 “규칙” 프롬프트로 시작하세요. 이 프롬프트는 UI, API, DB 전반에서 일관성을 유지하고, 나중에 기능을 추가할 때 반복 작업을 줄여줍니다.
코드 작성 전에 짧은 계획을 요구하세요. 모델이 화면과 라우트, 테이블, API 엔드포인트를 이름으로 제시하게 하세요. 또한 가정 사항(예: 어떤 역할이 존재하는지)을 미리 명시하고, 변경이 필요하면 승인을 받도록 요구하세요.
여기에 복사-붙여넣기 가능한 기본 프롬프트가 있습니다:
You are building a complete full-stack CRUD app.
Tech targets (do not change):
- Frontend: React web app
- Backend: Go REST API
- Database: PostgreSQL
Before writing any code, produce a short plan (max 25 lines) that includes:
1) Screens + key UI components
2) Routes/navigation
3) Roles and permissions
4) PostgreSQL tables (with columns and relationships)
5) API endpoints (method + path) for auth and CRUD
Assumptions:
- If any detail is missing, make a reasonable default and list it under “Assumptions”.
- Keep assumptions consistent across UI, API, and DB. If you must change an assumption, stop and ask.
Rules:
- Use simple, boring CRUD first. No “nice to have” features unless asked.
- Include input validation, basic error messages, and loading states.
- Use clear names that match across layers (same field names in UI, API, and DB).
Non-goals (do NOT implement):
- Payments, subscriptions, invoices
- Complex workflows/approvals
- Multi-tenant org hierarchy
- Real-time chat/notifications
Now ask me 5 clarifying questions max. If I answer “default”, proceed with your assumptions.
예를 들어 계획에서 role: admin|member를 선택하면 이후에 manager를 임의로 도입해선 안 됩니다. 이 프롬프트는 변경이 필요하면 반드시 승인을 받도록 강제합니다.
좋은 화면은 우선 명확한 페이지 맵에서 나옵니다. 데이터베이스나 API 코드를 요청하기 전에 아래 프롬프트를 사용하세요. 이렇게 하면 나중에 라우트와 UI 이름이 안정되어 사소한 불일치로 인한 문제가 줄어듭니다.
You are building a full-stack CRUD app UI. Start by proposing a complete page list and user flows.
App concept (1 sentence): <PASTE YOUR APP CONCEPT>
Entities (list): <ENTITY_1>, <ENTITY_2>
Roles: <ROLE_1>, <ROLE_2> (include an Admin role)
Deliverables:
1) A table of pages with: Route, Page name, Who can access, Primary actions, Empty state behavior.
2) Key user flows (bullets): sign up, sign in, create record, edit, delete, search/filter, admin manages users.
3) Route naming rules: kebab-case paths, consistent singular/plural, no duplicates.
4) Component naming rules: PascalCase, one top-level page component per route.
Ask me 5 questions max only if needed.
답변을 받은 뒤 이름을 고정(lock)하세요. 나중에 라우트 이름을 바꾸면 API와 테스트가 엇갈립니다.
Using the approved page list and route names, generate:
A) Navigation
- A simple top nav for desktop and a compact mobile menu.
- Show which items appear for each role.
- Add a clear "You do not have access" page and redirect rules.
B) Page skeletons
For each page, create a minimal UI with:
- A visible page title and short helper text.
- Loading state, empty state, error state.
- A primary button for the main action.
C) Accessible forms
For all create/edit forms:
- Labels tied to inputs, required markers, inline validation errors.
- Disable submit while saving, show a spinner, prevent double submits.
- Toast or inline success message after save.
D) Consistent action names
Use these verbs exactly: list, view, create, update, delete.
Use these UI actions: onCreate, onUpdate, onDelete, onSearch.
UI가 너무 복잡하면 하나의 레이아웃, 하나의 테이블 스타일, 하나의 폼 패턴만 유지하라고 요청하세요.
예측 가능한 결과를 원하면 사용자가 어떻게 로그인하고 세션이 얼마나 유지되는지, 각 역할이 무엇을 할 수 있는지 명시하세요. 아래 프롬프트는 간단한 이메일+비밀번호 로그인과 세션 기반 방식을 가정합니다(화면과 API 모두 테스트하기 쉬움).
먼저 로그인/로그아웃/세션 처리를 생성하려면 다음을 붙여넣으세요:
Implement authentication for this app.
Requirements:
- Add UI screens: Login, Logout action, and a simple “My account” page that shows the logged-in user email and role.
- Use email + password login.
- Session handling: keep the user logged in across refresh; include a clear “Log out” button.
- API endpoints: POST /auth/login, POST /auth/logout, GET /auth/me.
- Show friendly error messages for wrong password, unknown email, and locked/disabled accounts.
Security (keep it simple):
- Password rules: minimum 12 characters; must include at least 1 letter and 1 number.
- Store passwords securely (hash + salt). Never store plain text.
- Basic protections: rate-limit login attempts per email/IP and return generic error text that doesn’t reveal which part was wrong.
Deliverables:
- Working UI flows + backend endpoints.
- Seed one default admin user for local testing and tell me the credentials.
- Add clear comments explaining where to change password rules and session duration.
이제 역할과 보호 규칙을 추가하세요. 테스트가 쉬운 간단한 권한 체계를 유지하세요:
Add role-based access control (RBAC) with these roles: admin, manager, viewer.
Rules:
- admin: can create, edit, delete, and manage users/roles.
- manager: can create and edit records, cannot delete, cannot manage users.
- viewer: read-only.
Enforcement:
- Protect both routes (screens) and API endpoints. Do not rely on the UI alone.
- If a user lacks permission, show a “Not allowed” page in the UI and return HTTP 403 from the API.
Deliverables:
- A simple “Users” admin screen to list users and change roles.
- A clear table (in text) mapping each route + API endpoint to required role.
- Add automated checks or middleware so every protected endpoint enforces the rules.
간단한 수동 점검 항목들:\n\n- 각 역할로 로그인하고 볼 수 있는 것과 못 보는 것을 확인하세요.\n- 제한된 동작(예: 삭제)을 직접 시도하고 403을 받는지 확인하세요.\n- 로그아웃이 세션을 지우고 앱이 로그인 화면으로 돌아가는지 확인하세요.
Koder.ai를 사용한다면, 인증과 RBAC 변경을 하나의 스냅샷으로 유지해 권한이 엉킬 경우 되돌리기 쉽도록 하세요.
좋은 스키마 프롬프트는 두 가지 임무를 수행합니다: 명확한 테이블 관계를 강제해 화면과 API가 일치하게 하고, 누락된 인덱스나 타임스탬프, 역할 매핑 같은 “거의 맞는” 데이터베이스를 방지합니다.
붙여넣기 전에 두 가지 토글을 결정하세요(각각 한 줄):
uuid or bigserialyes (use deleted_at) or no (hard delete)먼저 이 프롬프트를 붙여 넣어 데이터 모델을 고정하세요:
You are building the PostgreSQL data model for a full-stack CRUD app.
Domain: <DESCRIBE YOUR APP IN 1 SENTENCE>
Core entities: <LIST 3-6 ENTITIES>
Rules:
- Use PostgreSQL.
- Choose primary key type: <uuid|bigserial>.
- Timestamps: every table must have created_at and updated_at.
- Soft delete: <yes|no>. If yes, add deleted_at and default queries should ignore deleted rows.
- Define users, roles, and permissions storage:
- users table (email unique, password_hash, status)
- roles table (name unique)
- user_roles join table (user_id, role_id) with unique(user_id, role_id)
- For each core entity: define columns, types, required vs optional, and relationships.
- Call out any many-to-many relationships and introduce join tables.
- Propose indexes for common lookups (foreign keys, email, name/search fields).
Output:
1) A short ERD description in plain English.
2) The final table list with columns and constraints.
3) The index list with rationale.
그다음 프로젝트에 맞는 마이그레이션/설정 단계를 생성하려면 이 프롬프트를 붙여 넣으세요:
Now generate the actual database setup for this project.
Requirements:
- Provide SQL migrations (up and down) for all tables, constraints, and indexes.
- Ensure foreign keys and on-delete behavior are explicit.
- Include extensions you rely on (for example uuid generation), but only if needed.
- Add a seed migration for: one admin user, one admin role, and the user_roles link.
Output:
- migrations/ file names in order
- contents of each up/down migration
- brief notes on how to apply migrations in the project
모호한 점이 있으면 한 줄 더 추가하세요: “관계나 필드가 불분명하면 SQL 작성 전에 최대 5개의 질문을 하세요.”
백엔드 출력물이 계속 미완성으로 돌아온다면, 이 프롬프트는 기본 사항을 강제합니다: 명확한 라우트, 검증, 페이지네이션, 각 핸들러의 역할 검사.
아래를 그대로 복사한 뒤 플레이스홀더(RESOURCE, FIELDS, ROLES)를 프로젝트에 맞게 교체하세요.
You are building the backend API in Go for a Postgres-backed CRUD resource.
Resource
- RESOURCE name (singular/plural): <Item/items>
- Table: <items>
- Primary key: <id UUID>
- Fields (name, type, required?, rules):
- <name TEXT required, 2..80 chars>
- <qty INT required, min 0>
- <status TEXT optional, one of: active, archived>
- Ownership: <tenant_id UUID required> and <created_by UUID required>
Auth and roles
- Roles: <admin, manager, viewer>
- Authorization rules:
- Every endpoint must check role and tenant_id.
- admin: full access
- manager: create, read, update, list; cannot delete
- viewer: read and list only
API requirements
1) Implement REST endpoints:
- POST /api/items
- GET /api/items/{id}
- PUT /api/items/{id}
- DELETE /api/items/{id}
- GET /api/items
2) Define request/response JSON shapes for each endpoint, including examples.
3) Validation
- Return 400 with field-level errors (clear messages) when invalid.
- Return 401 if no auth, 403 if role not allowed, 404 if not found in tenant.
4) List endpoint
- Support filtering by: <status>
- Support sorting by: <created_at,name> with order asc/desc
- Support pagination: page, page_size; return total, page, page_size, items.
5) Data access
- Use database/sql (or pgx) with parameterized queries only.
- Include migrations SQL for the table and indexes (tenant_id + created_at).
Deliverables
- Go code: routes, handlers, DTOs, validation helpers, repository layer
- SQL: migration(s)
- Notes: any assumptions
생성 후 한 번 더 일관성 검사를 하세요: 상태 코드와 에러 바디가 맞는지, 리스트 엔드포인트가 안정적 정렬을 반환하는지, 각 핸들러가 역할과 tenant 소유권을 확인하는지 등.
Koder.ai를 사용한다면 백엔드는 Go, DB는 PostgreSQL로 유지해야 내보낸 코드가 예상 스택과 일치한다고 명시하세요.
모든 것(UI, API, DB)을 생성한 뒤 엄격한 검증 모드로 전환하세요. 목표는 전체 루프가 작동함을 증명하는 것입니다: UI - 인증 - 역할 - Postgres - API - UI.
앱을 실행하고 홈 화면을 불러오세요. 내비게이션이 작동하고 플레이스홀더 데이터가 보이지 않는지 확인하세요. 페이지가 빈 화면이면 첫 번째로 보이는 에러 메시지(UI 토스트, 콘솔, 서버 로그)를 기록하세요.
역할별 테스트 계정을 하나씩 생성하고 각 계정으로 로그인/로그아웃하세요. 앱 어딘가에 역할이 표시되는지(프로필 메뉴, 설정, 작은 배지 등) 확인하세요.
하나의 CRUD 화면을 선택해 전체 사이클을 수행하세요: 레코드 생성 → 새로고침 → 편집 → 삭제. 핵심 검증은 지속성입니다: 새로고침 후 레코드는 메모리가 아니라 Postgres에 반영된 상태여야 합니다.
권한 없는 동작을 일부러 시도하세요. 가장 낮은 권한으로 로그인해 관리자 전용 화면에 접근하거나, 제한된 동작(삭제)을 API로 직접 호출해보세요. 명확한 결과(차단된 UI 또는 403 에러와 함께 데이터 변경 없음)를 원합니다.
기본 엣지 케이스를 테스트하세요: 빈 목록, 매우 긴 이름, 필수 필드 누락, 잘못된 형식(이메일, 날짜) 등. 앱이 친절한 검증 메시지를 보여주고 크래시하지 않는지 확인하세요.
Koder.ai를 사용한다면 최초의 전체 CRUD 테스트가 성공하면 바로 스냅샷을 찍으세요. 이렇게 하면 확장 전 안전한 복구 지점을 확보할 수 있습니다.
대부분의 “깨진” 빌드는 실제로는 한 가지 제약이 빠진 경우가 많습니다. UI, API, DB가 함께 움직이게 하는 제약이 없어서 생기는 문제입니다.
화면, 인증, 역할, 스키마, 모든 엣지케이스를 한 번에 요구하면 앱은 종종 불일치(라우트 불일치, 모델 드리프트, 페이지 미완성)를 일으킵니다.
해결: 레이어별로 나누고, 코드 생성 전에 무엇을 만들지 모델이 재진술하도록 강제하세요. Koder.ai에서는 여러 에이전트의 정렬에도 도움이 됩니다.
“admin과 user”만 적어두면 UI에는 역할 레이블이 있어도 서버측 권한 검사가 빠질 수 있습니다.
해결: 리소스별로 (create, read, update, delete) 같은 액션 단위로 권한을 정의하고, 모든 엔드포인트에서 서버측 강제를 요구하세요.
필드를 단순히 영어로(“price”, “date”, “status”)만 적어두면 폼은 텍스트 입력으로 렌더되지만 Postgres는 숫자/날짜/열거형을 기대하는 식의 불일치가 생깁니다.
해결: 필드 타입, null 허용 여부, 기본값, 제약을 명시하고 공통 검증 규칙을 요구하세요.
로딩과 에러 상태가 없으면 실패한 요청은 멈춘 페이지처럼 보입니다.
해결: 각 화면에 로딩 스피너, 빈 상태, 명확한 에러 메시지를 포함하도록 요구하세요.
중간에 “Projects”를 “Workspaces”로 바꾸면 라우트, 핸들러, 테이블 이름이 깨집니다.
해결: 용어집을 초기에 고정하세요. 이름을 바꿀 때는 검색/교체 + 마이그레이션 계획을 요청하세요.
문제가 생겼을 때 사용하는 수리 프롬프트:
Audit the current app and list mismatches between: (1) routes, (2) API endpoints, (3) database tables/columns, (4) UI form fields.
Then propose a minimal patch plan.
Rules: do not invent new names, do not add new features, keep existing behavior, and update tests if present.
Output: a checklist of changes, then apply them.
일관성 문제가 계속 생기면 “단일 진리의 출처” 문장을 추가하세요. 예: “Postgres 스키마가 진리의 출처다; UI와 API는 반드시 그것과 정확히 일치해야 한다.”
다듬기 전에 빠르게 앱이 실제 제품처럼 동작하는지 확인하세요. 대부분의 풀스택 CRUD 앱 실패는 화면, 규칙, 데이터 간의 작은 불일치 때문입니다.
구체적 테스트: 가장 낮은 권한으로 로그인해 기대대로 차단되는 동작(예: 삭제)을 시도하세요. 성공하면 먼저 API에서 정책을 고치고 그다음 UI를 조정하세요.
작은 IT 팀이 노트북, 모니터, 어댑터를 직원에게 대여하는 상황을 상상해보세요. 누가 무엇을 빌렸는지, 반납 기한은 언제인지 확인해야 합니다. 이 예는 역할, 몇 가지 화면, 실제 DB를 요구하기 때문에 좋은 테스트 케이스입니다.
이 내용을 그대로 복사해 준비 단계 입력으로 사용하세요(필요하면 이름을 조정):
App name: IT Equipment Loans
Goal: Track inventory and loans. Staff can request items. Admin approves and records check-out and return.
Roles:
- admin: manage inventory, approve/deny requests, edit any loan, see all
- staff: browse inventory, create a request, see own requests/loans
- viewer: read-only access to inventory and aggregate loan status
Core screens:
- Login
- Inventory list + item detail
- Request item (staff)
- Admin requests queue
- Loans list (filter: active/overdue)
Data rules:
- An item can have 0 or 1 active loan at a time
- Due date required for approved loans
- Overdue if due_date < today and not returned
Sample data:
- Items: MacBook Pro 14 (MBP-014), Dell 27 Monitor (MON-227), USB-C Dock (DOC-031)
- Users: alice(admin), ben(staff), carla(viewer)
앱을 일관되게 유지하려면 프롬프트를 다음 순서로 붙여넣으세요:\n\n1) 기본 프롬프트(글로벌 규칙, 스택, 네이밍, 에러 처리)\n2) 화면 및 내비게이션(Inventory, Requests, Loans, Admin queue)\n3) 인증 및 역할(admin, staff, viewer 권한)\n4) PostgreSQL 스키마 및 시드 데이터(items, loans, requests, users)\n5) Go CRUD API(위 규칙과 일치하는 엔드포인트와 검증)
좋은 결과의 예: staff가 “MBP-014”를 요청하면 admin이 승인하고 반납 날짜를 기록할 수 있으며, 인벤토리 목록은 해당 아이템을 대여 중으로 표시하고 차용자 이름을 보여줍니다.
빌드가 거의 맞지만 완벽하지 않다면 한 번에 한 가지씩 고치세요: 권한(예: viewer가 편집 버튼을 절대 보지 못하게), “한 아이템에 활성 대여는 하나만” 규칙 강화, 또는 UI 레이블과 DB 컬럼이 일치하도록 필드 이름을 변경하는 식으로 진행하세요.
기본이 작동하면 다음 변경을 작은 릴리스처럼 다루세요. 하나의 기능을 골라 “완료” 정의를 정하고 그 다음에 프롬프트로 추가하세요.
많은 앱에서 합리적인 다음 단계 순서:\n\n- 감사 로그: 누가 언제 무엇을 변경했는지 기록(생성, 수정, 삭제)하고 관리자 전용 화면에 표시.\n- 파일 업로드: 레코드에 문서나 이미지를 첨부하고 메타데이터는 Postgres에 저장, 접근은 인증 뒤에서 관리.\n- 간단한 알림: 인앱 알림(예: “재고 부족”, “새 댓글”)을 보여주고 읽음 표시 기능 제공.
변경이 빌드를 깨뜨리면 한 번에 모든 것을 고치려 하지 마세요. 롤백한 다음 더 작고 구체적인 프롬프트로 다시 적용하세요. Koder.ai를 사용하면 스냅샷과 롤백이 실용적인 안전망이 됩니다, 특히 DB 스키마, 인증 규칙, 공유 UI 컴포넌트를 건드릴 때 유용합니다.
또한 Planning Mode를 사용하면 기능이 여러 레이어에 걸쳐 있을 때 도움이 됩니다. 먼저 계획(화면, API 엔드포인트, DB 변경, 역할)을 재진술하게 하고, 그 계획을 승인한 뒤 코드 생성을 요청하세요. 이렇게 하면 UI가 API에서 반환하지 않는 필드를 기대하거나 API가 없는 컬럼에 쓰는 등의 불일치를 예방할 수 있습니다.
플랫폼 밖에서 계속하려면 소스 코드를 내보내어 기존 워크플로우에서 작업하세요. 프롬프트 세트를 리포지토리 옆에 “빌드 지침”으로 보관해 나중에 앱을 재생성하거나 다른 사람을 온보딩할 때 사용하세요.
Koder.ai에서 빌드하는 경우 이 프롬프트 세트는 플랫폼의 React + Go + PostgreSQL 기본값과 잘 맞아 스냅샷을 이용해 안전하게 반복 작업을 하며 요구사항을 다듬기 쉽습니다.
마지막으로, 다음 프로젝트를 위해 재사용 가능한 템플릿 프롬프트를 저장하세요. 스택, CRUD 규칙, 인증/역할 관례, Postgres 패턴 같은 안정적 부분은 그대로 두고 도메인 명사만 교체하세요. 시간이 지나면 프롬프트는 일회성 실험이 아니라 반복 가능한 레시피가 됩니다.
핵심 엔티티와 그 6–12개 필드(이름, 타입, 필수/선택, 예시)부터 시작하세요. 그런 다음 역할 + 권한을 명확한 문장으로 고정하고, 코드 생성 전에 짧은 계획을 요구하세요.\n\n권장 생성 순서(기본):\n\n- 글로벌 규칙(스택, 네이밍, 에러 처리)\n- 화면 및 라우트\n- 인증 및 RBAC\n- PostgreSQL 스키마 및 시드 데이터\n- Go CRUD API
UI, API, 데이터베이스를 하나의 계약으로 다루게 하기 때문입니다. 막연한 프롬프트는 종종 다음과 같은 불일치를 만듭니다:\n\n- UI는 한 필드명을 쓰는데 API는 다른 필드를 기대함\n- 라우트가 내비게이션과 맞지 않음\n- 인증은 UI에 있지만 서버에서는 강제되지 않음\n\n명확한 프롬프트는 이름, 규칙, 검증을 모든 레이어에서 일치시킵니다.
매일 관리할 핵심 엔티티(Customer, Task, Item 등)를 고르세요. 초기에는 하나의 엔티티만으로 시작하고, 두 번째 엔티티는 정말 필요할 때만 추가하세요.\n\n실용적인 기본값: \n\n- 1개의 메인 엔티티 + 필요하면 1개의 보조 엔티티(예: Category)\n- 타입과 예시를 포함한 6–12개의 필드\n- 명확한 CRUD 권한을 가진 2–3개의 역할
예시는 라벨, 포맷, 검증 규칙을 안내하므로 중요합니다. 단순히 “date”나 “status”만 적어두면 UI는 텍스트 입력을 만들고 DB는 날짜/열거형을 기대하는 불일치가 생깁니다.\n\n일관된 필드 형식 예: \n\n- field_name: type - example (rules)\n\n이 형식은 React 폼, Go 검증, PostgreSQL 제약이 동시에 맞춰지게 돕습니다.
최대 2–3개의 역할만 사용하고, CRUD 동사 list, view, create, update, delete에 매핑하세요.\n\n권장 기본 구성:\n\n- admin: 전체 CRUD + 사용자/역할 관리\n- manager: 생성/읽기/수정/목록 가능; 삭제 불가; 사용자 관리 불가\n- viewer: 읽기 전용(목록 + 보기)\n\n그리고 UI 라우트와 API 엔드포인트 양쪽에서 강제하세요.
둘 다 구현하고 테스트하세요:\n\n- UI 보호: 탐색 항목을 숨기고 라우트를 블록하며 “권한 없음(Not allowed)” 페이지를 표시\n- API 보호: 로그인 안 됐으면 401, 로그인은 됐지만 권한 부족이면 403 반환\n\n실용 규칙: UI가 액션을 차단하더라도 API는 직접 호출될 때 이를 거부해야 합니다.
예측 가능하게 하려면 이메일 + 비밀번호 기반 로그인과 새로고침 간 세션 유지 방식을 기본으로 하세요.\n\n요구사항 예:\n\n- UI: 로그인 페이지, 로그아웃 액션, “내 계정” 페이지(이메일 + 역할 표시)\n- API: POST /auth/login, POST /auth/logout, GET /auth/me\n- 보안 기본: 해시+솔트된 비밀번호 저장, 로그인 시도 제한, 일반화된 에러 메시지\n\n로컬 테스트용 기본 admin 사용자 한 명을 시드하세요.
하나의 규칙을 정하고 모든 곳에서 그 규칙을 따르게 하세요:\n\n- Routes: kebab-case(하이픈), 단수/복수 일관성\n- Components: PascalCase, 라우트당 하나의 최상위 페이지 컴포넌트\n- Fields: UI 폼, API JSON, DB 컬럼에 같은 이름 사용\n\n나중에 이름을 바꿀 때는 모델에게 즉흥적으로 처리하게 하지 말고, 검색/교체 + 마이그레이션 계획을 요청하세요.
모든 리스트 엔드포인트에서 같은 응답 형태를 요구하세요:\n\n- 쿼리 파라미터: page, page_size, + 필터들\n- 응답: total, page, page_size, items\n\n또한 안정적인 정렬(예: created_at 기준, 그 다음 )을 요구해 페이지네이션에서 누락이나 중복이 생기지 않게 하세요.
다음 항목들을 비교하는 감사 프롬프트를 사용하세요:\n\n- UI 라우트 vs API 경로\n- 폼 필드 vs 요청/응답 JSON\n- JSON 필드 vs DB 컬럼\n- 검증 규칙 vs DB 제약\n\n그런 다음 최소한의 패치 계획을 적용하세요.\n\n좋은 규칙: 불일치를 고치는 동안 새로운 기능을 추가하지 마세요—이름, 라우트, 검증, 권한을 정렬하는 데 집중하세요.
id