포스트

바이브코딩 개발자 가이드: AI와 함께하는 효과적인 개발 전략

바이브코딩 개발자 가이드: AI와 함께하는 효과적인 개발 전략

서문

바이브코딩은 단순히 AI에게 “이것 좀 만들어줘”라고 요청하는 것이 아닙니다. 2025년 현재, 바이브코딩은 AI 코딩 도구를 활용하여 개발 생산성을 극대화하는 새로운 패러다임으로 자리잡았습니다. OpenAI 공동창업자 안드레이 카르파티가 2025년 2월에 처음 제시한 이 개념은 이제 Y Combinator 2025년 겨울 배치 스타트업의 25%가 전체 코드베이스의 95%를 AI로 작성할 정도로 보편화되었습니다.

하지만 여기서 중요한 사실이 있습니다. 바이브코딩에서 성공하는 사람들은 코딩 실력이 뛰어나서가 아니라, 사고 방식이 다르기 때문입니다. 그들은 세 가지 핵심 능력을 갖추고 있습니다: 요구사항을 쪼개는 능력, 애매함을 없애는 질문, 그리고 실패 기준을 먼저 정하는 습관입니다.

이 가이드는 이 세 가지 핵심 능력을 중심으로, AI 시대에 진정으로 효과적인 개발자가 되기 위한 실전 전략을 제시합니다.

1부: 바이브코딩의 본질 이해하기

바이브코딩이란 무엇인가

바이브코딩은 생성형 AI의 도움을 받아 코드를 작성하는 행위로, 개발자가 사전에 엄밀한 논리나 구체적인 설계를 준비하지 않고 인간은 직관과 큰 그림을, 구체적인 부분은 인공지능이 담당하는 것을 의미합니다. 2025년 3월에는 Merriam-Webster 사전에 ‘속어 및 트렌드’ 명사로 등재될 정도로 빠르게 확산되었습니다.

카르파티는 이를 “완전히 느낌에 몸을 맡긴 채 코딩하는 새로운 방식”이라고 표현했습니다. 하지만 이것이 무책임한 개발을 의미하는 것은 아닙니다. 오히려 AI와의 대화를 통해 원하는 것을 이루는 과정이며, 이를 위해서는 명확한 사고와 체계적인 접근이 필수적입니다.

바이브코딩의 실제 활용 범위

2025년 현재, 바이브코딩은 두 가지 주요 방식으로 활용되고 있습니다.

첫째, “순수한” 바이브코딩입니다. 이는 AI의 출력을 완전히 신뢰하고 코드의 존재조차 잊어버리는 형태로, 빠른 프로토타입 개발이나 주말 프로젝트에 적합합니다. 한 인디 개발자는 이 방식으로 단 3시간 만에 웹 기반 플라이트 시뮬레이터 게임 “Fly Pieter”를 만들어 화제가 되기도 했습니다.

둘째, 하이브리드 바이브코딩입니다. 이는 AI가 생성한 코드를 검증하고 개선하는 과정을 포함하며, 실제 프로덕션 환경에 더 적합합니다. Vercel의 “State of Vibe Coding 2025” 보고서에 따르면, v0 플랫폼 사용자의 63%가 비개발자이며, 이들은 UI 제작, 정교한 앱 개발, 개인 웹사이트 제작 등에 바이브코딩을 활용하고 있습니다.

하지만 카르파티 본인도 이 방식의 한계를 명확히 했습니다. AI가 생성한 코드에 버그가 발생했을 때 근본적인 원인을 완벽하게 수정해주지 못하거나, 엉뚱한 시도로 우연히 문제를 해결하는 경우가 많습니다. 따라서 복잡하고 중요한 프로젝트에는 한계가 있으며, 제대로 된 결과물을 얻기 위해서는 결국 사람이 코드를 이해하고 검증해야 합니다.

바이브코딩 생태계의 현황

AI 코딩 도구 시장은 2024년 67억 달러에서 2030년 257억 달러로 성장하며 연평균 25.2%의 성장률을 기록할 것으로 전망됩니다. 이러한 성장을 이끄는 주요 도구들은 다음과 같습니다.

Cursor는 2025년 1월 1억 500만 달러를 유치하며 시리즈 B 펀딩을 완료했고, 현재 가장 인기 있는 바이브코딩 도구로 자리잡았습니다. Cursor Composer와 Claude Sonnet의 조합은 전체 코드베이스를 이해하고 변환할 수 있는 강력한 에이전트형 코딩 시스템을 제공합니다.

Replit Ghostwriter, Claude Code, GitHub Copilot, Google의 Antigravity 등도 각자의 특성을 살려 시장에서 활약하고 있습니다. 특히 Claude Code는 VS Code 확장 프로그램으로 제공되며, 맥락을 공유하고 함께 수정해나가는 협업 파트너로서의 역할을 강조합니다.

미국 개발자의 92%가 AI 코딩 툴을 매일 사용하며, 구글과 마이크로소프트에서는 새로 작성되는 코드의 30%가 AI가 생성한 것으로 조사되었습니다. The Information의 조사에 따르면, 기술 업계 종사자의 75%가 바이브코딩을 시도했으며, 결과에 만족한다는 응답은 88%에 달했습니다.

2부: 핵심 능력 1 - 요구사항을 쪼개는 능력

왜 요구사항을 쪼개야 하는가

AI는 전지전능하지 않습니다. 복잡하고 모호한 요청을 받으면 AI도 혼란스러워하고, 결과적으로 원하는 것과 다른 코드를 생성하게 됩니다. 바이브코딩에서 성공하는 사람들은 큰 문제를 작고 명확한 단위로 나누어 AI에게 제시하는 능력을 갖추고 있습니다.

예를 들어, “사용자 관리 시스템을 만들어줘”라는 요청은 너무 모호합니다. 이를 다음과 같이 쪼갤 수 있습니다.

1단계: 사용자 등록 기능 - 이메일과 비밀번호로 회원가입 2단계: 이메일 인증 기능 - 인증 코드 발송 및 확인 3단계: 로그인 기능 - JWT 토큰 기반 인증 4단계: 비밀번호 재설정 기능 - 이메일을 통한 재설정 링크 발송 5단계: 프로필 관리 기능 - 사용자 정보 조회 및 수정

이렇게 쪼개면 각 단계에서 AI에게 명확한 지시를 내릴 수 있고, 문제가 발생했을 때도 어느 부분이 잘못되었는지 쉽게 파악할 수 있습니다.

