AI가 짠 코드는 70점입니다. 나머지 30점을 채워 100점을 만드는 건 당신의 검증 능력에 달렸습니다.
어제 팀 슬랙에 한 주니어 개발자가 질문을 올렸습니다. "Cursor로 하루 만에 API 서버를 만들었는데요, 이거 제출해도 될까요? 뭔가 찝찝합니다." 공감하는 이모지가 10개 이상 달렸습니다. 이 찝찝함의 정체는 무엇일까요? AI가 코드를 짜주니 빠르긴 한데, 내가 정말 이해하고 있는지, 나중에 문제가 생기지 않을지 불안한 겁니다.
바이브 코딩은 마법이 아닙니다. 생산성을 10배 높여주는 도구이지만, 제대로 쓰지 않으면 10배 많은 기술 부채를 쌓습니다. 핵심은 'AI와의 협업 방식'입니다. AI를 천재 개발자처럼 맹신하면 망하고, 주니어 조수로 대하며 철저히 검증하면 성공합니다. 차이는 단 하나, 당신의 역할을 어떻게 정의하느냐입니다.
2025년 현재 Cursor, GitHub Copilot, Cline, Windsurf 같은 AI 코딩 에디터는 놀라운 발전을 이뤘습니다. Cursor는 프로젝트 전체를 인덱싱해 컨텍스트를 이해하고, 파일을 자동 생성하며, 터미널 명령어까지 실행합니다. 하지만 이 강력한 도구를 올바르게 쓰는 방법을 아는 사람은 많지 않습니다. 대부분 "이 기능 만들어줘"라고 던지고 나온 코드를 복붙합니다. 그리고 3개월 후 버그 폭탄을 맞습니다.
실리콘밸리 개발 커뮤니티에서 '바이브 코딩 베스트 프랙티스'로 가장 많이 언급되는 것이 TDD(테스트 주도 개발)와의 결합입니다. "테스트 코드가 없으면 바이브도 없다"는 말이 있습니다. AI가 생성한 코드를 검증하는 가장 확실한 방법은 테스트입니다. 테스트가 통과하면 70점, 코드 리뷰로 세밀하게 검토하면 90점, 리팩토링까지 하면 100점입니다.
이 글에서는 바이브 코딩으로 속도와 품질 두 마리 토끼를 잡는 세 가지 원칙을 소개합니다. 첫째, '나는 편집장' 마인드로 철저히 코드를 리뷰하는 법입니다. 둘째, TDD와 AI를 결합하여 기술 부채를 원천 차단하는 워크플로입니다. 셋째, 모듈 단위로 요청하여 스파게티 코드를 방지하는 프롬프트 전략입니다. 각 원칙마다 실전에서 바로 쓸 수 있는 프롬프트 템플릿과 도구 설정법을 담았습니다.
Cursor의 Context 기능, Rules 설정, Agent 모드 활용법도 상세히 다룹니다. Windsurf의 Cascade 기능과 비교하며 어떤 도구가 어떤 상황에 적합한지 안내합니다. 당신이 느끼는 찝찝함은 정상입니다. 그 불안을 구체적인 검증 프로세스로 바꾸면 됩니다. 이 글을 읽고 나면 AI 코딩 툴을 쓰면서도 당당할 수 있습니다.
당신은 평소 AI 코딩 시 어떤 어려움을 겪나요? "코드를 이해 못 하겠다", "버그가 많다", "리뷰 요청하기 부끄럽다" 같은 고민이 있다면 댓글로 공유해 주세요. 이 글의 프롬프트 템플릿을 복사해서 오늘 바로 써보세요. 그리고 팀 슬랙에 이 글을 공유하여 동료들과 논의해 보세요. 바이브 코딩은 혼자 하는 게 아니라 팀 전체가 함께 배워가는 겁니다.
바이브 코딩 속도와 품질 두 마리 토끼 잡는 법
"AI 쓰면 빠르긴 한데 품질이 걱정이야"라는 말을 자주 듣습니다. 하지만 이건 잘못된 이분법입니다. 올바른 프로세스를 갖추면 속도와 품질을 동시에 잡을 수 있습니다.
속도 vs 품질의 거짓 딜레마
전통 개발 방식은 느리지만 품질이 높다고 생각합니다. 한 줄 한 줄 직접 타이핑하며 고민하니까요. 반면 AI 코딩은 빠르지만 품질이 낮다고 우려합니다. 검증 없이 복붙하니까요. 하지만 이건 도구의 문제가 아니라 사용 방식의 문제입니다.
올바른 바이브 코딩 워크플로는 이렇습니다. 첫째, 명확한 요구사항 정의입니다. AI에게 막연히 "로그인 만들어줘"가 아니라 "JWT 기반 로그인, bcrypt 해싱, 입력 검증, 예외 처리 포함"처럼 구체적으로 지시합니다. 둘째, 생성된 코드를 즉시 리뷰합니다. 보안, 성능, 가독성 관점에서 검토합니다. 셋째, 테스트 코드를 작성하거나 생성합니다. 넷째, 리팩토링합니다. AI가 만든 중복 코드를 정리하고 함수를 분리합니다.
이 프로세스로 개발하면 순수 AI 생성보다 30% 시간이 더 걸립니다. 하지만 순수 수동 코딩보다는 70% 빠릅니다. 그러면서도 품질은 수동 코딩과 동일하거나 더 높습니다. 왜냐하면 검증 단계가 명확하니까요. 수동 코딩에서는 "대충 테스트 나중에"라고 넘기던 것도, AI 코딩에서는 "일단 테스트부터"라는 루틴이 정착됩니다.
실제 사례를 보겠습니다. 한 스타트업 팀은 REST API 서버를 만드는 데 전통 방식으로 2주가 걸렸습니다. 바이브 코딩을 도입한 후 같은 규모의 프로젝트를 4일 만에 완성했습니다. 하지만 첫 시도에서는 버그가 많아 1주일간 수정했습니다. 프로세스를 정립한 두 번째 시도에서는 4일 개발에 1일 검증으로 총 5일 만에 끝냈습니다. 전통 방식 대비 62% 단축입니다.
휴먼 인 더 루프의 중요성
AI가 아무리 똑똑해져도 '최종 판단'은 인간의 몫입니다. 이를 '휴먼 인 더 루프(Human in the Loop)'라고 합니다. AI는 제안하지만 인간이 승인하거나 거부합니다. 이 루프가 없으면 AI가 만든 코드가 그대로 프로덕션에 올라가고, 참사가 벌어집니다.
휴먼 인 더 루프를 구현하는 구체적 방법은 세 가지입니다. 첫째, 코드 생성 후 반드시 '읽기'입니다. 눈으로 훑는 게 아니라 한 줄씩 읽고 이해하세요. 이해 안 되는 부분은 AI에게 "이 부분 설명해줘"라고 물으세요. 둘째, 변경사항을 버전 관리에 커밋하기 전 셀프 리뷰입니다. git diff로 변경된 라인을 확인하고, 각 라인이 왜 바뀌었는지 스스로 설명할 수 있어야 합니다. 셋째, PR(Pull Request)에서 팀 리뷰입니다. AI 생성 코드라고 명시하고 시니어의 리뷰를 받으세요.
Cursor 같은 도구는 이 루프를 돕습니다. Agent 모드에서 파일을 수정할 때 diff를 보여주고, 사용자가 Accept나 Reject를 선택할 수 있습니다. 자동으로 적용되지 않습니다. 이 선택 순간이 바로 휴먼 인 더 루프입니다. 무심코 Accept만 누르지 말고, diff를 읽고 판단하세요.
원칙 1 AI는 작성자 나는 편집장 철저한 코드 리뷰 프로세스
AI를 주니어 개발자로 생각하세요. 당신은 편집장입니다. 주니어가 쓴 원고(코드)를 받아 오탈자를 고치고, 구조를 다듬고, 사실 관계를 확인한 후 출판(배포)합니다. 편집장이 검토 없이 출판하면 신문사가 망합니다. 개발도 마찬가지입니다.
코드 리뷰 체크리스트 6단계
AI가 생성한 코드를 리뷰할 때 다음 6가지를 순서대로 확인하세요.
첫째, 기능성입니다. 코드가 요구사항을 정확히 구현했나요? 예를 들어 "사용자 등록 기능"을 요청했다면, 중복 이메일 체크, 비밀번호 해싱, 데이터베이스 저장이 모두 포함되어 있나요? 테스트해 보세요. 실제로 실행하고 여러 케이스를 입력해 보세요. 정상 입력뿐 아니라 비정상 입력(빈 문자열, 특수문자, 매우 긴 문자열)도 테스트하세요.
둘째, 보안입니다. 가장 중요합니다. 사용자 입력이 검증되나요? SQL 인젝션, XSS 같은 취약점은 없나요? API 키나 비밀번호가 하드코딩되지 않았나요? 민감한 데이터가 로그에 찍히지 않나요? 인증이 필요한 엔드포인트에 인증 미들웨어가 있나요? 이 중 하나라도 누락되면 즉시 수정하세요.
셋째, 성능입니다. 비효율적인 로직은 없나요? 반복문 안에 데이터베이스 쿼리가 있나요(N+1 문제)? 필요 없는 데이터까지 조회하나요? 캐싱할 수 있는 부분은 없나요? 대용량 파일을 한 번에 메모리에 올리지 않나요? 성능 문제는 당장 보이지 않지만 트래픽이 늘면 터집니다.
넷째, 가독성입니다. 코드를 6개월 후 다른 사람이 읽어도 이해할 수 있나요? 변수명이 명확한가요? 함수가 한 가지 일만 하나요? 매직 넘버(의미 없는 상수)는 없나요? 주석이 필요한 복잡한 로직에는 설명이 있나요? AI가 생성한 코드는 종종 변수명이 a, b, temp 같은 무의미한 이름입니다. 즉시 리네이밍하세요.
다섯째, 테스트 가능성입니다. 이 코드를 테스트할 수 있나요? 의존성이 과도하게 결합되어 있지 않나요? 외부 API 호출, 데이터베이스 접근 같은 부분이 모킹 가능하게 추상화되어 있나요? 테스트하기 어려운 코드는 나쁜 설계의 신호입니다.
여섯째, 일관성입니다. 프로젝트의 기존 코드 스타일과 일치하나요? 에러 처리 방식, 네이밍 컨벤션, 파일 구조가 통일되어 있나요? AI는 프로젝트 컨벤션을 모릅니다. 명시하지 않으면 제각각 스타일로 생성합니다.
좋은 프롬프트 vs 나쁜 프롬프트
프롬프트 품질이 결과물 품질을 결정합니다. 구체적이고 제약이 많은 프롬프트가 좋은 프롬프트입니다.
나쁜 프롬프트 예시입니다. "이 기능을 구현해줘." 이것만으로는 AI가 무엇을 해야 할지 모릅니다. 결과물은 70점짜리 코드입니다.
좋은 프롬프트 예시입니다. "사용자 등록 API를 구현해줘. 요구사항은 다음과 같아: 1) 이메일과 비밀번호를 입력받아 2) 이메일 형식 검증 3) 중복 이메일 체크 4) 비밀번호는 bcrypt로 해싱 5) PostgreSQL에 저장 6) 성공 시 JWT 토큰 반환 7) 실패 시 적절한 HTTP 상태 코드와 에러 메시지 반환. SOLID 원칙을 지켜서 구현하고, try-catch로 예외 처리를 포함해줘. TypeScript로 작성하고, 기존 프로젝트의 Express 미들웨어 구조를 따라줘."
이 프롬프트는 무엇이, 어떻게, 왜를 모두 담았습니다. AI가 선택할 여지가 적어집니다. 결과물은 90점짜리 코드입니다.
프롬프트 템플릿을 만들어 재사용하세요. Cursor의 Rules 기능에 프로젝트 전체에 적용할 규칙을 저장할 수 있습니다. 예를 들어 .cursorrules 파일에 이렇게 작성합니다.
- Use TypeScript with strict mode
- Follow Airbnb style guide
- Always validate user inputs
- Use bcrypt for password hashing
- Use environment variables for secrets
- Write JSDoc comments for public functions
- Prefer functional programming over imperative
- Keep functions under 50 lines
- Use async/await instead of callbacks
이제 모든 프롬프트에 이 규칙이 자동으로 적용됩니다. 일관성이 높아집니다.
정적 분석 도구와 CI/CD 통합
코드 리뷰를 사람만 하면 시간이 오래 걸립니다. 정적 분석 도구로 기계적인 검증은 자동화하세요. ESLint(JavaScript), Pylint(Python), RuboCop(Ruby), Clippy(Rust) 같은 린터를 프로젝트에 설정하세요.
보안 스캐너도 필수입니다. Snyk, Checkmarx, Semgrep은 코드에서 알려진 취약점을 찾아줍니다. Dependabot은 의존성 라이브러리의 보안 패치를 자동으로 알려줍니다. 이 도구들을 GitHub Actions, GitLab CI, CircleCI 같은 CI/CD 파이프라인에 통합하면, PR을 올릴 때마다 자동으로 검사합니다.
Cursor에서 코드를 생성한 후, 터미널에서 npm run lint나 pytest를 실행하세요. 에러가 나오면 그 에러 메시지를 복사해서 Cursor에 붙여넣고 "이 에러를 고쳐줘"라고 요청하세요. AI가 즉시 수정합니다. 이 루프를 3~4번 반복하면 린트 에러 없는 깨끗한 코드가 나옵니다.
원칙 2 테스트 코드가 없으면 바이브도 없다 TDD와 AI의 결합
기술 부채를 막는 가장 강력한 방패는 테스트 코드입니다. AI가 만든 코드를 믿지 마세요. 테스트로 검증하세요.
TDD 워크플로에 AI 통합하기
전통적인 TDD(Test-Driven Development)는 이렇습니다. 1) 실패하는 테스트를 작성 2) 테스트를 통과하는 최소 코드 작성 3) 리팩토링. 이 사이클을 반복합니다. AI를 여기에 통합하면 속도가 10배 빨라집니다.
AI 통합 TDD 워크플로는 이렇습니다. 첫째, AI에게 테스트 코드 작성을 요청합니다. "사용자 등록 기능의 단위 테스트를 작성해줘. 정상 케이스, 중복 이메일, 잘못된 형식, 빈 입력 케이스를 포함해줘." AI가 테스트 코드를 생성합니다. 둘째, 테스트를 직접 검토합니다. 테스트가 요구사항을 제대로 검증하나요? 엣지 케이스가 빠지지 않았나요? 필요하면 수정합니다.
셋째, 테스트를 실행합니다. 당연히 실패합니다(Red 단계). 구현 코드가 없으니까요. 넷째, AI에게 구현 코드 작성을 요청합니다. "위 테스트를 통과하는 사용자 등록 함수를 구현해줘." AI가 코드를 생성합니다. 다섯째, 테스트를 다시 실행합니다. 통과하면 Green 단계입니다. 실패하면 에러 메시지를 AI에게 주고 수정을 요청합니다.
여섯째, 리팩토링입니다. 코드가 중복되거나 복잡하면 정리합니다. "이 함수를 더 작은 함수로 분리해줘", "중복 코드를 제거해줘"라고 요청합니다. 일곱째, 테스트를 다시 실행해 여전히 통과하는지 확인합니다. 이 사이클을 반복합니다.
이 방식의 핵심은 '테스트를 사람이 검토한다'는 점입니다. AI가 만든 테스트를 그대로 쓰면 안 됩니다. 테스트 자체가 틀릴 수 있습니다. 테스트를 리뷰하고, 테스트가 올바르다는 확신이 들면 그때 구현을 AI에게 맡깁니다. 테스트가 정답지이고, 구현 코드는 답안입니다. 정답지가 틀리면 답안도 무의미합니다.
통합 테스트와 E2E 테스트
단위 테스트만으로는 부족합니다. 함수 하나하나는 작동해도, 합쳐지면 문제가 생길 수 있습니다. 통합 테스트(Integration Test)와 E2E 테스트(End-to-End Test)도 AI로 작성할 수 있습니다.
통합 테스트 프롬프트 예시입니다. "사용자 등록 API의 통합 테스트를 작성해줘. 실제 데이터베이스(테스트 DB)에 연결해서 1) 등록 성공 2) 중복 이메일 거부 3) 등록 후 로그인 가능 여부를 테스트해줘. Jest와 Supertest를 사용하고, 각 테스트 후 DB를 초기화해줘."
E2E 테스트는 사용자 관점에서 전체 플로우를 검증합니다. Playwright나 Cypress 같은 도구를 씁니다. 프롬프트 예시입니다. "Playwright로 E2E 테스트를 작성해줘. 시나리오는 다음과 같아: 1) 홈페이지 접속 2) 회원가입 페이지로 이동 3) 이메일과 비밀번호 입력 4) 가입 버튼 클릭 5) 대시보드로 리다이렉트 확인 6) 로그아웃."
AI가 생성한 E2E 테스트는 종종 셀렉터(selector)가 틀립니다. 버튼의 ID나 클래스명이 실제와 다를 수 있습니다. 반드시 실행해 보고 수정하세요. 하지만 골격은 빠르게 잡아줍니다.
테스트 커버리지 목표 설정
테스트를 얼마나 작성해야 할까요? 일반적으로 80% 커버리지를 목표로 합니다. 100%는 비현실적이고, 70% 미만은 불안합니다. 핵심 비즈니스 로직은 100%, UI나 설정 코드는 50% 정도로 차등 적용합니다.
Jest, pytest, coverage.py 같은 도구로 커버리지를 측정하세요. CI/CD에 통합해 커버리지가 기준 미만이면 PR을 막을 수 있습니다. Cursor에서 함수를 생성할 때마다 "이 함수의 테스트 코드도 작성해줘"를 습관화하세요. 나중에 몰아서 하지 말고 즉시 작성하세요.
테스트는 문서이기도 합니다. 6개월 후 다른 개발자가 코드를 볼 때, 테스트를 읽으면 "이 함수가 뭐 하는구나"를 이해할 수 있습니다. AI가 만든 복잡한 코드도 테스트를 보면 의도가 명확해집니다.
원칙 3 모듈 단위로 쪼개서 요청하라 스파게티 코드 방지
AI에게 "전자상거래 사이트 만들어줘"라고 하면 스파게티 코드가 나옵니다. 한 번에 너무 많은 걸 요청하면 AI가 혼란에 빠집니다. 작은 단위로 쪼개세요.
작업 분해와 모듈화 전략
큰 작업을 작은 작업으로 분해하는 것은 고전적인 엔지니어링 원칙입니다. AI 시대에 더 중요해졌습니다. AI는 작은 범위의 문제를 잘 풀지만, 큰 그림을 못 봅니다.
예를 들어 "사용자 인증 시스템"을 만든다고 합시다. 한 번에 요청하지 말고 이렇게 쪼개세요. 1) 사용자 모델 정의(스키마) 2) 비밀번호 해싱 유틸리티 함수 3) 회원가입 API 엔드포인트 4) 로그인 API 엔드포인트 5) JWT 토큰 생성/검증 미들웨어 6) 인증 필요한 엔드포인트 보호 7) 테스트 코드. 각 단계마다 AI에게 요청하고, 검증하고, 다음 단계로 넘어갑니다.
모듈화도 명시하세요. "이 기능을 별도 파일로 분리해줘", "이 로직을 재사용 가능한 함수로 만들어줘"처럼 지시합니다. AI는 모든 코드를 한 파일에 때려 넣는 경향이 있습니다. 파일 분리를 명확히 요청하세요.
계획 수립 후 반복 개선
AI에게 작업을 주기 전에 계획을 세우세요. 계획도 AI와 함께 만들 수 있습니다. "전자상거래 백엔드를 만들려고 해. 필요한 기능과 순서를 정리해줘. 각 기능을 단계별로 나눠줘."
AI가 계획을 제시하면 검토하고 개선합니다. "결제 기능이 빠졌어. 추가해줘", "상품 관리와 주문 관리 순서를 바꿔줘"처럼 피드백합니다. 계획이 확정되면 임시 파일(예: plan.md)에 저장하세요.
이제 각 단계마다 계획을 참조하며 작업합니다. Cursor에서 @plan.md를 태그하면 AI가 계획을 컨텍스트로 읽습니다. "plan.md의 1단계인 사용자 모델을 구현해줘"라고 요청하면 AI가 계획에 맞춰 작업합니다. 일관성이 높아집니다.
계획이 틀릴 수도 있습니다. 작업하다 보면 "이건 먼저 해야겠다"싶은 게 생깁니다. 그때 계획을 수정하고 AI에게 알려주세요. "계획이 바뀌었어. plan.md를 업데이트했으니 참고해서 작업해줘."
Context 기능 활용법
Cursor의 강력한 기능 중 하나가 Context입니다. @ 기호로 파일, 폴더, 문서를 태그하면 AI가 해당 내용을 참조합니다. 이를 활용하면 AI의 이해도가 크게 높아집니다.
예를 들어 기존 코드를 참고해 비슷한 기능을 만들 때 이렇게 요청합니다. "@controllers/userController.ts를 참고해서 productController.ts를 만들어줘. 구조는 같지만 상품 CRUD 기능으로 바꿔줘." AI가 기존 파일의 패턴을 따라 새 파일을 생성합니다. 일관성이 보장됩니다.
프로젝트 전체 컨텍스트를 주려면 @Codebase를 씁니다. "이 프로젝트의 전체 구조를 파악해서 새 기능을 어디에 추가해야 할지 제안해줘." AI가 프로젝트를 스캔하고 적절한 위치를 알려줍니다.
외부 문서나 API 스펙도 참조할 수 있습니다. @Docs를 쓰거나 URL을 직접 입력합니다. "https://stripe.com/docs/api를 참고해서 결제 API 통합 코드를 작성해줘." AI가 공식 문서를 읽고 코드를 생성합니다. 정확도가 올라갑니다.
여러 컨텍스트를 조합할 수도 있습니다. "@config/database.ts @models/User.ts를 참고해서 새 모델 Product.ts를 만들어줘. 데이터베이스 연결 방식과 스키마 정의 패턴을 따라줘." 최대한 많은 컨텍스트를 주면 AI가 헤매지 않습니다.
추천 도구 및 설정 Cursor Windsurf 완전 정복
바이브 코딩 도구는 2025년 현재 Cursor와 Windsurf가 양강입니다. 각각의 강점을 알고 상황에 맞게 선택하세요.
Cursor 핵심 기능과 설정법
Cursor는 VSCode 기반 AI 에디터입니다. VSCode 확장과 단축키가 그대로 작동하므로 전환이 쉽습니다. 핵심 기능은 네 가지입니다.
첫째, Tab 자동완성입니다. 코드를 타이핑하면 AI가 다음 줄을 예측합니다. 탭 키로 수락하거나 무시합니다. GitHub Copilot과 유사하지만 더 빠르고 정확합니다. 설정에서 모델을 Claude 3.5 Sonnet, GPT-4, Gemini 중 선택할 수 있습니다.
둘째, Inline Edit입니다. 코드를 드래그하고 Cmd+K(맥) 또는 Ctrl+K(윈도우)를 누르면 인라인 편집창이 뜹니다. "이 함수를 async/await로 변환해줘", "변수명을 더 명확하게 바꿔줘" 같은 지시를 하면 즉시 적용됩니다. 여러 줄을 한 번에 수정할 수 있습니다.
셋째, Chat입니다. 사이드바의 채팅창에서 AI와 대화합니다. @ 기호로 파일을 태그하고, 코드 블록을 복사해서 붙여넣고, 질문합니다. "이 에러를 어떻게 고치죠?", "이 함수를 최적화해줘" 같은 요청을 합니다. 채팅 히스토리가 남으므로 나중에 참고할 수 있습니다.
넷째, Agent 모드입니다. Cmd+Shift+P로 커맨드 팔레트를 열고 "Cursor: Agent"를 실행하면 Agent가 활성화됩니다. 높은 수준의 목표를 주면 Agent가 계획을 세우고, 파일을 생성하고, 터미널 명령어를 실행하고, 결과를 확인하며 작업을 완료합니다. 예를 들어 "Jest 테스트 환경을 세팅해줘"라고 하면 Agent가 패키지를 설치하고 설정 파일을 만들고 예제 테스트를 작성합니다.
Cursor 설정 팁입니다. Settings에서 Privacy 모드를 확인하세요. 코드를 OpenAI 서버로 보내지 않으려면 Privacy Mode를 켜세요(단, 기능이 제한됩니다). Rules를 설정하세요. .cursorrules 파일에 프로젝트 규칙을 작성하면 모든 요청에 적용됩니다. 단축키를 커스터마이징하세요. 자주 쓰는 기능을 빠른 키에 배치하면 효율이 올라갑니다.
Windsurf와 Cascade 기능
Windsurf는 Codeium에서 만든 AI 에디터입니다. Cursor와 비슷하지만 차별점은 Cascade 기능입니다. Cascade는 여러 단계의 작업을 AI가 자율적으로 수행하는 모드입니다.
예를 들어 "사용자 인증 시스템을 만들어줘"라고 Cascade에 요청하면, Windsurf가 1) 필요한 파일 목록 생성 2) 각 파일 작성 3) 테스트 코드 생성 4) 테스트 실행 5) 에러 수정을 자동으로 반복합니다. 개발자는 중간 결과를 승인하거나 거부만 하면 됩니다.
Cascade는 복잡한 작업에 유용합니다. 하지만 통제력이 떨어집니다. AI가 너무 많은 일을 한 번에 하므로 중간 검증이 어렵습니다. 따라서 프로토타이핑이나 실험적 프로젝트에 적합합니다. 프로덕션 코드는 Cursor의 단계별 접근이 더 안전합니다.
Windsurf도 Context 기능을 지원합니다. @file, @folder, @code 같은 태그로 참조할 수 있습니다. 무료 플랜도 관대한 편이라 부담 없이 시도해 볼 수 있습니다.
GitHub Copilot과의 비교
GitHub Copilot은 AI 코딩의 원조입니다. 자동완성에 특화되어 있고, 다양한 에디터(VSCode, JetBrains, Vim 등)를 지원합니다. 장점은 안정성과 범용성입니다. 단점은 Chat 기능이 Cursor보다 약하고, Agent 모드가 없습니다.
Copilot은 '조용한 도우미'입니다. 타이핑하면 조용히 제안하고, 원하면 받아들입니다. 반면 Cursor는 '대화하는 파트너'입니다. 질문하고, 계획 세우고, 리팩토링을 논의합니다. 스타일이 다릅니다.
초보자는 Copilot부터 시작하는 게 좋습니다. 학습 곡선이 완만합니다. 익숙해지면 Cursor로 넘어가세요. 더 강력한 기능을 경험할 수 있습니다. 두 도구를 병행하는 사람도 많습니다. 일상 코딩은 Copilot, 복잡한 작업은 Cursor 이런 식입니다.
실전 워크플로 사례 REST API 서버 개발
이론은 충분히 봤습니다. 실제로 어떻게 하는지 단계별로 보겠습니다. 간단한 TODO API 서버를 만드는 과정입니다.
1단계 계획 수립
Cursor를 열고 채팅창에 이렇게 입력합니다. "Node.js Express로 TODO API를 만들려고 해. 필요한 기능과 파일 구조를 정리해줘. 데이터베이스는 PostgreSQL을 쓸 거고, JWT 인증이 필요해."
AI가 계획을 제시합니다. 확인하고 수정합니다. "테스트 코드도 포함해줘. Jest를 쓸 거야." AI가 계획을 업데이트합니다. 만족스러우면 plan.md 파일로 저장합니다.
2단계 환경 설정
"plan.md의 첫 단계인 프로젝트 초기화를 해줘. package.json을 만들고 필요한 의존성을 설치해줘."
AI가 npm init 명령어와 npm install express pg jsonwebtoken bcrypt 같은 명령을 제안합니다. 터미널에서 실행합니다. AI에게 "TypeScript 설정도 해줘"라고 요청하면 tsconfig.json을 생성합니다.
3단계 데이터베이스 스키마
"PostgreSQL 스키마를 정의해줘. users 테이블(id, email, password)과 todos 테이블(id, user_id, title, completed, created_at)을 만들어줘. 마이그레이션 SQL 파일로 작성해줘."
AI가 migrations/001_create_tables.sql 파일을 생성합니다. 검토하고, 외래키 제약조건이 있는지 확인합니다. 없으면 추가 요청합니다.
4단계 테스트 먼저 작성
"users 테이블의 모델과 기본 CRUD 함수의 단위 테스트를 작성해줘. Jest를 사용하고, 테스트 DB를 쓸 거야."
AI가 테스트 코드를 생성합니다. 파일명은 models/User.test.ts입니다. 테스트를 읽고 검증합니다. "사용자 생성 시 비밀번호 해싱 테스트가 빠졌어. 추가해줘." AI가 테스트를 추가합니다.
5단계 구현 코드 작성
"User.test.ts를 통과하는 User 모델을 구현해줘. bcrypt로 비밀번호를 해싱하고, PostgreSQL 클라이언트를 사용해."
AI가 models/User.ts를 생성합니다. 테스트를 실행합니다. npm test 명령어를 칩니다. 실패하면 에러 메시지를 복사해서 "이 에러를 고쳐줘"라고 요청합니다. 통과할 때까지 반복합니다.
6단계 API 엔드포인트
"Express 라우터로 /api/auth/register 엔드포인트를 만들어줘. User 모델을 사용하고, JWT 토큰을 반환해줘. 입력 검증과 에러 처리를 포함해줘."
AI가 routes/auth.ts를 생성합니다. Postman이나 curl로 테스트합니다. 정상 작동하면 다음 엔드포인트로 넘어갑니다. "/api/auth/login", "/api/todos" 같은 엔드포인트를 하나씩 만듭니다.
7단계 리팩토링
모든 기능이 작동하면 리팩토링합니다. "코드에서 중복된 부분을 찾아서 유틸리티 함수로 분리해줘." AI가 중복 코드를 찾고 정리합니다. "함수명을 더 명확하게 바꿔줘." AI가 리네이밍을 제안합니다.
리팩토링 후 테스트를 다시 실행합니다. 모두 통과하면 완료입니다. 이 과정에 전통 방식은 2~3일 걸리지만, 바이브 코딩으로는 6~8시간 정도 걸립니다.
핵심 요약 FAQ
Q1. AI가 짠 코드의 저작권은 누구에게 있나요?
OpenAI, Anthropic 같은 AI 회사 정책에 따르면 사용자가 생성한 코드의 저작권은 사용자에게 있습니다. 다만 AI가 학습한 오픈소스 코드를 그대로 복제한 경우 원 라이선스를 준수해야 할 수 있습니다. GitHub Copilot은 공개 코드를 복제하면 경고합니다. Cursor도 비슷합니다. 상업적으로 사용하려면 생성된 코드를 검토해 기존 오픈소스와 충돌하지 않는지 확인하세요. 중요한 프로젝트는 법무팀과 상의하는 게 안전합니다. 현재 법적 판례가 쌓이는 중이므로 명확한 답은 없지만, 본인이 직접 작성한 프롬프트로 생성한 결과물은 본인의 창작물로 인정될 가능성이 높습니다.
Q2. 초보자가 AI 툴에 의존하면 실력이 안 늘까요?
의존하는 방식에 따라 다릅니다. AI가 코드를 만들어주고 그냥 복붙만 하면 실력이 안 늡니다. 하지만 AI가 만든 코드를 한 줄씩 읽고, "왜 이렇게 짰지?", "더 나은 방법은 없을까?"를 고민하면 오히려 빠르게 성장합니다. AI를 튜터로 활용하세요. 모르는 코드가 나오면 "이 부분 설명해줘"라고 물으세요. 에러가 나면 "왜 이 에러가 났어?"라고 물으세요. 전통 방식보다 피드백 루프가 빠릅니다. 초보자는 AI 없이 기본 문법부터 익힌 후 AI를 도입하는 게 좋습니다. 최소한 변수, 함수, 조건문, 반복문은 손으로 짜봐야 합니다. 그 후 AI로 생산성을 높이세요.
Q3. 코드 리뷰할 때 중점적으로 봐야 할 부분은?
AI 코드 리뷰의 우선순위는 이렇습니다. 첫째, 보안입니다. 입력 검증, SQL 인젝션, XSS, 하드코딩된 비밀, 인증/인가 누락을 확인하세요. 보안 취약점은 프로덕션에서 치명적입니다. 둘째, 예외 처리입니다. try-catch가 있는지, 에러를 제대로 핸들링하는지, 사용자에게 적절한 에러 메시지를 주는지 확인하세요. 셋째, 성능입니다. N+1 쿼리, 불필요한 반복문, 메모리 누수 가능성을 찾으세요. 넷째, 가독성입니다. 변수명, 함수 분리, 주석이 적절한지 봅니다. 다섯째, 테스트 가능성입니다. 의존성이 과도하게 결합되지 않았는지, 모킹이 가능한지 확인합니다. 이 순서대로 리뷰하면 대부분의 문제를 잡을 수 있습니다.
마무리 당당하게 바이브 코딩하세요
AI 코딩 툴을 쓰면서 죄책감을 느낄 필요 없습니다. 이 글에서 제시한 세 가지 원칙—철저한 리뷰, TDD, 모듈화—을 지키면 당당합니다. 당신은 편집장이고, AI는 조수입니다. 최종 책임과 결정권은 당신에게 있습니다.
바이브 코딩은 새로운 패러다임입니다. 거부하면 뒤처집니다. 하지만 맹목적으로 따르면 추락합니다. 올바른 길은 '비판적 수용'입니다. AI의 장점은 취하고, 단점은 사람이 보완하세요. 그러면 생산성과 품질을 동시에 잡을 수 있습니다.
오늘부터 실천할 세 가지를 제안합니다. 첫째, 이 글의 프롬프트 템플릿을 복사해서 .cursorrules 파일에 넣으세요. 프로젝트 규칙이 자동으로 적용됩니다. 둘째, AI가 코드를 생성하면 즉시 테스트 코드를 요청하는 습관을 들이세요. "이 함수의 테스트 코드도 작성해줘"를 자동 반사처럼 입력하세요. 셋째, 팀원과 바이브 코딩 가이드라인을 논의하세요. 이 글을 슬랙에 공유하고 의견을 모으세요.
AI는 계속 진화합니다. GPT-5, Claude 4가 나오면 지금보다 훨씬 똑똑해질 겁니다. 하지만 변하지 않는 것도 있습니다. 좋은 코드의 본질입니다. 가독성, 유지보수성, 확장성, 테스트 가능성. 이것은 AI가 대신 챙겨주지 않습니다. 개발자인 당신이 챙겨야 합니다.
바이브 코딩은 끝이 아니라 시작입니다. 타이핑에서 해방되었으니, 더 본질적인 것에 집중할 수 있습니다. 사용자 문제 정의, 아키텍처 설계, 팀 협업, 코드 품질 관리. 이것이 미래의 개발자가 집중할 영역입니다. AI는 당신의 경쟁자가 아니라 파트너입니다. 제대로 협업하세요.
당신의 바이브 코딩 경험을 댓글로 공유해 주세요. 어떤 도구를 쓰시나요? 어떤 원칙을 지키시나요? 실패담도 환영합니다. 함께 배우고 성장합시다. 다음 글에서는 '바이브 코딩으로 레거시 코드 리팩토링하기'를 다룰 예정입니다. 구독하시면 알림 받으실 수 있습니다.
.jpg)
0 댓글