소프트웨어 개발 분야에서 생성형 AI, 특히 대규모 언어 모델(LLM)은 개발자의 작업 방식을 빠르게 변화시키고 있습니다. Martin Fowler가 연재한 “Exploring Generative AI” 시리즈를 통해 소프트웨어 개발에서 생성형 AI의 역할과 영향을 심층적으로 살펴보겠습니다.
생성형 AI 코딩 도구의 이해

생성형 AI 코딩 도구는 크게 다음과 같은 영역에서 개발자를 지원합니다:
- 정보 탐색: 필요한 정보를 빠르게 찾고 맥락에 맞게 제공
- 코드 생성: 요구사항에 맞는 코드 자동 생성
- 코드 이해: 기존 코드 설명 및 문제점 분석
- 코드 변환: 코드를 문서나 다이어그램 등 다른 형태로 변환
이러한 도구는 채팅 인터페이스, 코드 편집기 내 인라인 어시스턴트, 명령줄 인터페이스 등 다양한 방식으로 개발자와 상호작용합니다. 특히 GitHub Copilot, ChatGPT, Cursor와 같은 도구들이 현재 널리 사용되고 있습니다.
생성형 AI 코딩의 효과적인 사용 조건
생성형 AI가 코딩에 도움이 되는 조건은 다양한 요소에 따라 달라집니다:
1. 보편적인 기술 스택
널리 사용되는 JavaScript, Python과 같은 언어에서는 AI의 제안이 더 정확하고 유용한 경향이 있습니다. 이는 이러한 언어들이 AI 모델의 학습 데이터에 더 많이 포함되어 있기 때문입니다. 그러나 Rust와 같은 덜 보편적인 언어에서도 AI 코딩 도구가 여전히 유용할 수 있다는 사례도 있습니다.
2. 단순하고 일반적인 문제
AI는 중앙값 계산 함수 구현과 같은 일반적인 문제나 반복적인 코드 패턴에서 특히 효과적입니다. 또한 보일러플레이트 코드 생성이나 데이터 구조 처리 등에서도 뛰어난 성능을 보입니다.
// AI가 생성한 중앙값 계산 함수 예시
function median(values: number[]) {
const sorted = values.slice().sort((a, b) => a - b);
const middle = Math.floor(sorted.length / 2);
if (sorted.length % 2 === 0) {
return (sorted[middle - 1] + sorted[middle]) / 2;
} else {
return sorted[middle];
}
}
3. 제안의 크기
AI가 제안하는 코드 조각이 작을수록 검토가 용이하고 개발자가 이해하기 쉽습니다. 큰 코드 조각은 더 많은 검토 시간이 필요하고 맥락에 맞게 수정해야 할 가능성이 높습니다.
4. 개발자의 경험
경험이 풍부한 개발자일수록 AI 제안의 품질을 더 잘 판단하고 효과적으로 활용할 수 있습니다. 한 연구에 따르면 주니어 개발자는 AI 도구를 사용할 때 오히려 7-10% 정도 더 많은 시간이 걸리는 경우도 있었습니다.
AI 코딩 도구의 한계와 주의점

AI 코딩 도구가 매우 유용하지만, 몇 가지 중요한 한계와 주의점이 있습니다:
1. 잘못된 관행 증폭
AI는 좋은 코드와 나쁜 코드를 구분하지 못합니다. 코드베이스에 있는 나쁜 예제를 복사하여 이를 증폭시킬 수 있습니다. 또한 인터페이스 리팩토링 후에도 AI가 이전 방식을 계속 제안할 수 있는 “오염된 컨텍스트” 문제가 발생할 수 있습니다.
2. 검토 피로와 과신
AI 코딩 도구를 사용하면 작은 코드 검토를 반복적으로 해야 하는데, 이는 인지적으로 다른 작업이며 개발자가 덜 즐기는 활동입니다. 이로 인해 검토 피로가 발생하거나 AI 제안을 과신하게 될 수 있습니다.
주요 인지적 편향:
- 자동화 편향: 자동화된 시스템의 제안을 선호하고 다른 정보를 무시하는 경향
- 매몰 비용 오류: AI가 제안한 코드를 직접 작성하는 것보다 수정하는 데 더 많은 시간을 투자하는 경향
- 닻 내림 효과: AI 제안을 본 후 다른 해결책을 생각하기 어려워지는 현상