요구사항 분해의 실전 기법

요구사항을 효과적으로 쪼개기 위해서는 계층적 사고가 필요합니다. 소프트웨어 요구사항 명세(SRS, Software Requirements Specification)의 구조를 참고하면 도움이 됩니다.

가장 상위 레벨에서는 프로젝트의 목적과 범위를 정의합니다. “왜 이것을 만드는가?”, “누가 사용할 것인가?”, “어떤 문제를 해결하는가?”와 같은 질문에 답하며 전체 방향을 설정합니다.

그 다음 레벨에서는 주요 기능을 식별합니다. 전자상거래 사이트라면 상품 관리, 장바구니, 주문 처리, 결제, 회원 관리 등의 큰 기능 블록으로 나눕니다.

각 주요 기능은 다시 세부 기능으로 분해됩니다. 예를 들어, 상품 관리는 상품 등록, 수정, 삭제, 조회, 검색, 카테고리 관리 등으로 나뉩니다.

세부 기능은 다시 구체적인 작업 단위로 분해됩니다. 상품 등록 기능은 입력 폼 생성, 이미지 업로드 처리, 유효성 검증, 데이터베이스 저장, 성공/실패 응답 처리 등의 작업으로 나뉩니다.

프롬프트 엔지니어링과 요구사항 분해

AI에게 요청을 전달할 때는 프롬프트 엔지니어링 기법을 활용해야 합니다. 2025년 구글의 프롬프트 엔지니어링 백서에서 제시한 핵심 원칙을 바이브코딩에 적용하면 다음과 같습니다.

첫째, 명확성과 구체성입니다. “기획서 써줘”가 아니라 “다음 형식으로 기획서를 작성해줘: 1) 배경 및 목적 2) 핵심 기능 설명 3) 사용자 시나리오 4) KPI 및 성공 지표”처럼 구체적으로 요청합니다.

둘째, 컨텍스트 제공입니다. AI가 상황을 이해할 수 있도록 배경 정보를 제공합니다. “20대 여성 타겟, 친환경 화장품 ‘퓨어 그린 세럼’ 인스타그램 광고 문구 3가지 작성해줘. 100자 이내, 효능(수분, 진정)과 친환경 컨셉 강조하고, 친근하고 부드러운 톤앤매너 유지해줘.”처럼 목표, 타겟, 제품, 채널, 형식, 조건, 톤앤매너를 명확히 합니다.

셋째, 예시 제공(Few-shot Learning)입니다. 원하는 결과의 형태를 예시로 보여주면 AI가 패턴을 이해하고 더 정확한 결과를 생성합니다. 예를 들어, “다음 형식으로 API 엔드포인트를 만들어줘: GET /api/users - 모든 사용자 조회, POST /api/users - 새 사용자 생성”처럼 구조를 제시합니다.

넷째, 단계적 추론(Chain of Thought)입니다. 복잡한 작업은 중간 단계를 명시하여 AI가 논리적으로 접근하도록 유도합니다. “1단계: 데이터베이스에서 사용자 정보를 조회한다. 2단계: 비밀번호를 bcrypt로 해싱한다. 3단계: 해시된 비밀번호와 저장된 해시를 비교한다. 4단계: 일치하면 JWT 토큰을 생성한다.”처럼 단계를 나누어 제시합니다.

실전 사례: LMS 개발 프로젝트

학습 관리 시스템(LMS)을 개발한다고 가정해봅시다. 이를 요구사항 분해와 프롬프트 엔지니어링으로 접근하는 과정은 다음과 같습니다.

먼저 프로젝트 방향성을 설정합니다. AI에게 “온라인 교육 플랫폼을 위한 LMS를 개발하려고 합니다. 주요 사용자는 강사와 학생이며, 강사는 강의를 등록하고 학생은 수강할 수 있어야 합니다. 유사한 서비스인 Udemy, Coursera의 핵심 기능을 분석하고, 우리 프로젝트에 필요한 필수 기능 목록을 작성해주세요.”라고 요청합니다.

AI가 제시한 기능 목록을 바탕으로 우선순위를 정합니다. “앞서 제시한 기능들을 MVP(Minimum Viable Product) 관점에서 재구성해주세요. 첫 번째 버전에 꼭 필요한 핵심 기능과 향후 추가할 수 있는 부가 기능으로 분류해주세요.”

각 핵심 기능에 대해 구체적인 요구사항을 작성합니다. “강의 등록 기능의 상세 요구사항을 작성해주세요. 포함되어야 할 항목: 입력 필드 목록, 각 필드의 데이터 타입과 유효성 검증 규칙, UI/UX 흐름, 에러 처리 시나리오.”

기술 스택을 결정합니다. “React, Node.js, PostgreSQL을 사용하여 LMS를 개발하려고 합니다. 강의 등록 기능을 위한 프론트엔드 컴포넌트 구조와 백엔드 API 설계를 제안해주세요.”

이제 실제 코드 작성 단계로 들어갑니다. “강의 등록 폼 컴포넌트를 React로 작성해주세요. 필드: 강의 제목(필수, 최대 100자), 강의 설명(필수, 최대 1000자), 카테고리(드롭다운 선택), 가격(숫자, 0 이상), 썸네일 이미지(파일 업로드). 각 필드에 대한 유효성 검증을 포함하고, 에러 메시지는 필드 아래에 빨간색으로 표시해주세요.”

반복적 개선의 중요성

한 번에 완벽한 코드가 나오기를 기대하지 마세요. 바이브코딩은 반복적 개선 과정입니다. 초기 버전을 받은 후, 다음과 같이 점진적으로 개선합니다.

“방금 생성한 폼 컴포넌트에서 이미지 업로드 부분을 개선해주세요. 드래그 앤 드롭 기능을 추가하고, 이미지 미리보기를 보여주며, 파일 크기 제한(5MB)과 파일 형식 검증(jpg, png만 허용)을 구현해주세요.”

“폼 제출 시 로딩 상태를 표시하고, 제출 버튼을 비활성화하여 중복 제출을 방지해주세요. 제출이 완료되면 성공 메시지를 토스트로 표시하고 폼을 초기화해주세요.”

이러한 방식으로 작은 단위로 기능을 추가하고 개선하면, 각 단계에서 문제를 빠르게 발견하고 수정할 수 있습니다.

