"로그인 기능 만들어줘"와 "JWT 기반 로그인 API를 만들어줘. 이메일/비밀번호 검증 후 액세스 토큰과 리프레시 토큰을 반환해야 해"는 같은 요청처럼 보이지만 결과가 다릅니다. 좋은 지시가 좋은 결과를 만듭니다.
모호한 목표보다 구체적인 목표가 훨씬 좋은 결과를 냅니다.
나쁜 예: "코드 개선해줘"
좋은 예: "user.service.ts의 getUserById 함수가
캐시 없이 매번 DB를 조회해. Redis 캐시를
추가해서 같은 ID는 5분간 캐시되도록 해줘"
Claude Code는 목표가 명확할수록 불필요한 탐색 없이 바로 작업합니다.
목표(Goal): 달성하고자 하는 최종 상태. "무엇을" 원하는지를 명확히 정의합니다.
어떤 방법은 쓰면 안 되는지, 어떤 범위만 건드려야 하는지 알려줍니다.
"user.service.ts만 수정해. 다른 파일은 건드리지 마.
기존 테스트는 전부 통과해야 해."
"리팩토링이 목적이야. 동작은 변경하면 안 돼.
외부 API 스펙은 그대로 유지해야 해."
제약(Constraints): 작업 방식이나 범위에 대한 제한. "어떻게 하면 안 되는지"를 명확히 합니다.
관련 배경 정보를 함께 제공하면 더 적합한 결과가 나옵니다.
"이 프로젝트는 NestJS + TypeScript야.
Redis는 이미 설치되어 있고 RedisModule이 app.module에 등록되어 있어.
캐시 키 패턴은 'cache:entity:id' 형식을 쓰고 있어."
CLAUDE.md에 프로젝트 컨텍스트를 적어두면 매번 설명하지 않아도 됩니다.
컨텍스트(Context): 현재 상황과 배경 정보. 같은 요청도 컨텍스트에 따라 다른 구현이 필요합니다.
원하는 패턴이 있다면 예시를 보여줍니다.
"ProductService의 getProductById를 참고해서
UserService의 getUserById도 같은 패턴으로 캐시 추가해줘"
기존 코드의 패턴을 참조하면 일관성 있는 결과가 나옵니다.
예시(Examples): 원하는 결과의 형태나 패턴을 보여주는 샘플. 추상적 설명보다 구체적 예시가 더 정확한 결과를 만듭니다.
복잡한 작업은 한 번에 요청하기보다 단계별로 진행합니다.
X 한 번에: "로그인 기능 전체 구현해줘"
O 단계별:
1. "User 엔티티와 DTO 먼저 만들어줘"
2. "AuthService에 로그인 로직 추가해줘"
3. "AuthController에 로그인 엔드포인트 추가해줘"
4. "테스트 작성해줘"
중간 결과를 확인하고 방향이 맞으면 다음 단계로 넘어갑니다.
어떻게 성공 여부를 판단할지 알려줍니다.
"수정 후 npm test 실행해서 전부 통과하면 완료야.
특히 user.service.spec.ts는 반드시 통과해야 해."
Claude Code가 작업 후 자동으로 검증하고, 실패하면 수정을 반복합니다.
결과가 원하는 방향과 다르면 즉시 알려줍니다.
"아니, 그 방향이 아니야. 새 파일을 만들지 말고
기존 user.service.ts에 메서드로 추가해줘."
Claude Code는 피드백을 받아 방향을 수정합니다. 잘못된 방향으로 계속 진행하면 되돌리기 어려워집니다.
긴 설명보다 핵심만 담은 지시가 더 효과적입니다.
나쁜 예: "혹시 가능하다면 시간이 될 때 user.service.ts 파일을
보시고 거기서 getUserById 함수가 있는데 그 함수에
캐시를 한번 붙여볼 수 있을까요?"
좋은 예: "user.service.ts의 getUserById에 Redis 캐시 추가해줘.
TTL 5분."
Claude Code는 사람과의 대화가 아닌 명확한 지시에 최적화되어 있습니다.