AI 코딩 어시스턴트 시대의 개발 워크플로우 정리
핵심 요약
AI 코딩 도구는 "자동 코더"가 아니라, 강력하지만 실수도 많은 페어 프로그래머다.
명확한 설계, 작은 단위 작업, 풍부한 컨텍스트, 철저한 테스트와 리뷰를 전제로 할 때 비로소 폭발적인 생산성을 낸다.
AI가 절반을 코딩해도, 최종 책임과 판단은 여전히 인간 개발자에게 있다.
명확한 설계가 먼저다: 코드를 쓰기 전에 문제부터 정의하기
AI에게 막연히 "이런 앱 만들어줘"라고 요구하면, 그럴듯하지만 애매한 코드 덩어리가 나온다.
좋은 결과를 원하면 인간이 먼저 문제를 구조화해야 한다. 목표, 요구사항, 제약, 엣지 케이스를 가능한 한 구체적으로 정리하고, 이를 AI와 함께 다듬어 나가는 과정이 선행되어야 한다.
실제 좋은 패턴은, 먼저 아이디어를 설명한 뒤 AI에게 "질문을 통해 요구사항을 캐내 달라"고 요청하는 방식이다. 그러면 AI가 빠진 조건, 모호한 부분을 묻고, 그 답변들을 모아 자연스럽게 사양 문서(spec)를 만들 수 있다.
이렇게 만들어진 spec에는 기능 목록뿐 아니라, 대략적인 아키텍처, 데이터 모델, 사용 라이브러리, 테스트 전략까지 포함되면 좋다. 일종의 "빠른 설계 회의"를 AI와 함께 하는 셈이다.
그다음 이 spec을 다시 AI에게 넘겨 "단계별 구현 계획"을 만들게 하면, 자연스럽게 작은 작업 단위로 나뉜 로드맵이 생긴다. 이 계획을 사람이 검토·수정·보완한 뒤에야 비로소 코드 생성 단계로 넘어간다.
느리게 느껴질 수 있지만, 이 10~20분의 설계·계획 단계가 이후 수 시간의 시행착오를 줄여 주는 "15분짜리 워터폴" 역할을 한다.
큰 일은 쪼개라: 작은 단위 작업 중심의 반복 개발
AI에게 "이 웹앱 전체 만들어줘"라고 시키면, 여러 사람이 제멋대로 짠 듯한 엉성한 결과가 나오기 쉽다. 구조도 뒤섞이고, 네이밍도 들쭉날쭉해진다.
반대로 "1단계: 이 함수만 구현", "2단계: 여기에 이 기능만 추가", "3단계: 이 버그만 수정"처럼 작은 티켓 단위로 나누면, AI는 훨씬 안정적으로 잘 작동한다.
좋은 흐름은 설계 단계에서 이미 작업을 "작은 티켓 리스트"로 만들어두고, 각 티켓을 순차적으로 AI에게 맡기는 것이다. 한 단계마다 코드를 생성하고, 테스트하고, 사람이 읽어보고 난 뒤 다음 단계로 넘어간다.
이 방식은 TDD(테스트 주도 개발)와도 잘 어울린다. "이 기능에 대한 테스트를 먼저 작성하게 한 뒤, 그 테스트를 통과하는 코드 작성"을 AI에게 부탁하면, 자연스럽게 작은 반복 루프 속에서 품질이 관리된다.
핵심은 "AI에게 커다란 점프를 시키지 말고, 작은 계단을 하나씩 오르게 하는 것"이다. 이게 프로젝트를 망가뜨리지 않고, 사람이 이해 가능한 상태로 유지하는 가장 안전한 방법이다.
컨텍스트가 성능이다: AI에게 필요한 정보를 최대한 먹여라
AI는 전지전능하지 않다. 현재 대화에서 주어진 정보와, 불완전한 사전 학습 지식을 조합해서 답할 뿐이다.
그래서 원하는 코드를 얻으려면, 지금 작업에 필요한 모든 관련 정보를 "먹여주는 것"이 중요하다. 수정해야 할 파일, 관련 모듈, 사용 중인 라이브러리, 프로젝트의 제약 사항, 피해야 할 접근법 등을 최대한 함께 제공해야 한다.
예를 들어 성능이 중요한 코드라면 "이런 단순 구현은 O(n²)라서 안 된다"거나 "이 API는 사용하면 안 된다" 같은 경고를 미리 적어 주는 것이 좋다. 신생 라이브러리를 쓴다면 README나 공식 문서를 통째로 붙여서 AI가 참고하도록 해야 한다.
대형 컨텍스트를 지원하는 모델과 도구(예: IDE 플러그인, 프로젝트 모드)를 활용하면, 리포지토리 전체 또는 중요한 파일 묶음을 한 번에 전달할 수 있다. 토큰은 비용이지만, 컨텍스트를 아끼려다 품질을 잃는 쪽이 더 비싸게 먹히는 경우가 많다.
또한 "이 부분은 이번 작업과 무관하다"처럼 범위를 명시적으로 좁혀 주면, AI가 쓸데없는 곳에 신경 쓰지 않고 집중 해야 할 코드에만 집중하도록 도울 수 있다.
모델도 도구다: 상황에 맞게 골라 쓰고, 필요하면 바꿔 타기
모든 LLM이 똑같이 잘 코딩하는 것은 아니다. 각 모델마다 강점과 약점, "성격"이 있다.
어떤 모델은 자연어 이해가 좋아서 복잡한 요구를 잘 파악하지만, 코드 디테일에서 자주 삐끗할 수 있다. 또 다른 모델은 코드 생성에 강하지만, 설명이나 설계 논의에는 약할 수 있다.
실전에서는 "하나가 막히면 다른 모델에게 같은 문제를 던져본다"는 단순한 전략이 꽤 효과적이다. 같은 프롬프트를 두 모델에 복사해 넣고 비교하면, 전혀 다른 해법이 나오기도 하고, 한쪽이 놓친 버그를 다른 쪽이 잡기도 한다.
가능하다면 최신 고급 모델(유료 포함)을 쓰는 편이 생산성 면에서 유리하다. 비싼 모델이라도, 사람 몇 시간의 삽질을 줄여준다면 투자 가치가 있다.
또한 "나랑 대화 궁합이 맞는 모델"을 고르는 것도 surprisingly 중요하다. 결국 하루 종일 페어 프로그래밍하는 동료처럼 쓰는 것이므로, 설명 스타일과 피드백 방식이 본인에게 잘 맞는 모델이 장기적으로 더 효율적이다.
개발 생애주기 전체에 AI를 녹여라
AI는 단지 "코드 몇 줄 대신 써주는 도구"가 아니라, 소프트웨어 개발 생애주기 전체에 끼어들 수 있다.
명세 작성, 설계, 구현, 리팩터링, 테스트 작성, 버그 재현, 로그 분석, 문서화, PR 설명까지 거의 모든 단계에서 활용할 수 있다. CLI 에이전트나 IDE 에이전트는 리포지토리를 읽고, 테스트를 실행하고, 수정안을 적용한 뒤 PR까지 열어주는 수준에 이르렀다.
다만 이런 에이전트를 완전 자율 모드로 풀어놓는 것은 아직 이르다. "대략 이렇게 해줘"만 던져놓고 잊어버리면, 돌아와 보았을 때 엉뚱한 설계와 중복 코드가 산처럼 쌓여 있을 수 있다.
현실적인 사용법은 "감독이 있는 AI 인턴"이다. 사람이 미리 계획과 to-do를 명확히 주고, 에이전트가 그 단계를 따라가도록 하고, 중간중간 결과를 확인하고 방향을 잡아주는 방식이다.
동시에 여러 에이전트를 병렬로 돌리는 실험도 있지만, 그만큼 관리 난도가 오른다. 대부분의 경우에는 한두 개의 메인 에이전트를 두고, 나머지는 코드 리뷰나 보조 분석용으로 쓰는 정도가 적절하다.
사람은 여전히 필수: 검증·테스트·리뷰 없이는 위험하다
AI는 자신감 있게 틀린다. 논리적 허점이 있어도 굉장히 그럴듯하게 포장해 내놓기 때문에, "겉모습만 보고 믿어버리기" 쉽다.
따라서 AI가 작성한 코드는 "유능한 주니어가 짰다고 가정하고 검토"해야 한다. 코드를 읽어보고, 테스트를 돌려보고, 실제 환경에서 확인해본 뒤에야 신뢰할 수 있다.
이때 자동화된 테스트는 핵심 안전망이다. AI에게 "테스트를 통과할 때까지 고쳐라"라고 반복시키면, 상당 부분을 스스로 수정한다. 반대로 테스트가 없으면, AI는 자신이 만든 사이드 이펙트를 전혀 모른 채 "완료"라고 말할 것이다.
또한 두 번째 AI를 "리뷰어"로 쓰는 것도 유용하다. 한 모델이 작성한 코드를 다른 모델에게 "버그나 개선점 찾아봐"라고 맡기는 방식이다. 서로 다른 오류 패턴을 가지기 때문에, 한쪽이 놓친 문제를 다른 쪽이 잡아내기도 한다.
최종적으로는 사람이 전체 구조와 흐름을 이해하고 있어야 한다. 이해하지 못하는 코드를 그대로 두면, 나중에 버그가 생겼을 때 아무도 손댈 수 없는 "검은 상자"가 되어버린다.
버전 관리가 세이프티 넷이다: 자주 커밋하고, 실험은 분리하라
AI는 짧은 시간에 많은 코드를 바꾸기 때문에, 한 번 잘못 꼬이면 되돌리기 힘든 상황이 된다. 이를 막는 가장 현실적인 방법이 "자주, 잘게 커밋하기"다.
작은 기능 하나를 구현하고 테스트까지 통과하면 바로 커밋한다. 다음 AI 수정이 망가지면 그 커밋으로 쉽게 되돌아갈 수 있다. 게임 세이브 포인트를 자주 남겨두는 것과 같다.
커밋 메시지는 나중에 자신과 AI 모두에게 "무슨 변화가 있었는지 요약해주는 로그" 역할을 한다. 필요하다면 최근 커밋 로그나 diff를 AI에게 보여주고, 그 상태를 기반으로 수정 지시를 할 수 있다. LLM은 diff를 읽고 변화 지점을 파악하는 데 매우 강하다.
또한 별도 브랜치나 worktree를 만들어, AI 실험을 격리하는 것도 중요하다. 새로운 기능이나 대규모 리팩터링을 시킬 때는, 메인 브랜치에서 분리된 공간을 만들어 그 안에서 마음껏 AI를 돌리고, 마음에 들지 않으면 통째로 버리는 식으로 관리하는 것이 안전하다.
"AI changes" 하나에 모든 것을 때려 넣은 거대한 커밋은 피해야 한다. 문제가 생겼을 때 원인을 좁히기도, 히스토리를 설명하기도 매우 어렵다.
AI에게 규칙을 가르쳐라: 스타일·금지사항·예시로 튜닝하기
AI의 기본 출력이 마음에 들지 않는다고 해서 그대로 받아들일 필요는 없다. 사람 신입에게 "우리 팀 코딩 규칙"을 알려주듯, AI에게도 프로젝트 룰을 가르칠 수 있다.
프로젝트 루트에 AI용 가이드 문서를 두는 방식이 대표적이다. 예를 들어 CLAUDE.md 나 GEMINI.md 파일에 "코딩 스타일, 네이밍 규칙, 사용하지 말아야 할 함수, 선호하는 패턴" 등을 정리해 두고, 세션 시작 시마다 이 문서를 함께 제공한다.
또는 IDE/에디터의 '커스텀 지시문'에 "4 spaces, ESLint 통과해야 함, React에서 화살표 함수 금지" 같은 규칙을 적어두면, 이후 완성 제안과 코드 생성이 그 기준에 맞춰지는 경우가 많다.
또 하나 강력한 방법은 "예시를 보여주고 똑같이 따라 하게 하기"다. 이미 프로젝트 안에 있는 좋은 함수 구현이나 컴포넌트를 보여주고 "이 패턴을 따라 새로운 기능을 만들어라"라고 하면, AI는 높은 확률로 비슷한 구조와 스타일을 재현한다.
마지막으로, "모르면 물어보고, 지어내지 말라"는 규칙을 명시적으로 적어주는 것도 중요하다. 예를 들어 프롬프트 앞에 "확신이 없으면 질문을 하라, 존재하지 않는 함수나 API를 상상해서 만들지 마라"라고 적어두면, 허구의 코드를 덜 생성하는 경향이 생긴다.
자동화와 품질 게이트가 AI를 더 똑똑하게 만든다
좋은 테스트와 CI/CD 파이프라인은 인간에게만 유용한 것이 아니라, AI에게도 일종의 "피드백 시스템" 역할을 한다.
AI가 코드를 생성하고, CI가 자동으로 테스트·빌드·린트 체크를 돌려 준 뒤, 그 결과(에러 로그, 실패한 테스트 이름)를 다시 AI에게 주면, AI는 그 정보를 바탕으로 수정안을 제시할 수 있다. "이 테스트가 이렇게 실패했으니, 이 부분 로직을 고쳐야겠구나"를 추론하는 것이다.
이 과정을 반복하면 "AI가 코드 → CI가 평가 → AI가 수정 → …"라는 루프가 만들어져, 사람은 방향성 확인과 중요한 판단에 집중할 수 있다. 마치 빠른 속도로 일하는 주니어와 자동화된 QA 팀이 붙어 있는 것과 비슷하다.
린터와 타입체커 역시 좋은 가이드다. 린트 에러 메시지를 통째로 AI에게 던져 "이 경고들을 모두 없애라"라고 하면, 대부분 자동으로 깨끗하게 정리해 준다. 스타일 가이드 강제에도 유용하다.
결국 "AI에게 맡길 만큼 자동화가 갖춰져 있는가"가 AI 활용 효과를 크게 좌우한다. 테스트·모니터링·코드 리뷰봇이 잘 깔린 프로젝트일수록 AI의 실수를 빨리 발견하고 되돌릴 수 있다.
AI는 실력을 증폭시킨다: 배우면서 쓰고, 쓰면서 배워라
AI는 초보를 "갑자기 시니어로 만들어 주는 마법 아이템"이 아니다. 오히려 기존 역량을 증폭하는 도구에 가깝다.
설계 능력, 복잡도 관리, 테스트 문화, 코드 리뷰 습관 등이 탄탄한 개발자는, AI를 통해 단순 반복 작업을 위임하고 더 높은 레벨의 문제에 집중할 수 있다. 반대로 이런 토대가 부족하면, AI가 만든 복잡한 코드를 제대로 이해하지 못한 채 얇은 자신감만 커질 수 있다.
하지만 제대로 활용하면, AI는 강력한 학습 도구가 된다. AI에게 "이 코드의 의도를 설명해 달라"거나 "이 라이브러리 선택지들의 장단점을 비교해 달라"고 요청하며, 실시간으로 지식을 흡수할 수 있다.
AI가 제시한 답안을 그대로 쓰기보다, "왜 이렇게 했는지"를 물어보고, 그 답변을 비판적으로 읽으며 스스로의 감각을 검증하는 습관을 들이면, 실전 감각이 오히려 더 빨리 성장한다.
또한 완전히 AI 없이 스스로 문제를 풀어보는 시간도 의도적으로 확보해야 한다. 그래야 "생각하는 근육"이 유지되고, AI가 틀렸을 때 이를 감지할 수 있는 기준점이 생긴다. 인간과 AI의 조합이 가장 강력하려면, 인간 쪽도 계속 성장하고 있어야 한다.
인사이트
AI 코딩 도구는 "코드를 대신 쳐주는 키보드 확장"이 아니라, "매우 빠르지만 경험이 부족한 동료 개발자"에 가깝게 보는 것이 현실적이다.
이 동료를 잘 활용하려면, 문제를 명확히 정의하고, 일을 잘게 나누고, 필요한 정보를 충분히 공유하고, 그 결과를 냉정하게 검증해야 한다. 사람 신입 개발자를 온보딩할 때 하는 거의 모든 일을 AI에게도 해야 한다고 생각하면 이해하기 쉽다.
실전에서 바로 적용할 수 있는 최소한의 실천 팁을 정리하면 다음과 같다.
프로젝트 시작 시, AI와 함께 짧은 시간 안에 spec과 단계별 계획을 먼저 만든다.
각 작업은 "하나의 기능, 하나의 버그" 수준으로 작게 쪼개고, 완료 때마다 테스트와 커밋까지 마무리한다.
AI에게 코드를 요청할 때는 관련 파일·Docs·제약사항을 최대한 함께 제공하고, 스타일과 룰을 별도 문서나 지시문으로 명시한다.
AI가 생성한 코드는 항상 테스트와 코드 리뷰를 거치고, 가능하면 다른 모델이나 도구를 리뷰어로 한 번 더 돌려본다.
버전 관리를 적극적으로 활용해 AI 실험을 브랜치·worktree로 분리하고, 커밋을 자주 남겨 언제든 되돌릴 수 있게 한다.
이렇게 "AI-보조형 엔지니어링" 태도를 유지하면, AI는 단순한 자동 완성기를 넘어, 개발자의 역량을 크게 확장해 주는 진짜 페어 프로그래머가 된다.
출처 및 참고 : AddyOsmani.com - My LLM coding workflow going into 2026
이 노트는 요약·비평·학습 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