3부: 핵심 능력 2 - 애매함을 없애는 질문

명확성이 바이브코딩의 핵심인 이유

AI는 인간의 의도를 추측하려고 노력하지만, 결국 우리가 제공한 정보의 범위 내에서만 작동합니다. 애매한 요청은 애매한 결과를 낳습니다. 바이브코딩에서 성공하는 사람들은 AI에게 명확한 지시를 내리기 위해, 스스로에게 날카로운 질문을 던지는 습관을 가지고 있습니다.

“로그인 기능을 만들어줘”라는 요청은 수많은 해석의 여지를 남깁니다. 이메일 로그인인가, 소셜 로그인인가? 비밀번호는 어떻게 저장하는가? 로그인 실패 시 어떻게 처리하는가? 세션은 어떻게 관리하는가? 이러한 질문에 답하지 않으면 AI는 자신의 판단으로 구현하게 되고, 그것이 우리가 원하는 방식과 다를 수 있습니다.

5W1H로 요구사항 명확화하기

효과적인 질문을 만들기 위해서는 5W1H(Who, What, When, Where, Why, How) 프레임워크가 유용합니다.

Who(누가): 이 기능을 사용할 사용자는 누구인가? 예를 들어, 관리자용 대시보드인가, 일반 사용자용 인터페이스인가? 사용자의 기술 수준은 어느 정도인가? 이에 따라 UI 복잡도와 안내 메시지의 수준이 달라집니다.

What(무엇을): 정확히 어떤 기능이 필요한가? “사용자 관리”가 아니라 “사용자 목록 조회, 검색, 필터링, 상세 정보 보기, 권한 수정, 계정 정지/해제”처럼 구체적으로 정의합니다.

When(언제): 이 기능은 어떤 상황에서 실행되는가? 예를 들어, “페이지 로드 시 자동으로 데이터를 불러온다”인가, “사용자가 버튼을 클릭했을 때만 데이터를 불러온다”인가?

Where(어디서): 이 기능은 시스템의 어느 부분에 위치하는가? 프론트엔드인가, 백엔드인가? 어떤 페이지나 컴포넌트에 속하는가?

Why(왜): 이 기능이 필요한 이유는 무엇인가? 비즈니스 목적을 명확히 하면 AI가 더 적절한 해결책을 제시할 수 있습니다. 예를 들어, “판매 증대를 위한 추천 시스템”과 “사용자 편의를 위한 추천 시스템”은 구현 방식이 다를 수 있습니다.

How(어떻게): 기술적으로 어떻게 구현할 것인가? 어떤 기술 스택을 사용하는가? 성능 요구사항은 무엇인가? 보안 고려사항은 무엇인가?

제약조건 명확히 하기

좋은 요구사항은 무엇을 해야 하는지뿐만 아니라, 무엇을 하지 말아야 하는지도 명확히 합니다. 제약조건을 명시하면 AI가 우리가 원하지 않는 방향으로 가는 것을 방지할 수 있습니다.

기술적 제약: “외부 라이브러리를 추가로 설치하지 말고, 프로젝트에 이미 있는 라이브러리만 사용해주세요.” “jQuery를 사용하지 말고, 순수 JavaScript로 작성해주세요.”

성능 제약: “페이지 로드 시간은 3초를 초과하지 않아야 합니다.” “동시에 1000명의 사용자가 접속해도 원활하게 작동해야 합니다.”

보안 제약: “사용자 입력은 반드시 서버 측에서 검증해야 합니다.” “민감한 정보는 로그에 남기지 마세요.”

UI/UX 제약: “모바일 화면에서도 모든 기능이 정상적으로 작동해야 합니다.” “접근성 표준(WCAG 2.1 AA)을 준수해야 합니다.”

비즈니스 제약: “무료 사용자는 하루에 10번까지만 이 기능을 사용할 수 있습니다.” “GDPR 규정을 준수해야 합니다.”

입출력 명세 작성하기

함수나 API를 만들 때는 입출력 명세를 명확히 하는 것이 중요합니다. 이는 AI가 정확한 코드를 생성하는 데 결정적인 역할을 합니다.

입력 명세에는 다음 정보가 포함되어야 합니다.

매개변수 이름과 데이터 타입: “userId: string, options: { includeDeleted: boolean, sortBy: ‘createdAt’‘updatedAt’ }”

필수/선택 여부: “email은 필수 매개변수이고, phoneNumber는 선택 매개변수입니다.”

유효한 값의 범위: “age는 0 이상 150 이하의 정수여야 합니다.” “status는 ‘pending’, ‘approved’, ‘rejected’ 중 하나여야 합니다.”

기본값: “page의 기본값은 1이고, limit의 기본값은 10입니다.”

출력 명세에는 다음 정보가 포함되어야 합니다.

반환 타입: “Promise<User[]>를 반환합니다.”

성공 시 반환 형식: “{ success: true, data: User[], totalCount: number }”

실패 시 반환 형식: “{ success: false, error: { code: string, message: string } }”

가능한 에러 코드: “USER_NOT_FOUND, INVALID_CREDENTIALS, SERVER_ERROR”

예를 들어, 다음과 같이 명세를 작성할 수 있습니다.

“사용자 인증 API를 만들어주세요.

  • 엔드포인트: POST /api/auth/login
  • 입력: { email: string (필수, 이메일 형식 검증), password: string (필수, 최소 8자) }
  • 성공 응답 (200): { success: true, token: string, user: { id: string, email: string, name: string } }
  • 실패 응답:
    • 400: { success: false, error: ‘INVALID_INPUT’, message: ‘이메일 또는 비밀번호 형식이 올바르지 않습니다’ }
    • 401: { success: false, error: ‘INVALID_CREDENTIALS’, message: ‘이메일 또는 비밀번호가 일치하지 않습니다’ }
    • 500: { success: false, error: ‘SERVER_ERROR’, message: ‘서버 오류가 발생했습니다’ }
  • 보안: 비밀번호는 bcrypt로 해싱하여 비교하고, JWT 토큰은 24시간 유효합니다.”

후카츠식 프롬프트 프레임워크 활용

2024년 프롬프트 엔지니어링 분야에서 주목받은 “후카츠식 프롬프트 프레임워크”는 입력-출력 구조를 명확히 하는 데 매우 효과적입니다.

이 프레임워크는 다음 요소들로 구성됩니다.

