dv-note
サインイン
백엔드 개발

AI 코딩: 자연어 대신 테스트로 대화하라

박
박상철
2025年11月6日7ヶ月前
카테고리
  1. AI
  2. 개발
최근 AI에게 "이 기능 만들어줘"라고 명령하는 바이브코딩(Vibe Coding)이 주목받고 있다.
이 용어를 만든 안드레 카파시는 "가장 좋은 프로그래밍 언어는 영어가 될 것이다"라고 말하며, 자연어를 이용한 코딩 방식이 미래라고 설명했다.
그러나 나는 조금 다르게 생각한다.
자연어는 본래 일상 대화를 위한 언어이며, 정확한 명세를 표현하기엔 모호하다.
같은 문장을 입력해도, AI 모델의 버전이나 문맥에 따라 결과가 달라지는 비결정성(indeterminacy)이 존재한다.

자연어 코딩의 한계

자연어로 AI에게 "로그인 기능 만들어줘"라고 하면, 어떤 결과가 나올까?
누구는 JWT 기반 로그인, 누구는 세션 로그인, 또 누구는 OAuth2를 구현할 수도 있다.
명령은 같지만, 결과는 다르다.
이처럼 자연어는 명세 언어로서 불확실성을 가지고 있다.
AI 코딩의 본질적인 문제는 바로 이 불명확한 요구사항 표현에 있다.
결국, 우리가 원하는 것은 "AI가 정확히 우리가 원하는 조건을 만족하는 코드"다.
참조하면 좋은 글
LLMs bring new nature of abstraction
A long-form article entitled: "LLMs bring new nature of abstraction"
martinfowler.com

테스트를 명령어로

그렇다면, 테스트를 명령어로 사용하는 것은 어떨까?
테스트 주도 개발(TDD)은 "테스트가 명세이자 목표"라는 철학 위에 서 있다.
테스트를 먼저 작성하고, 그 테스트를 통과하는 구현을 만든다.
이 방식은 결과를 검증 가능하고 재현 가능한 형태로 정의한다.
AI 코딩에서도 이 철학을 적용할 수 있다.
자연어 대신 테스트를 작성하고, AI에게 그 테스트를 통과하는 코드를 생성하게 하면 된다.

예시: 테스트 명세

아래는 간단한 문자열 유틸리티 함수를 AI에게 구현시키는 예시다.
자연어 명령 대신, 테스트 코드가 "명령" 역할을 한다.
import io.kotest.core.spec.style.BehaviorSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.nulls.shouldBeNull

class 문자열유틸리티_테스트 : BehaviorSpec({

    Given("문자열의 첫 글자를 대문자로 바꾸는 함수가 있을 때") {

        When("정상적인 문자열이 주어지면") {
            val input = "hello world"
            val result = input.capitalizeFirstLetter(input)

            Then("첫 글자가 대문자로 변환되어야 한다") {
                result shouldBe "Hello world"
            }
        }

        When("빈 문자열이 주어지면") {
            val input = ""
            val result = input.capitalizeFirstLetter(input)

            Then("그대로 빈 문자열을 반환해야 한다") {
                result shouldBe ""
            }
        }

        When("null이 주어지면") {
            val input: String? = null
            val result = input.capitalizeFirstLetter(input)

            Then("null을 반환해야 한다") {
                result.shouldBeNull()
            }
        }
    }
})
AI에게 이 테스트를 주고 "이 테스트를 모두 통과하는 코드를 만들어줘"라고 요청하면,
AI는 다음과 같이 구현할 것이다:
fun String?.capitalizeFirstLetter(): String? {
    if (this.isNullOrEmpty()) return this
    return this[0].uppercaseChar() + this.substring(1)
}
자연어보다 훨씬 명확하고 검증 가능한 대화다.

테스트 기반 AI 코딩의 장점

1.
명확성: 테스트는 요구사항을 모호하지 않게 정의한다.
2.
검증 가능성: 결과가 테스트로 자동 검증된다.
3.
재현성: 같은 테스트를 주면 항상 같은 결과가 나온다.
4.
자동화 용이성: CI/CD와 결합하면 자동 품질 보증 가능.
AI 코딩의 핵심은 결국 "명세를 어떻게 표현하느냐"에 있다
자연어는 인간 친화적이지만 기계에게는 모호하다. 테스트는 기계 친화적이면서 인간이 이해할 수 있는 공통 언어다.

AI와 인간의 논리적 인터페이스: 테스트

AI 코딩의 미래는 자연어가 아니라, 테스트 중심의 대화형 명세 언어로 향하고 있다.
테스트는 가장 명확한 대화의 형태이며, AI와 인간이 공유할 수 있는 논리적 인터페이스다.
Dv
「dv-note」を購読
サイトを購読すると、新規投稿などの最新情報を通知やメールでいち早く受け取れます。
Slashpageに登録して「dv-note」を購読しましょう!
購読する
👍