3. 페어 프로그래밍 대체 불가
AI 코딩 도구를 “AI 페어 프로그래머”라고 홍보하는 경우가 있지만, 이는 페어 프로그래밍의 본질을 오해한 것입니다. 페어 프로그래밍은 단순히 코드 작성을 도와주는 것 이상의 가치가 있습니다.
페어 프로그래밍은 다음과 같은 측면에서 AI가 대체할 수 없는 이점을 제공합니다:
- 집단적 코드 소유권: 팀원들이 함께 코드를 이해하고 책임지는 문화 형성
- 암묵적 지식 공유: 문서화되지 않은 노하우와 컨텍스트 정보 교환
- 팀 흐름 개선: 의사소통 강화와 작업 방해 요소 감소
- 협업 스킬 연습: 소통, 공감, 피드백 교환 능력 향상
AI는 코드 생성과 기술적 지원 측면에서는 도움이 될 수 있지만, 팀 전체를 개선하는 페어 프로그래밍의 사회적, 문화적 측면을 복제할 수 없습니다. 오히려 AI 코딩 도구를 페어 프로그래밍 중에 함께 활용하는 것이 더 효과적인 접근법이 될 수 있습니다.
TDD와 AI 코딩
테스트 주도 개발(TDD)은 AI 코딩 시대에도 여전히 중요합니다. TDD는 두 가지 주요 이점을 제공합니다:
- 빠르고 정확한 피드백: AI가 작성한 코드에 대해서도 빠른 피드백이 필요합니다.
- 문제 분할 정복: TDD는 작은 단위로 문제를 해결하여 연속적 통합과 배포를 가능하게 합니다.
GitHub Copilot과 TDD를 함께 사용하는 팁:
- 시작: 빈 파일이 아닌 사용자 스토리나 요구사항 등의 컨텍스트로 시작
- 빨간색 단계: 설명이 풍부한 테스트 이름 작성, Given-When-Then 구조 활용
- 초록색 단계: 기존 테스트를 기반으로 구현 코드 생성, 필요시 추가 테스트 작성
- 리팩토링 단계: IDE 리팩토링 기능과 결합하여 사용, 필요시 Copilot Chat 활용
생성형 AI와 다른 코드 생성기의 차이
생성형 AI는 기존의 모델 주도 개발(MDD)이나 로우 코드 플랫폼과 다릅니다. 이전의 접근 방식은 추상화 수준과 사용자 정의 사이의 균형을 맞추기 어려웠습니다.

생성형 AI는 이러한 “보이지 않는 힘의 장벽”을 극복하지 않고, 대신 모든 추상화 수준에서 인간을 더 효과적으로 만듭니다. 구조화된 언어나 번역기를 공식적으로 정의할 필요 없이 자연어로 상호작용할 수 있습니다.
AI 코딩 도구의 신뢰성 문제 해결
AI 코딩 도구의 신뢰성 문제를 다루기 위한 전략:
- 빠른 피드백 루프: IDE의 구문 강조, 컴파일러 통합, 린팅 플러그인 등을 활용
- 신뢰할 수 있는 피드백 루프: 테스트 신뢰도 평가, 페어 프로그래밍으로 추가 검토
- 오류 여유 평가: 보안 관련 코드나 장기적으로 유지될 코드는 더 엄격하게 검토
- 최신 정보 필요성 고려: 매우 최신 정보가 필요한 경우 AI의 정확성이 낮을 수 있음
AI 사용 시간 제한을 두고, AI에 대한 적절한 기대치를 설정하는 것이 중요합니다. GitHub Copilot은 100% 완벽한 코드를 제공하지 않지만, 약 40-60%의 상황에서 40-80%의 작업을 처리할 수 있어 여전히 유용합니다.
레거시 코드베이스 이해를 위한 AI 활용
AI는 레거시 코드베이스나 여러 코드베이스로 구성된 큰 애플리케이션을 이해하는 데 도움을 줄 수 있습니다. 하지만 몇 가지 중요한 한계가 있습니다:
- 관련 저장소와 파일을 자동으로 확인하는 능력이 중요함
- “이 코드는 어디에 있나요?”와 같은 질문에 대한 결과가 100% 정확하지 않아도 유용한 방향 제시 가능
- 개발 환경 설정은 잘 문서화되고 자동화된 설정을 대체할 수 없음
- 단위 테스트가 없는 코드베이스에 단위 테스트를 추가하는 것은 현실적으로 어려움
기술 스택 마이그레이션을 위한 AI 에이전트 구축

기술 스택 마이그레이션은 AI의 도움을 받을 수 있는 유망한 사용 사례입니다. Microsoft의 오픈소스 도구인 autogen을 활용하여 Enzyme 테스트를 React Testing Library로 마이그레이션한 실험에서 몇 가지 관찰 사항이 있었습니다:
- 요청이 반복될수록 컨텍스트가 커지고 복잡해짐
- 코드 수정 후 매번 피드백을 받기 위한 많은 왕복 통신 필요
- 구문 문제로 인해 AI가 완전히 막히는 경우가 많음
개발자 에이전트는 아직 모든 종류의 코딩 문제를 해결하지는 못하지만, 특정 영역(특히 기술 스택 마이그레이션)에서는 유용할 수 있습니다.
멀티 파일 편집을 통한 솔루션 확장