역할 정의: “당신은 20년 경력의 시니어 백엔드 개발자입니다.”

입력 정보: “다음은 현재 프로젝트의 데이터베이스 스키마입니다. [스키마 정보]”

제약조건: “Node.js와 Express를 사용하고, TypeScript로 작성해야 하며, 에러 처리를 반드시 포함해야 합니다.”

출력 형식: “코드, 설명, 사용 예시 순서로 제시해주세요. 코드에는 주석을 포함해주세요.”

톤앤매너: “초보자도 이해할 수 있도록 쉽게 설명해주세요.”

예를 들어, 다음과 같이 작성할 수 있습니다.

“당신은 보안에 특화된 시니어 풀스택 개발자입니다.

[입력]

  • 프로젝트: 전자상거래 플랫폼
  • 현재 상황: 사용자 세션 관리가 쿠키 기반으로 되어 있어 보안 취약점이 있음
  • 기술 스택: React, Node.js, Express, PostgreSQL

[제약조건]

  • JWT 기반으로 전환해야 함
  • 리프레시 토큰 메커니즘을 포함해야 함
  • XSS 및 CSRF 공격을 방어해야 함
  • 기존 사용자의 세션을 끊지 않고 마이그레이션해야 함

[출력 형식]

  1. 새로운 인증 시스템 아키텍처 설명
  2. 백엔드 구현 코드 (주석 포함)
  3. 프론트엔드 구현 코드 (주석 포함)
  4. 마이그레이션 전략
  5. 테스트 시나리오

[톤앤매너] 기술적으로 정확하되, 주니어 개발자도 이해할 수 있도록 각 단계를 상세히 설명해주세요.”

실전 팁: 질문 체크리스트

요청을 보내기 전에 다음 체크리스트를 확인하세요.

  1. 목적이 명확한가? “무엇을” 만들려는지 한 문장으로 설명할 수 있는가?
  2. 범위가 정의되었는가? 어디까지가 이 작업의 범위인가?
  3. 입력이 명확한가? 어떤 데이터가 들어오는가?
  4. 출력이 명확한가? 어떤 결과가 나와야 하는가?
  5. 제약조건이 명시되었는가? 하지 말아야 할 것은 무엇인가?
  6. 에러 상황이 고려되었는가? 문제가 생기면 어떻게 처리해야 하는가?
  7. 기술 스택이 명시되었는가? 어떤 도구와 라이브러리를 사용하는가?
  8. 성능 요구사항이 있는가? 속도나 용량에 대한 기준이 있는가?
  9. 보안 고려사항이 있는가? 민감한 데이터를 다루는가?
  10. 테스트 가능한가? 결과를 어떻게 검증할 것인가?

이 체크리스트를 습관화하면, 애매한 요청을 줄이고 AI로부터 원하는 결과를 얻을 확률이 크게 높아집니다.

4부: 핵심 능력 3 - 실패 기준을 먼저 정하는 습관

성공 기준이 아닌 실패 기준

대부분의 사람들은 “이것이 성공”이라고 정의하려고 합니다. 하지만 바이브코딩에서 더 효과적인 접근은 “이것은 실패”라는 기준을 먼저 세우는 것입니다. 실패 기준이 명확하면 AI가 생성한 코드를 빠르게 평가하고, 문제가 있을 때 즉시 수정 방향을 제시할 수 있습니다.

이는 TDD(Test-Driven Development) 방식과 유사합니다. 테스트 케이스를 먼저 작성하고, 그 테스트를 통과하는 코드를 작성하는 것처럼, 바이브코딩에서도 “이런 상황에서는 안 된다”는 기준을 먼저 정하고 AI에게 전달하는 것이 효과적입니다.

실패 시나리오 정의하기

실패 기준을 정의할 때는 다양한 차원에서 접근해야 합니다.

기능적 실패: 의도한 기능이 작동하지 않는 경우입니다. “로그인 버튼을 클릭했는데 아무 반응이 없으면 실패”, “잘못된 비밀번호를 입력했는데 로그인이 되면 실패”, “이메일 형식이 아닌데 가입이 되면 실패”처럼 구체적으로 정의합니다.

성능적 실패: 시스템이 너무 느리거나 리소스를 과도하게 사용하는 경우입니다. “페이지 로드 시간이 5초를 넘으면 실패”, “메모리 사용량이 1GB를 초과하면 실패”, “동시 접속자 100명에 서버가 다운되면 실패”처럼 정량적인 기준을 제시합니다.

보안적 실패: 보안 취약점이 있는 경우입니다. “SQL 인젝션 공격이 가능하면 실패”, “XSS 공격으로 스크립트가 실행되면 실패”, “비밀번호가 평문으로 저장되면 실패”, “민감한 정보가 로그에 노출되면 실패”처럼 보안 시나리오를 명시합니다.

사용성적 실패: 사용자 경험이 나쁜 경우입니다. “모바일에서 버튼을 누를 수 없으면 실패”, “에러 메시지 없이 실패하면 실패”, “로딩 중임을 알 수 없으면 실패”, “뒤로가기 버튼이 작동하지 않으면 실패”처럼 UX 관점에서 정의합니다.

호환성적 실패: 특정 환경에서 작동하지 않는 경우입니다. “IE11에서 깨지면 실패”, “Safari에서 작동하지 않으면 실패”, “안드로이드에서 이미지가 안 보이면 실패”처럼 지원 범위를 명시합니다.

AI에게 실패 기준 전달하기

AI에게 요청할 때 실패 기준을 포함하면 더 견고한 코드를 얻을 수 있습니다. 다음은 실패 기준을 포함한 요청의 예시입니다.

“사용자 등록 API를 만들어주세요.

[필수 조건]

  • 이메일, 비밀번호, 이름을 입력받습니다.
  • 비밀번호는 bcrypt로 해싱하여 저장합니다.

[실패 기준 - 이런 경우는 허용되지 않습니다]

  1. 이메일 형식이 아닌 문자열로 가입이 되는 경우
  2. 이미 존재하는 이메일로 중복 가입이 되는 경우
  3. 비밀번호가 8자 미만인데 가입이 되는 경우
  4. 비밀번호가 평문으로 데이터베이스에 저장되는 경우
  5. SQL 인젝션 공격이 가능한 경우
  6. 서버 에러가 발생했을 때 에러 정보가 클라이언트에 노출되는 경우
  7. 가입 처리 중 네트워크 오류가 발생했을 때 사용자가 무한 대기하는 경우

