ChatGPT를 단순한 코드 생성기가 아니라, 실무에서 믿고 쓸 수 있는 개발 파트너로 만들 수 있을까요?
이 질문에 답하기 위해, 마틴 파울러(Martin Fowler)는 ThoughtWorks의 테크 리드인 Xu Hao와 함께 ChatGPT를 **페어 프로그래머(Pair Programmer)**처럼 활용하는 전략을 제시했습니다. 단순히 "코드 짜줘"라고 묻는 대신, 문제 해결 과정을 계획하고, 프롬프트를 설계하고, 대화형으로 구현하는 방식입니다.
이 블로그에서는 실제 프로젝트 사례(온라인 화이트보드 시스템)를 통해 이 전략이 어떻게 작동하는지 자세히 소개합니다. 아키텍처 설계부터 테스트 작성, 코드 리팩토링, 그리고 LLM의 한계까지 모두 다룹니다.
🔍 ChatGPT와 페어 프로그래밍: 핵심 전략 3가지
1. Generated Knowledge: 문제 해결의 첫 걸음은 "계획"이다
ChatGPT에게 처음부터 코드를 묻지 않습니다. 대신 이렇게 시작합니다:
“이런 시스템에서 이런 기능을 만들고 싶다. 어떻게 접근할까?”
이 방식은 GPT가 단순히 코드를 찍어내는 대신, 맥락을 이해하고 구조를 제안하게 유도합니다. 이를 통해 기능 요구사항에 맞는 계획, 즉 할 일 목록을 생성합니다. 이걸 기반으로 코드를 점진적으로 만들어가는 겁니다.
2. 꼬리물기(Chain of Thought): 대화로 구체화하라
Generated Knowledge로 만든 계획을 기반으로, GPT와의 대화를 이어갑니다. 처음에는 계획을, 그 다음은 설계, 그리고 마지막에는 구현. 이때 핵심은 매 단계마다 피드백을 주고받으며 점진적으로 코드를 정교화하는 것입니다. 마치 페어 프로그래밍을 하듯이요.
3. 프롬프트 설계: 도구가 아닌 "동료"로 대하라
GPT에게 "코드 짜줘"라고만 하면 결과물은 애매해집니다. 하지만 프로젝트의 기술 스택, 아키텍처, 테스트 전략 등을 명확히 설명하면, GPT는 놀라울 정도로 문맥에 맞는 코드를 작성할 수 있습니다.
📌 예시 프롬프트:
현재 시스템은 온라인 화이트보드 시스템입니다. 기술 스택: TypeScript, React, Redux, KonvaJS, React-Konva. 테스트: Vitest, React Testing Library, Cypress. 모든 코드는 MVVM 패턴의 React 컴포넌트로 구현해야 합니다.
🧪 실전 사례: 화이트보드 시스템에서 Awareness Layer 만들기
시스템 개요
- 기술 스택: TypeScript, React, Redux, KonvaJS, React-Konva
- 아키텍처: MVVM 패턴
- 테스트 툴: Vitest, React Testing Library, Cypress
요구사항 정리
- 리모트 유저의 커서 위치, 이름, 온라인 상태를 화이트보드에 표시
- 로컬 유저(자신)의 정보는 표시하지 않아야 함
- 커서 위치가 바뀌면 애니메이션으로 자연스럽게 움직여야 함
🧩 구성 전략과 할 일 목록
GPT가 제안한 설계 전략은 이렇게 정리됩니다.
✅ 모델
- awareness Redux Slice 생성 (리모트 유저 상태 저장)
✅ 뷰 모델
- AwarenessViewModel 인터페이스 생성
- updateUserAwarenessInfo 메서드로 상태 업데이트 처리
- React 컴포넌트에서 뷰 모델 상태를 가져오기 위해 useSelector 사용
✅ 뷰
- AwarenessInfo 컴포넌트로 커서, 이름 표시
- Konva Layer (AwarenessLayer) 생성
- 커서 위치 애니메이션은 Konva.Tween 사용
✅ 테스트
- 뷰 컴포넌트: React Testing Library 사용, 데이터 기반 테스트
- 뷰 모델: Vitest로 로직 테스트
- 통합 테스트: Cypress 사용
🧪 TDD로 시작한 코드 작성 예시
ChatGPT는 테스트 코드를 먼저 작성하라고 안내합니다. 예시는 다음과 같습니다.
describe('AwarenessViewModel', () => {
it('커서 위치를 업데이트하면 액션이 디스패치 된다', () => {
viewModel.updateCursorPosition('user1', { x: 50, y: 50 });
expect(mockDispatch).toHaveBeenCalledWith(updateAwareness({
user: 'user1',
cursorPosition: { x: 50, y: 50 },
}));
});
});
이후 awarenessSlice.ts와 AwarenessViewModel.ts 코드를 작성하면서 테스트에 맞춰 구현해 나갑니다.
🧹 코드 리팩토링과 실제 문제 해결
초기에는 redux-mock-store를 사용했지만, 기술 스택에 포함되지 않아 jest.fn()으로 mock dispatch를 구현하도록 리팩토링합니다.
또한, 테스트 시점에서 configureTestingStore와 같은 팀 컨벤션을 GPT에게 알려주면 이를 반영해 테스트 코드를 개선합니다.
⚠️ LLM 사용의 한계: 토큰 제한과 맥락 손실
ChatGPT는 토큰 제한 때문에 긴 대화에서는 앞서 말한 내용을 "잊어버리는" 문제가 있습니다. 이를 해결하려면:
- 할 일 목록에 번호 붙이기: GPT가 구조를 유지하도록 유도
- 프롬프트 재입력: 대화 재개 시 핵심 전략과 상태를 재요약
- 꼬리물기 대화 유지: 한 번에 모든 걸 묻지 않고, 단계별로 진행
GPT는 '시니어가 이끄는 주니어 개발자'처럼 다뤄야 한다
이 전략의 핵심은 간단합니다.
ChatGPT는 코드를 "짜주는" 도구가 아니라, 함께 문제를 해결하는 "사고 파트너"다.
Martin Fowler가 강조한 방식은 LLM을 단순 지시 대상이 아닌 대화형 페어 프로그래머로 활용하는 방법입니다. 이 방식은 팀 컨벤션, 아키텍처, 테스트 전략 등을 정교하게 반영할 수 있으며, 무엇보다 코드 품질을 높이는 데 실질적으로 도움이 됩니다.
📌 마무리 요약
- 계획 → 대화 → 구현 → 테스트의 흐름이 중요
- GPT를 ‘주니어 개발자’처럼 대하면서 명확한 가이드를 제공해야 함
- 테스트, 아키텍처, 맥락 등 실무 환경에 맞는 프롬프트 설계가 핵심
- 토큰 제한, 보안 이슈, 맥락 손실 등 LLM의 한계를 인식하고 보완 전략 필요
https://martinfowler.com/articles/2023-chatgpt-xu-hao.html
An example of LLM prompting for programming
Generated knowledge and chain of thought prompting of an LLM can generate useful code.
martinfowler.com
'인공지능' 카테고리의 다른 글
알리바바의 새로운 한 수, 'Qwen2.5-Omni-3B' — 작지만 강력한 음성 대화 AI (0) | 2025.05.03 |
---|---|
사람처럼 보고 듣고 말하는 AI? - 카카오의 통합 멀티모달 모델 ‘카나나-o’가 주목받는 이유 (0) | 2025.05.03 |
Claude가 당신의 팀원이 된다면? - Claude Integrations로 업무 자동화와 협업을 완전히 바꾸는 방법 (0) | 2025.05.02 |
AI가 당신 대신 코드를 짠다? 마크 저커버그의 충격 발언과 다가오는 개발의 미래 (0) | 2025.05.02 |
AI 에이전트의 연결고리: A2A, MCP, Kafka, Flink로 완성하는 실시간 협업 스택 (0) | 2025.05.02 |