최근 GitHub Copilot에 추가된 멀티 파일 편집 기능은 코딩 지원의 범위를 단일 파일 내 작은 제안에서 여러 파일에 걸친 대규모 구현으로 확장합니다. 이 기능은 이미 Cline, Aider, Cursor와 같은 도구에서 제공되고 있었지만, GitHub Copilot에 추가됨으로써 기업에서 가장 널리 사용되는 코딩 도구에 통합되었습니다.
멀티 파일 편집 사용 시 고려해야 할 사항:
- 문제 크기: 문제가 클수록 AI에 필요한 코드 컨텍스트가 많아지고, 토큰 제한에 도달하거나 AI가 잘못된 결과를 생성할 가능성이 높아집니다.
- 문제 설명 vs 구현 계획: 도구에 문제를 설명하는 대신 구현 계획을 제공하게 되어 추상화 수준이 낮아집니다.
- 검토 경험: 개발자가 변경 사항을 쉽게 이해하고 평가할 수 있어야 합니다. 불필요한 변경이나 코드 재포맷팅이 발생할 수 있습니다.
- 피드백 루프: 백엔드 단위 테스트, API 통합 테스트, 프론트엔드 컴포넌트 테스트 등 다양한 수준의 테스트가 필요할 수 있습니다.
멀티 파일 편집은 강력한 기능이지만, AI의 영향 범위를 넓히기 때문에 책임감 있게 사용하는 방법을 배우는 데 시간이 필요합니다.
LLM 추론 능력의 소프트웨어 개발 역할

대규모 언어 모델(LLM)은 패턴 매칭과 통계적 다음 토큰 예측을 기반으로 작동하지만, 문제를 “추론”하는 능력도 갖추고 있습니다. OpenAI의 “o1″과 “o3”, DeepSeek의 “R1″과 같은 모델은 추론 능력이 뛰어납니다. 그러나 코딩 작업에서 이 능력의 역할은 무엇일까요?
추론 능력의 한계
- 컨텍스트의 중요성: Apple의 연구에 따르면 이름과 숫자의 변화, 문제의 난이도와 크기 증가, 무관한 정보 추가가 모델의 수학 추론 성능에 부정적인 영향을 미칩니다.
- 추론 단계에서 함수 호출 불가: 추론 모델은 먼저 사용자의 프롬프트에 대해 “추론”한 다음 최종 결과를 반환합니다. 이 추론 단계에서는 함수를 호출할 수 없어 디버깅과 같은 작업에 제한이 있습니다.
코딩 작업에서 추론의 관련성
추론 모델은 주로 다음과 같은 맥락에서 사용됩니다:
- 디버깅: 디버깅은 체인 오브 소트(chain of thought)에 적합하지만, 함수 호출 제한으로 인해 가설을 검증하기 위한 정보를 찾는 데 어려움이 있습니다.
- 구현 계획 수립: 많은 개발자가 코딩 계획 단계에서 추론 모델을 사용하고, 실제 구현에는 코딩에 특화된 모델을 사용합니다. 그러나 계획 수립이 실제로 추론 능력을 필요로 하는지는 불확실합니다.
에이전트 코딩에서 개발자 기술의 역할
에이전트 코딩 도구가 발전함에 따라 “1년 후에는 개발자가 필요 없을 것”이라는 극단적인 예측부터 주니어 개발자 교육에 대한 우려까지 다양한 반응이 있습니다.
Cursor, Windsurf, Cline과 같은 도구의 에이전트 모드는 테스트 실행, 린팅 오류 수정, 웹 검색, 브라우저 미리보기 등의 기능으로 개발자를 지원합니다. 그러나 이러한 성공적인 세션에서도 개발자의 개입, 수정, 지시가 계속 필요했습니다.
AI 실수의 영향 범위:
- 커밋 시간: 코드가 작동하지 않거나 문제를 잘못 진단하는 경우
- 반복 흐름: 너무 많은 선행 작업, 근본 원인 분석 대신 강제 해결, 개발자 워크플로우 복잡화, 요구사항 오해 등
- 장기적 유지보수성: 가장 심각한 영향으로, 몇 주 또는 몇 달 후에야 발견될 수 있는 문제
결론
생성형 AI는 소프트웨어 개발 분야에 혁명적인 변화를 가져오고 있지만, 개발자의 경험과 판단력이 여전히 중요합니다. AI 도구는 개발자를 대체하기보다 보완하는 역할을 하며, 이러한 도구를 효과적으로 사용하기 위해서는 그 장단점과 한계를 이해해야 합니다.
생성형 AI를 활용한 코딩은 특정 상황에서 매우 유용하지만, 코드 품질, 팀 협업, 지식 공유, 유지보수성과 같은 소프트웨어 개발의 핵심 측면은 여전히 인간 개발자의 영역입니다. 개발자는 AI와 협력하여 각자의 강점을 활용하는 방법을 배우는 과정에 있으며, 이는 앞으로의 소프트웨어 개발 방식을 크게 변화시킬 것입니다.
Comments