각 실패 시나리오에 대한 적절한 에러 처리를 포함해주세요.”

이렇게 요청하면 AI는 단순히 기능만 구현하는 것이 아니라, 다양한 예외 상황을 고려한 견고한 코드를 생성합니다.

테스트 주도 프롬프팅

TDD를 바이브코딩에 적용하는 “테스트 주도 프롬프팅”은 매우 효과적인 전략입니다. 먼저 테스트 케이스를 작성하고, 그 테스트를 통과하는 코드를 AI에게 요청하는 방식입니다.

예를 들어, 다음과 같이 접근할 수 있습니다.

“다음 테스트 케이스를 모두 통과하는 calculateShippingFee 함수를 만들어주세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 정상 케이스
expect(calculateShippingFee(10000, 'domestic')).toBe(3000);
expect(calculateShippingFee(50000, 'domestic')).toBe(0); // 5만원 이상 무료배송
expect(calculateShippingFee(20000, 'international')).toBe(15000);

// 경계값 케이스
expect(calculateShippingFee(49999, 'domestic')).toBe(3000);
expect(calculateShippingFee(50000, 'domestic')).toBe(0);
expect(calculateShippingFee(50001, 'domestic')).toBe(0);

// 에러 케이스
expect(() => calculateShippingFee(-1000, 'domestic')).toThrow('금액은 0 이상이어야 합니다');
expect(() => calculateShippingFee(10000, 'invalid')).toThrow('유효하지 않은 배송 지역입니다');
expect(() => calculateShippingFee('not a number', 'domestic')).toThrow('금액은 숫자여야 합니다');

함수는 TypeScript로 작성하고, 타입 안전성을 보장해주세요.”

이 방식의 장점은 명확합니다. AI가 생성한 코드가 실제로 모든 케이스를 처리하는지 즉시 확인할 수 있고, 실패하는 테스트가 있다면 정확히 어느 부분이 문제인지 알 수 있습니다.

실패 후 디버깅 전략

AI가 생성한 코드가 실패 기준에 걸렸을 때, 효과적으로 디버깅하는 방법도 중요합니다.

첫째, 구체적인 문제를 지적합니다. “작동하지 않아요”가 아니라 “calculateShippingFee(49999, ‘domestic’)를 호출했을 때 0이 반환되어야 하는데 3000이 반환됩니다”처럼 정확히 무엇이 문제인지 설명합니다.

둘째, 재현 가능한 예시를 제공합니다. “다음 입력으로 테스트했을 때 문제가 발생합니다: [구체적인 입력 데이터]”

셋째, 현재 동작과 기대하는 동작을 명확히 구분합니다. “현재: 이메일 중복 시 500 에러가 발생합니다. 기대: 409 상태 코드와 함께 ‘이미 존재하는 이메일입니다’ 메시지를 반환해야 합니다.”

넷째, 부분적 수정을 요청합니다. 전체 코드를 다시 생성하라고 하지 말고, 문제가 있는 특정 부분만 수정하도록 요청합니다. “calculateShippingFee 함수의 경계값 처리 로직만 수정해주세요. 50000원일 때 무료배송이 적용되어야 합니다.”

문서화와 주석의 중요성

실패 기준과 테스트 케이스는 코드와 함께 문서화되어야 합니다. AI에게 요청할 때 다음을 포함하도록 지시합니다.

“각 함수에 JSDoc 형식의 주석을 추가해주세요. 매개변수 설명, 반환값 설명, 발생 가능한 에러, 사용 예시를 포함해주세요.”

“README.md 파일을 생성해주세요. 프로젝트 설명, 설치 방법, 사용 방법, API 문서, 알려진 제한사항을 포함해주세요.”

“테스트 케이스에 각 시나리오에 대한 설명을 주석으로 추가해주세요. 왜 이 테스트가 필요한지 설명해주세요.”

좋은 문서화는 미래의 당신과 팀원들이 코드를 이해하고 유지보수하는 데 큰 도움이 됩니다. 특히 바이브코딩으로 빠르게 개발할 때는 문서화가 더욱 중요합니다.

5부: 바이브코딩 워크플로우 실전 가이드

프로젝트 시작 단계

바이브코딩 프로젝트는 체계적인 준비로 시작됩니다. 먼저 프로젝트의 목적과 범위를 명확히 정의합니다. “무엇을 만들 것인가?”에 대한 명확한 답을 가지고 시작해야 합니다.

AI를 활용하여 프로젝트 기획서를 작성합니다. “다음 아이디어를 실현 가능한 프로젝트로 구체화해주세요: [아이디어 설명]. 타겟 사용자, 핵심 기능, 기술 스택, 개발 일정, 예상 리스크를 포함한 기획서를 작성해주세요.”

경쟁 제품이나 유사 서비스가 있다면 분석을 요청합니다. “Airbnb와 유사한 숙박 공유 플랫폼을 만들려고 합니다. Airbnb의 핵심 기능을 분석하고, MVP에 필요한 최소 기능 세트를 제안해주세요.”

기술 스택을 결정합니다. AI에게 여러 옵션을 제시받고 프로젝트 특성에 맞는 것을 선택합니다. “모바일 앱 개발을 위해 React Native, Flutter, Swift/Kotlin 중 어떤 것을 선택해야 할까요? 각각의 장단점과 프로젝트 특성에 맞는 추천을 해주세요. 우리 팀은 JavaScript에 익숙하고, iOS와 Android 모두 지원해야 하며, 빠른 프로토타이핑이 중요합니다.”

개발 환경 설정

프로젝트 구조를 생성합니다. “React, TypeScript, Tailwind CSS를 사용하는 프로젝트의 초기 구조를 만들어주세요. src, components, pages, utils, hooks 폴더를 포함하고, eslint, prettier 설정도 포함해주세요.”

패키지 관리와 의존성을 설정합니다. “package.json 파일을 생성하고, 필요한 의존성을 추가해주세요: React Router, Axios, React Query, Zustand, date-fns. 개발 의존성으로 TypeScript, ESLint, Prettier도 포함해주세요.”

Git 저장소를 초기화하고 .gitignore 파일을 설정합니다. “Node.js 프로젝트에 적합한 .gitignore 파일을 생성해주세요. node_modules, .env, build 폴더 등을 제외하고, IDE 설정 파일도 포함해주세요.”

