Cursor Skills, Commands, Rules: 차이점은 무엇인가?
Cursor에는 겹치지만 별개인 세 가지 기능이 있어 많은 사용자를 혼란스럽게 합니다: Skills, Commands, Rules. 11개의 답글이 달린 포럼 스레드는 본질적으로 같은 질문을 다른 방식으로 물었습니다 — "각각을 무엇에 사용하나요?" 이 가이드는 그들 사이에 명확한 경계를 긋고 각각을 언제 사용하는지 보여줍니다.
정의
각 기능이 실제로 무엇인지부터 시작합시다.
Rules란 무엇인가?
Rules는 Cursor의 AI가 코드를 생성하거나 수정할 때 어떻게 행동해야 하는지를 알려줍니다. 코딩 표준, 규칙, 제약 조건, 선호도를 정의합니다.
Rules는 선언적입니다 — 무엇이 참이어야 하는지 명시하고 AI가 따릅니다.
항상 TypeScript strict mode를 사용하세요.
기본 익스포트보다 이름 있는 익스포트를 선호하세요.
함수형 컴포넌트와 hooks를 사용하고, 클래스 컴포넌트는 사용하지 마세요.
Rules는 구성된 프로젝트의 모든 AI 상호작용에 자동으로 적용됩니다. 수동으로 호출할 필요가 없습니다.
Rules가 있는 곳:
- 글로벌 Rules: 설정 > 일반 > AI용 Rules
- 프로젝트 Rules: 프로젝트 루트의
.cursorrules파일 - 범위가 지정된 Rules:
.cursor/rules/디렉토리의.mdc파일
Commands란 무엇인가?
Commands는 특정 작업을 수행하기 위해 수동으로 호출하는 미리 정의된 프롬프트입니다. 일반적인 작업을 위한 단축키입니다.
Commands는 명령형입니다 — 지금 당장 특정한 것을 하도록 트리거합니다.
입력: "/explain"
결과: AI가 선택한 코드를 설명
입력:
"/fix"
결과: AI가 선택한 코드의 오류를 수정
Commands는 명시적인 사용자 작업입니다. AI는 사용자가 말하지 않는 한 이를 사용하지 않습니다.
Commands가 있는 곳:
- 내장 Commands:
/explain,/fix,/doc,/test등 - 사용자 지정 Commands: 설정에서 사용자 정의
Skills란 무엇인가?
Skills는 필요할 때 Cursor의 AI가 활용할 수 있는 컨텍스트 기능입니다. AI가 요청에 적용할 수 있는 도메인 지식이나 전문 능력을 나타냅니다.
Skills는 적응형입니다 — AI가 프롬프트를 기반으로 사용할 때를 결정합니다.
사용자: "Next.js 프로젝트를 TypeScript, Tailwind, Prisma로 설정하세요"
AI는 "Next.js 프로젝트 스캐폴딩" Skill을 사용하여:
- 올바른 초기화 명령어 실행
- Tailwind를 올바르게 구성
- Prisma를 올바른 스키마 위치로 설정
- TypeScript 경로 구성
Skills를 명시적으로 호출하지 않습니다. AI가 Skill이 적용되는 것을 인식하고 자동으로 사용합니다.
Skills가 어디에서 오는지:
- Cursor의 AI 훈련에 내장
- 시간이 지남에 따라 코드베이스에서 학습
- MCP (Model Context Protocol) 서버를 통해 추가
나란히 비교
| 측면 | Rules | Commands | Skills |
|---|---|---|---|
| 목적 | 행동 표준 정의 | 특정 작업 실행 | 도메인 지식 적용 |
| 적용 시기 | 자동으로, 항상 | 수동으로 호출될 때 | AI가 관련성을 감지할 때 |
| 사용자 제어 | 한 번 설정, 항상 적용 | 필요할 때 트리거 | 암시적, AI가 결정 |
| 형식 | 텍스트 / JSON / .mdc | 슬래시 명령어 (/fix) | 낶적 AI 기능 |
| 범위 | 글로벌 또는 프로젝트별 | 보편적 | 컨텍스트 의존적 |
| 예시 | "세미콜론 사용" | /explain selection | "React 앱 스캐폴딩 방법을 알음" |
각각을 언제 사용할지
Rules를 사용할 때
프로젝트 전체에서 AI가 코드를 작성하는 방식을 일관되게 변경하고 싶을 때.
좋은 Rule 사용 사례:
- 코딩 스타일 적용 (탭 대 공백, 명명 규칙)
- 기술 스택 선호도 지정 (React 대 Vue, Prisma 대 Drizzle)
- 아키텍처 제약 정의 (순환 임포트 없음, 특정 폴더 구조)
- 응답 스타일 설정 ("간결하게", "항상 주석 추가")
{
"techStack": ["Next.js 14", "TypeScript", "Tailwind CSS"],
"rules": [
"기본적으로 서버 컴포넌트 사용",
"상호작용이 필요할 때만 'use client' 추가",
"모든 API 라우트는 app/api/에 위치",
"모든 데이터베이스 작업에 Prisma 사용"
]
}
Rules는 프로젝트의 "헌법"입니다. 한 번 작성하면 모든 AI 상호작용을 안내합니다.
Commands를 사용할 때
지금 당장 선택한 코드나 현재 컨텍스트에서 특정 작업을 수행하고 싶을 때.
좋은 Command 사용 사례:
- 익숙하지 않은 코드 설명 (
/explain) - 특정 오류 수정 (
/fix) - 문서 생성 (
/doc) - 함수에 대한 테스트 작성 (
/test) - 선택한 블록 리팩토링 (
/refactor)
1. 문서화하려는 함수 선택
2. 채팅에 /doc 입력
3. AI가 해당 함수에 JSDoc 주석 생성
내장 명령어 참조:
| 명령어 | 기능 | 사용 시기 |
|---|---|---|
/explain | 선택한 코드 설명 | 익숙하지 않은 코드 읽기 |
/fix | 선택한 코드의 오류 수정 | 버그나 오류가 있을 때 |
/doc | 문서 생성 | JSDoc/docstrings 추가 |
/test | 단위 테스트 생성 | 테스트 커버리지 작성 |
/refactor | 리팩토링 제안 | 코드 구조 개선 |
/commit | 커밋 메시지 생성 | 변경 사항 커밋 전 |
Commands는 결합할 수 있습니다. 코드를 선택하고 /doc을 입력한 다음, /test로 후속하여 동일한 함수에 문서와 테스트를 모두 생성할 수 있습니다.
Skills를 사용할 때
Skills는 직접 "사용"하는 것이 아니라 AI가 활용하는 것입니다. 하지만 MCP 서버와 프로젝트 컨텍스트를 통해 Skills를 활성화하거나 구성할 수 있습니다.
좋은 Skill 구성:
- 데이터베이스 스키마 인식을 위한 MCP 서버 추가
- 웹 검색 기능 활성화
- 문서 API 연결
- 저장소별 지식 설정
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://localhost/mydb"]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"]
}
}
}
이러한 MCP 서버가 연결되면 AI는 데이터베이스를 직접 쿼리하거나 GitHub 이슈에 접근하는 "Skill"을 얻습니다.
결합: 실제 예시
세 가지를 모두 함께 사용할 때 진정한 힘이 발휘됩니다. 실제 워크플로우는 다음과 같습니다:
시나리오: 새로운 API 엔드포인트 추가
설정 (Rules):
.cursorrules 파일에 다음이 포함됩니다:
기술 스택: Next.js 14 App Router, TypeScript, Prisma, Zod
API 규칙:
- 모든 라우트는 app/api/[resource]/route.ts에 위치
- 입력 유효성 검사에 Zod 사용
- 일관된 오류 형식 반환: { error: string, code: string }
- 다중 테이블 작업에 Prisma 트랜잭션 사용
실행 (Commands):
기존 라우트 파일을 선택하고 입력:
/test
AI가 Rules를 기반으로 기존 라우트에 대한 테스트를 생성합니다.
그런 다음 입력:
다음을 수락하는 /api/orders에 대한 새로운 POST 엔드포인트를 생성하세요:
{ items: Array<{ productId: string, quantity: number }>,
customerEmail: string }를 수락하고
트랜잭션으로 주문과 주문 항목을 생성하세요.
AI 지원 (Skills):
AI는 자동으로:
- Rules 적용 — 파일을
app/api/orders/route.ts에 배치, Zod 유효성 검사 사용, Prisma 트랜잭션으로 래핑 - Next.js App Router 라우팅 규칙에 대한 Skill 사용
- Prisma 트랜잭션 구문에 대한 Skill 사용
- 모든 제약 조건을 따르는 코드 생성
import { NextRequest, NextResponse } from 'next/server';
import { z } from 'zod';
import { prisma } from '@/lib/db';
const orderSchema = z.object({
items: z.array(z.object({
productId: z.string().uuid(),
quantity: z.number().int().positive()
})).min(1),
customerEmail: z.string().email()
});
export async function POST(request: NextRequest) {
try {
const body = await request.json();
const validated = orderSchema.parse(body);
const order = await prisma.$transaction(async (tx) => {
const newOrder = await tx.order.create({
data: {
customerEmail: validated.customerEmail,
status: 'PENDING'
}
});
await tx.orderItem.createMany({
data: validated.items.map(item => ({
orderId: newOrder.id,
productId: item.productId,
quantity: item.quantity
}))
});
return newOrder;
});
return NextResponse.json(order, { status: 201 });
} catch (error) {
if (error instanceof z.ZodError) {
return NextResponse.json(
{ error: 'Invalid input', code: 'VALIDATION_ERROR' },
{ status: 400 }
);
}
return NextResponse.json(
{ error: 'Internal server error', code: 'INTERNAL_ERROR' },
{ status: 500 }
);
}
}
코드가 정의한 모든 규칙을 따르는 것을 주목하세요. 프롬프트에서 반복할 필요가 없었습니다. 이것이 세 가지 메커니즘을 모두 결합하는 힘입니다.
일반적인 혼란과 설명
"Rules를 Commands로 변환할 수 있나요?"
직접적으로는 아닙니다. Rules는 수동 제약 조건입니다. Commands는 활성 작업입니다. 하지만 Rules를 참조하는 사용자 지정 Commands를 작성할 수 있습니다:
"/lint" -- 선택한 코드가 모든 프로젝트 규칙을 따르는지
확인하도록 AI에 요청하는 사용자 지정 명령어
"Skills가 Rules를 덮어쓰나요?"
아닙니다. Rules는 항상 우선합니다. Skill이 Rule을 위반하는 접근 방식을 제안하면 AI는 Rule을 따라야 합니다. AI가 Rules를 무시하는 것을 본다면, Rules가 너무 모호하거나 충돌할 수 있습니다.
"어떤 것을 먼저 설정해야 하나요?"
- Rules 먼저 — 프로젝트 규칙 정의
- Commands 두 번째 — 내장 기능 학습, 필요에 따라 사용자 지정 추가
- Skills 마지막 — 어떤 격차가 있는지 알게 되면 MCP 서버나 컨텍스트 추가
"여러 개를 동시에 사용할 수 있나요?"
물론입니다. 실제로 그래야 합니다. Rules가 기준선을 설정하고, Commands가 작업을 트리거하며, Skills가 지식 격차를 메웁니다. 함께 작동하도록 설계되었습니다.
사용자 지정 Commands: 더 나아가기
Cursor 설정에서 프로젝트별 워크플로우에 대한 사용자 지정 Commands를 정의할 수 있습니다.
{
"cursor.customCommands": [
{
"name": "api-check",
"description": "API 라우트가 프로젝트 규칙을 따르는지 확인",
"prompt": "이 API 라우트 파일을 검토하고 확인: 1) 올바른 위치에 있는가? 2) Zod 유효성 검사를 사용하는가? 3) 다중 테이블 작업에 Prisma 트랜잭션을 사용하는가? 4) 표준 오류 형식을 반환하는가? 위반 사항을 나열하세요."
},
{
"name": "add-logging",
"description": "함수에 구조화된 로깅 추가",
"prompt": "이 함수에 @/lib/logger의 프로젝트 로거를 사용하여 구조화된 로깅을 추가하세요. 진입 매개변수, 종료 결과, 포착된 오류를 로깅하세요."
}
]
}
채팅에 /api-check 또는 /add-logging을 입력하여 사용하세요.
요약
| 기능 | 생각해보기 | 사용자 작업 | AI 작업 |
|---|---|---|---|
| Rules | 프로젝트 헌법 | 한 번 작성 | 자동으로 따름 |
| Commands | 파워 도구 | 필요할 때 호출 | 특정 작업 실행 |
| Skills | 도메인 전문성 | 구성/향상 | 관련할 때 적용 |
가장 간단한 멘탈 모델:
- Rules = "항상 이렇게 하세요"
- Commands = "지금 이 특정한 것을 하세요"
- Skills = "이런 종류의 것을 하는 방법을 알고 있습니다"
AI가 표준을 알도록 Rules를 먼저 설정하세요. 일반적인 작업을 빠르게 하도록 내장 Commands를 학습하세요. AI가 외부 시스템을 이해해야 할 때 MCP 서버를 통해 Skills를 추가하세요. 함께 사용하면 단일 기능만으로는 훨씬 더 강력해집니다.