바이브 코딩과 테스트 주도 개발
AI 시대에서 테스트 코드의 가치
배경
최근 바이브 코딩을 경험해 보며 테스트 코드, 그중에서도 테스트 주도 개발의 중요함을 다시금 깨닫는 중이다. 이와 관련해 AI 시대에서 테스트 주도 개발과 테스트 코드의 가치에 대한 짧은 생각을 작성해 보고자 한다.
비용 관점
코드를 작성하는 비용의 관점에서 테스트 코드의 중요성을 이야기한다.
0으로 수렴 중인 프로덕션 코드 작성의 비용
코딩 에이전트에게 작성하고 싶은 프로그램의 명세를 설명하면 눈 깜짝할 새 꽤 잘 동작하는 코드를 작성해 준다. 소프트웨어 공학적 지식이 없더라도 LLM과 함께라면 간단한 기능은 그럴듯하게 만들어낼 수 있다. 이처럼 LLM의 발전으로 프로덕션 코드 작성의 비용은 0으로 수렴 중이다. 0은 상징적인 의미일 뿐 정확히는 LLM 호출 비용으로 수렴 중이라고 할 수 있다. 그래서인지 바이브 코딩이란 말도 생겨나고 너도나도 바이브 코딩으로 다양한 시도를 하는 중이다.
여전히 큰 비용을 들여야 하는 명세 작성
바이브 코딩에서 중요한 것은 상세하고 정확한 명세를 LLM에 알려주는 것이다. 조금이라도 빈틈이 있다면 예상과는 전혀 다른 코드를 작성한다. 아직 명세 작성만큼은 사람의 손길이 필요한 것이다. 우리가 원하는 프로그램을 만드는 것이기에 이는 어쩌면 당연한 말일 수 있다. 즉, 명세 작성에는 여전히 큰 비용을 들여야 한다.
테스트 코드가 곧 명세다
여기서 상기해 봐야 하는 점은 테스트 코드가 곧 명세라는 점이다. 명세를 기계가 이해할 만큼의 세부 사항까지 명확히 표현하면 곧 테스트 코드가 되기 때문이다. 즉, 테스트 코드를 작성한다는 것은 요구사항을 상세히 정의하는 것이기에 여전히 그 가치를 유지하고 있으며 큰 비용을 들여야 한다. 그렇기에 비용 관점에서 우리가 주의 깊게 챙겨야 하는 것은 테스트 코드다.
로버트 C. 마틴은 2008년에 클린 코드에서 다음과 같이 말하였다.
실제로도 코드의 종말이 코앞에 닥쳤다고 주장하는 사람이 없지 않다. 코드를 자동으로 생성하는 시대가 다가온다는 말이다. (중략) 헛소리! 앞으로 코드가 사라질 가망은 전혀 없다! 왜? 코드는 요구사항을 상세히 표현하는 수단이니까! 어느 수준에 이르면 코드의 도움 없이 요구사항을 상세하게 표현하기란 불가능하다. 추상화도 불가능하다.
출처: 로버트 C. 마틴. Clean Code(클린 코드). 인사이트, 2013.
코딩 에이전트의 한계 관점
코딩 에이전트의 한계 관점에서 테스트 코드의 중요성을 이야기한다.
컨텍스트 한계
현재의 LLM은 한 번에 처리할 수 있는 양이 제한적이다. 다룰 수 있는 컨텍스트가 무한하지 않기 때문에 Claude Code와 같은 코딩 에이전트들은 컨텍스트가 초과하면 컨텍스트를 압축한다. 문제는 컨텍스트 압축이 일어나면 작업 결과물의 품질이 크게 저하된다는 것이다. 당연하게도 압축하는 과정에서 꽤 많은 정보가 증발하기 때문이다.
장기 기억이 없는 한계
또한, 코딩 에이전트는 장기 기억이 없어 세션을 종료하고 새로운 세션을 시작하면 모든 것이 초기화된 상태로 새로 시작하게 된다. 물론, 최근 Claude Code와 같은 코딩 에이전트는 --continue, --resume과 같은 세션 복원 기능을 제공하지만, 아직 이런 기능을 제공하지 않는 코딩 에이전트도 있을뿐더러 세션 복원 기능을 사용하더라도 얼마 안 가 컨텍스트가 압축되어 결과물 품질이 저하되는 시점이 오기에 세션을 새로 시작하기 마련이다.
컨텍스트 전달자로서 테스트 코드
컨텍스트 한계와 장기 기억이 없는 한계와 같이 기존에 작업하던 컨텍스트를 코딩 에이전트에게 전달해야 할 경우에 미리 작성된 테스트 코드가 큰 도움이 된다. 앞서 설명했듯이 테스트 코드는 곧 명세이기 때문이다. 또한, 테스트 주도 개발을 따라 미리 작성한 테스트 코드라면 테스트 코드 실행을 통해 어디까지 구현되었는지 명확히 파악할 수 있다. 코딩 에이전트는 그저 작성된 테스트 코드를 바탕으로 TDD 사이클을 따라 테스트 코드를 통과시키고 코드를 개선하면 되는 것이다.
명세라는 근본 가치
아마 대다수의 프로그래머가 프로덕션 코드 작성 전 명세가 명확해야 한다는 점에 동의할 것이다. 그 역은 성립할 수 없기 때문이다. 그만큼 프로덕션 코드 작성 전 테스트 코드를 작성하는 것은 자연스러운 것이다.
결국, 바이브 코딩의 시대에도 테스트 주도 개발이 여전히 가치가 있는 방법론이라는 것은 명세라는 근본 가치에서 나온다. 명세를 정의하는 것은 사용자에게 우리가 만들어낼 소프트웨어로 가치를 전달하는 출발점이다.
모두가 인공지능의 발전으로 세상이 빠르게 바뀌고 있다고 한다. 그러나, 본질은 변하지 않고 본질을 꿰뚫는 방법론 역시 여전히 유효하다는 점을 경험했다. 어쩌면 우리가 살펴보아야 할 것은 매일 생겨나는 도구들이 아니라 우리가 소프트웨어를 작성하고 있는 이유가 아닐까?
참고문헌
- 로버트 C. 마틴. Clean Code(클린 코드). 인사이트, 2013.