반복적 개발 사이클

바이브코딩의 핵심은 빠른 반복입니다. 큰 기능을 한 번에 만들려고 하지 말고, 작은 단위로 나누어 반복적으로 개발합니다.

1주차: 최소 기능 구현

  • 기본 페이지 구조와 라우팅
  • 사용자 인증 (회원가입, 로그인)
  • 기본 데이터 모델 정의

2주차: 핵심 기능 추가

  • 주요 비즈니스 로직 구현
  • 데이터베이스 연동
  • 기본 CRUD 기능

3주차: UI/UX 개선

  • 디자인 적용
  • 반응형 레이아웃
  • 로딩 상태 및 에러 처리

4주차: 고급 기능 및 최적화

  • 검색, 필터링, 정렬
  • 성능 최적화
  • 테스트 추가

각 주마다 작동하는 버전을 만들고, 실제로 사용해보면서 피드백을 받습니다. 이 과정에서 AI에게 점진적으로 기능을 추가하거나 개선하도록 요청합니다.

코드 리뷰와 리팩토링

AI가 생성한 코드를 그대로 사용하지 말고, 반드시 리뷰하고 필요하면 리팩토링합니다. AI에게 코드 리뷰를 요청할 수도 있습니다.

“다음 코드를 리뷰해주세요. 개선할 점, 잠재적 버그, 성능 이슈, 보안 취약점을 지적해주세요: [코드]”

“이 컴포넌트가 너무 복잡합니다. 더 작은 컴포넌트로 분리하고, 재사용 가능한 커스텀 훅으로 로직을 추출해주세요: [코드]”

“이 코드의 가독성을 높여주세요. 의미 있는 변수명 사용, 적절한 주석 추가, 복잡한 로직 단순화를 해주세요: [코드]”

테스트 작성

바이브코딩으로 빠르게 개발했다고 해서 테스트를 건너뛰면 안 됩니다. AI를 활용하여 테스트 코드도 생성할 수 있습니다.

“다음 함수에 대한 Jest 테스트 코드를 작성해주세요. 정상 케이스, 경계값 케이스, 에러 케이스를 모두 포함해주세요: [함수 코드]”

“이 React 컴포넌트에 대한 React Testing Library 테스트를 작성해주세요. 렌더링, 사용자 인터랙션, 상태 변경을 테스트해주세요: [컴포넌트 코드]”

“이 API 엔드포인트에 대한 통합 테스트를 작성해주세요. Supertest를 사용하고, 성공 케이스와 실패 케이스를 포함해주세요: [API 코드]”

배포와 모니터링

프로젝트가 완성되면 배포합니다. AI를 활용하여 배포 스크립트와 설정을 생성할 수 있습니다.

“Vercel에 Next.js 앱을 배포하기 위한 설정을 작성해주세요. 환경 변수 설정, 빌드 명령어, 리다이렉트 규칙을 포함해주세요.”

“Docker 컨테이너로 Node.js 앱을 배포하기 위한 Dockerfile과 docker-compose.yml을 작성해주세요. 프로덕션 최적화를 고려해주세요.”

“GitHub Actions를 사용한 CI/CD 파이프라인을 설정해주세요. 테스트 실행, 빌드, 배포를 자동화해주세요.”

배포 후에는 모니터링과 로깅을 설정합니다. “Sentry를 사용한 에러 추적 설정을 해주세요. 프론트엔드와 백엔드 모두 포함해주세요.”

6부: 함정 피하기 - 바이브코딩의 일반적인 실수들

과도한 의존

가장 흔한 실수는 AI에게 모든 것을 맡기는 것입니다. AI는 강력한 도구이지만 완벽하지 않습니다. 특히 다음 영역에서는 인간의 판단이 반드시 필요합니다.

아키텍처 설계: 전체 시스템 구조, 데이터 모델, API 설계는 인간이 주도해야 합니다. AI는 제안을 할 수 있지만, 최종 결정은 프로젝트의 장기적 방향을 이해하는 사람이 내려야 합니다.

보안: AI는 일반적인 보안 베스트 프랙티스를 제안할 수 있지만, 프로젝트 특성에 맞는 보안 전략은 전문가의 검토가 필요합니다. 특히 금융, 의료 등 민감한 데이터를 다루는 경우 더욱 그렇습니다.

비즈니스 로직: 복잡한 비즈니스 규칙은 AI가 완전히 이해하기 어렵습니다. 도메인 지식이 필요한 부분은 명확한 명세를 제공하거나 직접 구현해야 합니다.

맥락 손실

긴 프로젝트에서 AI와 대화하다 보면 초기 결정이나 제약사항을 잊어버리기 쉽습니다. 이를 방지하기 위해 다음을 실천하세요.

프로젝트 문서를 유지합니다. 주요 결정사항, 아키텍처 설계, 사용된 패턴 등을 문서화하고, AI에게 요청할 때 이 문서를 참조하도록 합니다.

대화 히스토리를 관리합니다. 중요한 대화는 저장해두고, 새로운 요청을 할 때 관련된 이전 대화를 참조합니다.

컨텍스트를 제공합니다. 새로운 기능을 요청할 때, 기존 코드 구조와 사용 중인 패턴을 함께 제공합니다. “현재 프로젝트는 Redux를 사용하고 있고, 액션은 Redux Toolkit의 createSlice를 사용합니다. 이 패턴에 맞춰 새로운 기능을 추가해주세요.”

코드 품질 저하

빠르게 개발하다 보면 코드 품질이 떨어질 수 있습니다. 다음을 주의하세요.

중복 코드: AI는 맥락을 모르면 비슷한 코드를 반복적으로 생성할 수 있습니다. 정기적으로 리팩토링하여 공통 로직을 추출하세요.

과도한 복잡성: AI는 때때로 지나치게 복잡한 솔루션을 제안할 수 있습니다. 더 간단한 방법이 있는지 질문하세요. “이 코드를 더 간단하게 만들 수 있나요?”

일관성 부족: 여러 번에 걸쳐 AI에게 코드를 요청하면 스타일이나 패턴이 일관되지 않을 수 있습니다. 프로젝트 전체에서 일관된 코딩 스타일을 유지하도록 명시적으로 요청하세요.

테스트 부족

빠른 개발에 집중하다 보면 테스트를 건너뛰기 쉽습니다. 하지만 이는 장기적으로 더 많은 시간을 소비하게 만듭니다. 다음을 실천하세요.

