Vibe Coding 개발 과정에서 AI가 생성한 코드가 논리적 허점으로 가득 차 있어, 수정하다가 인생에 회의를 느낀 적이 있나요?
전통적인 개발에서 Spec은 정의입니다. 하지만 AI와 협업할 때 우리는 ‘감독’에 더 가깝습니다.
재능은 있지만 가끔 ‘폭주’하는 AI 배우가 멋진 연기를 펼치게 하려면 두 가지 강력한 도구가 필요합니다: **EARS(대본 로직)**와 **BDD(인수 스틸컷)**입니다.
EARS: 요구사항을 “논리 블록"으로 변환
“시스템이 좀 더 사용하기 편했으면 좋겠다”, “처리 속도가 빨라야 한다"와 같은 요구사항을 적는 PM을 만난 적이 있을 것입니다. 코드를 작성할 때 이는 재앙입니다.
EARS (Easy Approach to Requirements Syntax)는 간단히 말해 이러한 “모호한 형용사"를 “정확한 지시"로 변환하는 것입니다.
EARS는 최상급 Prompt Engineering과 같아서, 닫힌 논리로 말하도록 강제합니다. 주요 5가지 문장 패턴을 통해 언제든지 요구사항의 경계를 “잠글” 수 있습니다:
| 유형 | 설명 |
|---|---|
| Ubiquitous (보편형) | 시스템은...해야 한다 (숨쉬는 것처럼 항상 준수해야 함). |
| Event-driven (이벤트 주도형) | [이벤트 발생] 시, 시스템은...해야 한다. |
| Unwanted Behavior (예외 처리형) | 만약 [나쁜 일 발생] 시, 시스템은...해야 한다 (이것이 에러 처리의 영혼입니다). |
| State-driven (상태 주도형) | [특정 상태] 동안, 시스템은...해야 한다. |
| Optional Feature (선택형) | [기능 포함] 시, 시스템은...해야 한다. |
EARS는 엄격한 규칙을 세우는 데 도움을 줍니다
AI가 논리적으로 “진지한 얼굴로 헛소리하는 것"을 불가능하게 만듭니다.
BDD: 테스트를 “영화 대본"으로 변환
EARS가 엄격한 계약서라면, **BDD (Behavior Driven Development)**는 “피와 살이 있는 이야기"입니다. 이는 a == b를 테스트하는 것이 아니라 “사용자가 무엇이 일어났다고 느끼는지"를 테스트합니다.
BDD에서 사용하는 구문은 Gherkin(피클, 아삭하고 상쾌해야 합니다!)이라고 하며, 핵심 3부작은 다음과 같습니다:
| 구문 | 설명 |
|---|---|
| 🎬 Given (배경) | 촬영 전 장면 설정 (예: 주머니에 100달러가 있음). |
| ⚡ When (동작) | 감독이 Action을 외치는 순간 (예: 아주 매운 오징어를 주문함). |
| ✅ Then (결과) | 관객이 보는 결말 (예: 향긋한 오징어를 받고 지갑이 60달러 줄어듬). |
이런 “스토리텔링” 방식을 통해 엔지니어가 아니더라도 우리와 소통할 수 있으며, AI도 이러한 “실제 예시"를 통해 당신의 진짜 의도를 이해할 수 있습니다.
EARS vs BDD의 차이점은 무엇인가요?
이 둘은 각자의 임무를 수행하며, 결합했을 때 진정으로 “무적"이 됩니다.
| 특징 | EARS (요구사항 구문) | BDD (행동 주도) |
|---|---|---|
| 핵심 정신 | 정확한 정의 (모호함 제거) | 합의와 검증 (스토리텔링) |
| 마치… | 법적 조항 | 영화 대본 |
| 주요 청중 | PM, 아키텍트, 규칙 제정자 | 엔지니어, QA, AI 어시스턴트 |
| 해결하는 고통 | “네가 만든 건 내가 생각한 것과 달라!” | “로직은 맞는데 쓸 수가 없어!” |
간단히 말해: EARS는 규칙 설정을 돕고, BDD는 결과 확인을 돕습니다.
EARS 고급 활용: Vibe Coding 실전
우리는 EARS 규칙과 BDD 대본을 프롬프트에 직접 넣어 AI가 개발하도록 합니다.
“전자 지갑 차감"을 개발할 때 다음과 같이 지시해 보세요:
# 작업: 차감 API 구현을 도와주세요
## EARS 로직 (엄격히 준수):
- [Event-driven]: 요청을 수신하면 잔액을 검증해야 한다.
- [Unwanted]: 잔액이 부족하면 400 에러 코드 'INSUFFICIENT_FUNDS'를 반환해야 한다.
- [State-driven]: 지갑이 'Frozen' 상태인 동안 모든 차감을 거부해야 한다.
## BDD 인수 대본 (Jest 테스트용):
Scenario: 잔액 부족으로 인한 차감 실패
Given 사용자 잔액은 50달러
When 100달러 차감 요청 수신
Then API는 HTTP 400을 반환해야 함
And 에러 코드는 'INSUFFICIENT_FUNDS'여야 함
이것을 AI에게 던져보면, 생성된 코드가 목표에서 크게 벗어나지 않을 것입니다!
결론
일상적인 개발이든 Vibe Coding이든, EARS와 BDD는 효율성을 높이는 신기(神器)입니다.
EARS는 엄격한 규칙 설정을 돕고, BDD는 연기 결과를 확인하는 것을 돕습니다.