본문 바로가기

인공지능

ChatGPT를 '주니어 개발자'처럼 쓰는 법? 마틴 파울러가 알려준 페어 프로그래밍 전략

728x90
반응형

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가 구조를 유지하도록 유도
  • 프롬프트 재입력: 대화 재개 시 핵심 전략과 상태를 재요약
  • 꼬리물기 대화 유지: 한 번에 모든 걸 묻지 않고, 단계별로 진행

728x90

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

728x90
반응형