핵심 기능은 반드시 테스트합니다. 사용자 인증, 결제 처리, 데이터 검증 등 중요한 기능은 테스트 없이 배포하지 마세요.

엣지 케이스를 테스트합니다. “이 함수가 null을 받으면 어떻게 되나요?”, “네트워크 오류가 발생하면 어떻게 처리되나요?”와 같은 질문을 하고 테스트를 작성하세요.

회귀 테스트를 자동화합니다. 버그를 수정할 때마다 해당 버그를 재현하는 테스트를 추가하여 같은 문제가 다시 발생하지 않도록 합니다.

성능 무시

초기 개발 단계에서는 기능 구현에 집중하느라 성능을 간과하기 쉽습니다. 하지만 성능 문제는 나중에 수정하기 매우 어려울 수 있습니다.

N+1 쿼리 문제를 주의합니다. 데이터베이스 쿼리를 생성할 때, “이 코드가 100개의 항목에 대해 실행되면 몇 번의 쿼리가 발생하나요?”라고 질문하세요.

불필요한 렌더링을 피합니다. React 컴포넌트를 생성할 때, “이 컴포넌트의 불필요한 리렌더링을 방지하기 위해 useMemo와 useCallback을 적절히 사용해주세요”라고 요청하세요.

번들 크기를 관리합니다. 프론트엔드 프로젝트에서 “이 라이브러리 대신 더 가벼운 대안이 있나요?”라고 질문하세요.

7부: 고급 전략 - 바이브코딩 마스터하기

멀티 에이전트 접근

복잡한 문제는 여러 AI 에이전트를 활용하여 해결할 수 있습니다. 각 에이전트에게 특정 역할을 부여하고 협업하도록 합니다.

예를 들어, 하나의 에이전트는 프론트엔드 개발을 담당하고, 다른 에이전트는 백엔드 API를 담당하며, 또 다른 에이전트는 데이터베이스 스키마를 설계하도록 할 수 있습니다. 이를 위해 Open WebUI의 Channels나 유사한 도구를 활용할 수 있습니다.

실제로 한 개발자는 FPS 게임을 만들 때 여러 AI 모델(Claude, ChatGPT, Grok, Gemini)을 전략 회의에 참여시켜 각각의 강점을 활용했습니다. Claude는 아키텍처 설계를, ChatGPT는 구체적인 코드 구현을, Gemini는 최적화 제안을 담당하는 식으로 역할을 분담했습니다.

프롬프트 라이브러리 구축

효과적인 프롬프트를 발견하면 재사용할 수 있도록 라이브러리로 만드세요. Notion이나 Markdown 파일로 관리할 수 있습니다.

카테고리별로 분류합니다.

  • 컴포넌트 생성 프롬프트
  • API 엔드포인트 생성 프롬프트
  • 테스트 코드 생성 프롬프트
  • 리팩토링 프롬프트
  • 디버깅 프롬프트

각 프롬프트에는 다음 정보를 포함합니다.

  • 용도: 언제 사용하는가
  • 템플릿: 기본 프롬프트 구조
  • 예시: 실제 사용 예시
  • 주의사항: 알려진 제한사항이나 함정

이렇게 구축한 프롬프트 라이브러리는 개인의 생산성을 높일 뿐만 아니라, 팀 전체가 공유하면 팀의 역량을 높일 수 있습니다.

도메인 특화 스킬 개발

특정 도메인에서 반복적으로 작업한다면, 해당 도메인에 특화된 지식과 패턴을 AI에게 학습시킬 수 있습니다. Claude의 경우 Skills 기능을 활용할 수 있습니다.

예를 들어, 전자상거래 프로젝트를 자주 개발한다면 다음과 같은 스킬을 만들 수 있습니다.

  • 상품 관리 베스트 프랙티스
  • 장바구니 구현 패턴
  • 결제 시스템 통합 가이드
  • 재고 관리 로직

이러한 스킬을 만들어두면 새로운 프로젝트를 시작할 때마다 처음부터 설명할 필요 없이, 해당 스킬을 참조하도록 하면 됩니다.

코드 생성을 넘어서

바이브코딩은 단순히 코드를 생성하는 것을 넘어 소프트웨어 개발의 전 과정에 AI를 활용할 수 있습니다.

요구사항 분석: “다음 사용자 피드백을 분석하고, 우선순위가 높은 개선사항을 제안해주세요.”

기술 의사결정: “이 문제를 해결하기 위해 Redis와 Memcached 중 어떤 것이 적합한가요? 우리 프로젝트 특성을 고려하여 추천해주세요.”

문서 작성: “이 API 엔드포인트에 대한 Swagger 문서를 작성해주세요.”

코드 리뷰: “이 Pull Request를 리뷰하고, 개선 사항을 제안해주세요.”

트러블슈팅: “다음 에러 메시지를 분석하고, 가능한 원인과 해결 방법을 제시해주세요.”

지속적 학습과 개선

바이브코딩 도구와 기법은 빠르게 진화하고 있습니다. 최신 트렌드를 지속적으로 학습하고 자신의 워크플로우를 개선해야 합니다.

새로운 AI 모델과 도구를 실험합니다. Claude, GPT, Gemini, DeepSeek 등 다양한 모델을 사용해보고 각각의 강점을 파악합니다.

커뮤니티에 참여합니다. Reddit, Discord, Twitter 등에서 다른 개발자들의 경험을 배우고 자신의 경험을 공유합니다.

바이브코딩 게임잼이나 해커톤에 참여합니다. 실전 경험은 가장 좋은 학습 방법입니다. 2025년에 개최된 바이브코딩 게임잼처럼, AI를 활용한 개발 대회에 참여하여 다른 개발자들과 경쟁하고 배울 수 있습니다.

자신만의 바이브코딩 사례 연구를 작성합니다. 프로젝트를 완료할 때마다 무엇이 효과적이었고 무엇이 아니었는지 기록합니다. 이는 미래의 프로젝트에 귀중한 참고 자료가 됩니다.

8부: 미래를 준비하기

AI 코딩 도구의 진화

2025년 현재, AI 코딩 도구는 단순한 코드 생성을 넘어 에이전트 시스템으로 진화하고 있습니다. OpenAI의 Codex 2025 버전은 대규모 코드베이스에서 기능 구현, 버그 수정, PR 제안을 자동으로 수행할 수 있습니다.

앞으로의 AI 코딩 도구는 다음과 같은 특징을 가질 것으로 예상됩니다.

장시간 자율 작업: 30분 이상의 복잡한 작업을 인간의 개입 없이 수행할 수 있습니다.

멀티모달 이해: 코드뿐만 아니라 디자인 목업, 사용자 인터랙션, 비즈니스 문서를 이해하고 통합할 수 있습니다.

협업 능력: 여러 개발자 및 AI 에이전트와 동시에 협업하며 충돌을 자동으로 해결합니다.

학습 능력: 프로젝트별 패턴과 선호도를 학습하여 점점 더 나은 코드를 생성합니다.

개발자 역할의 변화

바이브코딩 시대에 개발자의 역할은 “코드 작성자”에서 “AI 오케스트레이터”로 변화하고 있습니다. 미래의 성공적인 개발자는 다음 능력을 갖추어야 합니다.

문제 정의 능력: 무엇을 만들어야 하는지 명확히 정의하는 능력이 가장 중요해집니다.

아키텍처 설계 능력: 시스템 전체 구조를 설계하고 AI에게 구현을 위임하는 능력이 필요합니다.

AI 커뮤니케이션 능력: AI와 효과적으로 소통하여 원하는 결과를 얻는 능력이 핵심 역량이 됩니다.

품질 관리 능력: AI가 생성한 코드를 검증하고 개선하는 능력이 중요합니다.

도메인 지식: 기술보다 비즈니스 도메인에 대한 깊은 이해가 더 중요해집니다.

학습 전략

바이브코딩 시대에도 기초는 여전히 중요합니다. 다음을 균형있게 학습해야 합니다.

컴퓨터 과학 기초: 알고리즘, 자료구조, 시스템 설계 등의 기초는 AI가 대체할 수 없는 사고의 틀을 제공합니다.

소프트웨어 엔지니어링 원칙: SOLID 원칙, 디자인 패턴, 아키텍처 패턴 등은 AI에게 더 나은 지시를 내리는 데 도움이 됩니다.

프롬프트 엔지니어링: AI와 소통하는 기술은 새로운 필수 역량입니다.

도메인 지식: 금융, 의료, 전자상거래 등 특정 도메인의 깊은 지식은 경쟁 우위를 만듭니다.

윤리적 고려사항

AI 코딩 도구를 사용할 때는 다음과 같은 윤리적 문제를 고려해야 합니다.

저작권: AI가 생성한 코드의 저작권은 누구에게 있는가? 학습 데이터에 포함된 오픈소스 라이선스는 어떻게 처리해야 하는가?

책임: AI가 생성한 코드에 버그나 보안 취약점이 있을 때 누가 책임을 지는가?

투명성: AI를 사용하여 개발했다는 사실을 공개해야 하는가?

편향: AI가 학습한 데이터의 편향이 코드에 반영될 수 있는가?

이러한 문제에 대해 깊이 생각하고, 자신만의 원칙을 세워야 합니다.

결론: 바이브코딩의 진정한 의미

바이브코딩은 단순히 AI에게 코드를 시키는 것이 아닙니다. 그것은 개발자가 더 높은 수준의 사고에 집중할 수 있게 해주는 도구입니다. 구문 오류를 고치고, 보일러플레이트 코드를 작성하고, 문서를 읽는 데 시간을 쓰는 대신, 문제를 정의하고, 솔루션을 설계하고, 사용자 가치를 창출하는 데 집중할 수 있습니다.

이 가이드에서 강조한 세 가지 핵심 능력을 다시 한 번 정리하면:

  1. 요구사항을 쪼개는 능력: 복잡한 문제를 작고 명확한 단위로 나누어 AI에게 제시합니다.
  2. 애매함을 없애는 질문: 5W1H, 제약조건, 입출력 명세를 통해 명확성을 확보합니다.
  3. 실패 기준을 먼저 정하는 습관: 성공보다 실패를 먼저 정의하여 견고한 코드를 만듭니다.

이 세 가지 능력은 기술적 스킬이 아니라 사고방식입니다. 어떤 프로그래밍 언어를 사용하든, 어떤 AI 도구를 사용하든, 이 사고방식은 변하지 않습니다.

바이브코딩의 역설은 이것입니다: AI가 코드를 더 잘 작성할수록, 인간의 사고가 더 중요해집니다. 코딩 실력보다 사고 방식이 먼저인 이유입니다.

C++ 창시자 비야네 스트로스트룹이 경고했듯이, 바이브코딩은 “개발자가 생각하지 않고 코드를 작성하는 습관”을 만들 수 있습니다. 하지만 이 가이드에서 제시한 체계적 접근을 따른다면, 오히려 더 깊이 생각하고 더 나은 소프트웨어를 만들 수 있습니다.

2025년 현재, AI 코딩 도구 시장은 연평균 25.2%로 성장하고 있으며, 개발자의 92%가 일상적으로 AI 도구를 사용합니다. 이것은 선택이 아니라 현실입니다. 중요한 것은 도구를 사용하느냐 마느냐가 아니라, 어떻게 사용하느냐입니다.

이 가이드가 제시한 원칙과 전략을 실천하면서, 여러분만의 바이브코딩 스타일을 개발해 나가시기 바랍니다. AI는 강력한 파트너이지만, 결국 소프트웨어를 만드는 것은 인간의 창의성과 판단력입니다.

코드를 작성하는 방식은 변했지만, 훌륭한 소프트웨어를 만들기 위한 근본적인 원칙은 변하지 않았습니다: 명확한 사고, 체계적 접근, 지속적 개선. 바이브코딩은 이러한 원칙을 더 효과적으로 실현하는 도구일 뿐입니다.

이제 시작하세요. 첫 번째 프로젝트에서 요구사항을 쪼개고, 애매함을 제거하고, 실패 기준을 정하는 것부터 시작하세요. 바이브코딩의 진정한 힘은 도구가 아니라 여러분의 사고방식에 있습니다.


작성일자: 2025-12-24

관련글

1
2
3
4
5
6
7
8
9
“바이브코딩 잘하는 사람”은 결국 이걸 잘함.
1. 요구사항을 쪼개는 능력
2. 애매함을 없애는 질문
3. 실패 기준을 먼저 정하는 습관
코딩 실력보다, 사고 방식이 먼저임.

https://www.threads.com/@devroder.tare/post/DSm29LAEvd9

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.