사람과 AI 사이의 지속적 대화를 통해 목표를 명세, 프로토타입, 코드, 개선으로 전환하는 앱 개발 방식을 탐구합니다.

소프트웨어 개발은 항상 서로 주고받는 과정이었다. 제품 책임자가 필요를 설명하고, 디자이너가 접근을 스케치하고, 엔지니어가 "만약 이렇게 하면?"을 묻고, 모두가 "완료"의 의미를 협상한다. 이를 대화라고 부르는 것은 유용하다. 왜냐하면 실제로 진전을 이끄는 것은 명시된 산출물(명세서, 다이어그램, 티켓) 하나가 아니라 공유된 이해이기 때문이다.
대부분의 프로젝트가 실패하는 이유는 코드를 못 써서가 아니다. 잘못된 것을 만들거나 잘 만든 것을 잘못된 가정 위에 얹었기 때문이다. 대화는 의도가 명확해지는 방식이다.
좋은 대화는 이런 요소들을 초기에 명백히 하고 현실이 변할 때마다 다시 들여다본다.
AI는 초안을 만들고, 요약하고, 옵션을 제안하고, 빠르게 코드를 생성할 수 있는 새로운 참여자를 추가한다. 이는 작업의 템포를 바꾼다. 질문에 대한 응답이 빨라지고 프로토타입이 더 빨리 나타난다.
변하지 않는 것은 책임이다. 무엇을 만들지, 어떤 위험을 받아들일지, 사용자에게 어떤 품질이 필요한지는 여전히 인간이 결정한다. AI는 제안할 수는 있어도 결과에 대한 책임을 질 수는 없다.
이 글은 문제 정의에서 시작해 요구사항을 예제로 바꾸고, 디자인을 반복하고, 아키텍처 결정을 내리며, 코드 공동 작성과 리뷰, 공유된 "작동" 정의로 테스트하고, 문서를 최신 상태로 유지하고, 출시 후 실제 피드백에서 배우는 과정까지 대화 전 과정을 따라간다. 신뢰, 안전, 품질을 위한 실용적 가드레일도 함께 제시한다.
애플리케이션 개발은 더 이상 단순히 '비즈니스'에서 '엔지니어링'으로 건네주는 과정이 아니다. 팀에는 이제 AI라는 추가 참여자가 들어온다. 이는 작업 속도를 바꾸지만 역할의 명확성은 더 중요해진다.
건강한 딜리버리 팀은 여전히 익숙한 모습이다: 제품, 디자인, 엔지니어링, 지원, 고객. 다른 점은 AI가 피드백을 빠르게 요약하고 대안을 초안하며 기술과 비기술 간의 번역을 도와주므로 이들이 '같은 방에 있는' 빈도가 훨씬 늘어난다는 것이다.
고객은 실제 생활 기반의 정보를 제공한다: 무엇이 고통스러운지, 무엇이 혼란스러운지, 그들이 실제로 비용을 지불할 것인지. 지원팀은 반복되는 문제와 엣지 케이스의 현실을 가져온다. 제품은 목표와 제약을 규정하고, 디자인은 의도를 사용 가능한 흐름으로 바꾼다. 엔지니어링은 실현 가능성, 성능, 유지보수를 보장한다. AI는 이런 대화를 지원할 수 있지만 소유하지는 않는다.
사람은 맥락, 판단, 그리고 책임을 제공한다. 그들은 절충, 윤리, 고객 관계, 조직의 복잡한 세부사항을 이해한다.
AI는 속도와 패턴 회상을 제공한다. AI는 사용자 스토리 초안, UI 변형 제안, 구현 접근법 제시, 일반적인 실패 모드 표면화, 테스트 아이디어 생성을 몇 분 안에 할 수 있다. 특히 팀이 옵션을 필요로 할 때 유용하다 — 결정을 대신하는 것이 아니다.
AI에 다음과 같은 '모자'를 의도적으로 할당할 수 있다:
AI가 '사장'처럼 작동하지 않도록 하려면 결정 권한을 명확히 하라: 인간이 요구사항을 승인하고, 디자인을 승인하며, 코드를 머지하고, 릴리스를 서명한다. AI 출력은 신뢰를 얻기 위해 리뷰, 테스트, 명확한 근거를 통해 검증되어야지 단지 말투의 자신감만으로 믿어서는 안 된다.
실무에서는 'vibe-coding' 플랫폼 같은 도구가 도움이 될 수 있다. 구조화된 채팅 워크플로는 의도, 제약, 초안, 수정 사항을 한곳에 모으면서도 적절한 관문에서 인간 승인을 강제하기 쉽다.
많은 프로젝트는 기능 목록으로 시작한다: 대시보드, 알림, 결제가 필요하다고. 하지만 기능은 추측이다. 특히 AI가 참여할 때 더 좋은 시작점은 누가 고생하고 있는지, 현재 상황이 어떤지, 왜 중요한지를 설명하는 명확한 문제 진술이다.
AI 도구에 '할 일 앱을 만들어줘'라고 묻기보다는 '우리 지원팀은 고객 요청이 다섯 군데에서 들어와 전부 추적되지 않아 시간을 잃는다'처럼 말하라. 그 한 문장은 방향과 한계를 제공한다. 사람과 AI가 상황에 맞는 해결책을 제안하기 쉬워진다.
AI는 실제 경계를 무시한 옵션을 즐겁게 생성할 것이다. 이미 알고 있는 제약을 적어라:
이 제약들은 '부정적'이 아니다. 재작업을 막는 설계 입력이다.
'효율성 향상'은 구축하기 어렵다. 이를 측정 가능한 성공 지표로 전환하라:
결과가 테스트 가능하면 AI는 수용 기준과 엣지 케이스를 생성하는 데 도움이 된다.
해결책을 묻기 전에 한 페이지 브리프를 작성하라: 문제 진술, 사용자, 현재 워크플로, 제약, 성공 지표. 그런 다음 AI에게 가정을 도전하고 대안을 제안하게 하고, 위험 목록을 만들게 하라. 이 순서는 대화를 현실에 붙들어두고 '잘못된 올바른 것'을 만드는 데 소요되는 수일을 줄여준다.
요구사항은 대화처럼 읽힐 때 가장 좋다: 명확한 의도, '완료'의 공유된 이해, 몇 가지 구체적인 예시. AI는 이를 가속화할 수 있다 — 단, 오라클이 아니라 초안 파트너로 취급할 때만.
'기능 X의 요구사항을 작성해줘' 대신 AI에 역할, 제약, 대상 독자를 주라. 예:
그런 다음 반환된 내용을 검토하고 과감히 편집하라. 스토리는 며칠 내에 만들 수 있게 작게 유지하라. 하나의 스토리에 여러 목표가 들어가면 분리하라.
예시 없는 사용자 스토리는 흔히 예의 바른 추측이다. 실제 시나리오를 추가하라:
AI에게 예시 표를 생성하게 하고 팀과 검증하게 할 수 있다: '예시 10개, 엣지 케이스 3개, 실패 상태 2개 포함. 가정한 부분을 표시해줘.'
'얇지만 테스트 가능한' 것을 목표로 하라. 한 페이지의 명확한 규칙이 열 페이지의 모호한 문장보다 낫다. 청구, 개인 정보, 사용자 신뢰에 영향을 주는 사항은 명시적으로 적어라.
오해는 종종 코드가 아니라 단어에서 온다. 요구사항과 같은 장소에 소규모 용어집을 유지하라:
그 용어집을 AI 프롬프트에 반영하면 초안이 일관되고 팀의 정렬이 유지된다.
좋은 디자인은 드물게 완성된 형태로 오지 않는다. 스케치, 테스트, 조정, 반복의 루프를 통해 날카로워진다. AI는 이 루프를 빠르게 만들 수 있지만 목표는 속도 자체가 아니다. 목표는 생각을 건너뛰지 않고 빠르게 배우는 것이다.
스크린이 아니라 흐름에서 시작하라. 사용자의 목표와 제약을 설명한 다음(예: 모바일의 초보 사용자, 한 손 사용, 낮은 집중도) AI에게 몇 가지 흐름 옵션을 제안하게 하라. 이후 AI로 와이어프레임 수준의 레이아웃 초안과 브랜드 톤에 맞는 마이크로카피(버튼 레이블, 오류 메시지, 도움말 문구) 변형을 만들게 하라.
유용한 리듬은 이렇다: 사람이 의도와 톤을 정의하고, AI가 옵션을 생성하고, 사람이 선택하고 편집하고, AI가 화면 간의 일관성을 다듬는다.
'세 가지 접근'을 요청할 때 단순 변형이 아니라 절충을 요구하라. 예: '옵션 A는 단계 수를 최소화, 옵션 B는 사용자 불안을 줄임, 옵션 C는 민감한 데이터 수집을 피함'처럼. 초기에 절충을 비교하면 팀이 잘못된 문제를 다듬느라 디자인을 공들여 만드는 것을 막을 수 있다.
어떤 것이 '최종' 같아지기 전에 빠른 점검을 하라: 색 대비 가정, 키보드 내비게이션 기대치, 읽기 쉬운 오류 상태, 포용적 언어, 스크린리더 같은 엣지 케이스. AI는 가능한 문제를 지적하고 수정안을 제안할 수 있지만 인간이 무엇이 허용 가능한지 결정해야 한다.
피드백은 흔히 지저분하다: '이건 혼란스러워' 같은 식. 근본 이유를 평이한 언어로 캡처한 뒤 구체적 수정으로 바꿔라('이 단계를 이름 변경', '미리보기 추가', '선택지 축소'). AI에게 피드백을 원래 목표에 연결된 짧은 변경 목록으로 요약하게 하면 반복이 표류하지 않고 정렬을 유지한다.
아키텍처는 한때 일회성 청사진처럼 여겨졌다: 패턴을 고르고 다이어그램을 그리고 강제하는 식. AI가 참여하는 환경에서는 아키텍처가 제품 요구, 배포 속도, 장기 유지보수, 팀 역량 사이의 협상으로 더 잘 작동한다.
실용적 접근은 인간의 아키텍처 결정과 AI가 제안하는 대안을 짝지어 사용하는 것이다. 문맥(제약, 팀 기술 수준, 예상 트래픽, 규정 필요)을 설정하고 AI에게 2~3개의 실현 가능한 설계를 제안하게 하고 절충을 제시하게 하라.
그 다음 인간이 비즈니스와 팀에 맞는 것을 선택한다. 어떤 옵션이 '멋지다' 해도 운영 복잡도를 높이면 넘기고 다음으로 가라.
대부분의 아키텍처 문제는 경계 문제다. 다음을 정의하라:
AI는 '사용자가 삭제되면 어떻게 되는가?' 같은 간극을 지적하는 데 도움을 줄 수 있지만 경계 결정은 명시적이고 테스트 가능하게 유지되어야 한다.
무엇을 선택했는지, 왜 선택했는지, 언제 재검토할지 기록하는 가벼운 결정 로그를 유지하라. 코드베이스 근처에 짧은 노트 형태로 저장하면 좋다(e.g., /docs/decisions).
이것은 아키텍처가 전설이 되는 것을 막고, AI 지원을 더 안전하게 만든다. 시스템이 참조할 수 있는 작성된 의도가 있기 때문이다.
논쟁이 격해지면 이렇게 물어라: 오늘 요구를 충족하고 내일을 막지 않는 가장 단순한 버전은 무엇인가. AI에게 최소 실행 가능 아키텍처와 스케일 준비 업그레이드 경로를 제안하게 하라. 지금 출시하고 증거에 따라 진화할 수 있게 한다.
AI를 빠른 주니어 동료처럼 다뤄라: 초안 작성은 잘하지만 최종 형태에 책임을 지지 않는다. 인간은 여전히 아키텍처, 명명, 결정의 '왜'를 이끌고, AI는 '어떻게'를 가속화한다. 목표는 사고를 외주화하는 것이 아니라 의도와 깔끔하고 리뷰 가능한 구현 사이의 거리를 줄이는 것이다.
작고 테스트 가능한 조각(함수 하나, 엔드포인트 하나, 컴포넌트 하나)을 요청하는 것으로 시작하라. 그런 다음 즉시 모드를 전환해 초안을 명확성, 일관성, 기존 규약과의 적합성 측면에서 검토하라.
유용한 프롬프트 패턴:
Generate a POST /invoices handler using our existing validation helper and repository pattern.Refactor this to remove duplication and keep side effects at the edges.Explain the control flow and where errors are handled. What assumptions are being made?Add unit tests for success + validation failure + repository error, matching our test style.(위의 인라인 코드와 명령어는 실제 프롬프트 예시로 그대로 유지해도 된다.)
AI가 올바른 코드를 만들 수는 있지만 여전히 어색하게 느껴질 수 있다. 인간은 다음 사항을 책임져야 한다:
data/item 같은 이름 사용 지양)선호 패턴의 간단한 스냅샷(예시 몇 개)을 유지하고 프롬프트에 포함해 결과를 고정하면 도움이 된다.
AI를 옵션 탐색과 지루한 문제를 빠르게 고치는 데 사용하되 기존 리뷰 관문을 건너뛰게 하지 마라. 풀리퀘스트는 작게 유지하고 동일한 검사(테스트, 린트)를 실행하며 인간이 요구사항에 맞는 동작을 확인하도록 요구하라. 특히 엣지 케이스와 보안 민감 코드에 대해서는 더욱 그렇다.
이러한 공동 저작 루프를 자연스럽게 만들려면 Koder.ai 같은 도구는 대화 자체를 작업 공간으로 만들어 계획, 스캐폴딩, 반복을 가능하게 하면서 소스 컨트롤 규율(검토 가능한 diff, 테스트, 인간 승인)을 유지한다. 빠른 프로토타입을 배포 가능한 코드로 발전시키고자 할 때 특히 효과적이다 — 웹은 React, 백엔드는 Go + PostgreSQL, 모바일은 Flutter 같은 스택을 예로 들 수 있다 — 단, 프로세스가 연결되지 않은 프롬프트 더미로 전락하지 않게 주의하라.
테스트는 대화가 구체화되는 지점이다. 의도와 디자인을 몇 날 동안 논쟁할 수 있지만, 좋은 테스트 스위트는 더 단순한 질문에 답한다: 출시하면 약속한 대로 동작할까. AI가 코드를 도왔을 때 테스트는 더 중요해진다. 왜냐하면 테스트가 관찰 가능한 결과로 결정을 고정하기 때문이다.
이미 사용자 스토리와 수용 기준이 있다면 AI에게 바로 거기서 테스트 케이스를 제안하라고 하라. 유용한 부분은 양이 아니라 커버리지다: 엣지 케이스, 경계값, 사용자가 예상치 못한 행동을 했을 때의 시나리오.
실용적인 프롬프트 예: 수용 기준을 주고 입력, 예상 출력, 실패 모드가 포함된 테스트 케이스 목록을 작성하게 하라. 이는 타이밍, 권한, 오류 메시지와 같은 누락된 세부사항을 값싸게 드러낸다.
AI는 단위 테스트 초안, 현실적인 샘플 데이터, 부정 테스트(잘못된 포맷, 범위 밖 값, 중복 제출, 부분 실패)를 빠르게 만들 수 있다. 이를 1차 초안으로 취급하라.
AI가 특히 잘하는 것들:
테스트가 실제로 요구사항을 검증하는가, 단지 구현을 재진술하는가를 인간이 검토해야 한다. 개인 정보/보안 시나리오가 빠져 있는가? 위험 수준에 맞는 적절한 수준(단위 vs 통합)에서 점검하고 있는가?
강력한 완료 정의에는 단순히 '테스트 존재' 이상이 포함된다: 테스트 통과, 수용 기준에 대한 의미있는 커버리지, 업데이트된 문서(간단한 /docs 노트나 변경 로그 항목도 포함). 이렇게 하면 배포가 도약이 아니라 증명된 주장이다.
대부분 팀은 문서를 싫어하는 것이 아니라 두 번 쓰거나 써놓고 오래되도록 내버려두는 것을 싫어한다. AI가 개입하면 문서는 사후 작업이 아니라 의미 있는 변경의 부산물이 될 수 있다.
기능이 병합되면 AI가 변경 내용을 사람 친화적인 언어로 바꾸는 데 도움을 줄 수 있다: 변경 로그, 릴리스 노트, 짧은 사용자 가이드. 핵심은 올바른 입력을 주는 것이다 — 커밋 요약, 풀리퀘스트 설명, 변경 이유의 짧은 메모를 제공하고 결과를 코드 리뷰하듯 검토하라.
'성능 향상' 같은 모호한 업데이트 대신 구체적 진술을 목표로 하라: '날짜로 필터링할 때 검색 결과가 더 빨라짐'과 같은 영향과 '조치 필요 없음' 또는 '계정 재연결 필요' 같은 명확한 영향 표시.
내부 문서는 2시의 사고 대응 질문에 답하는 방식으로 가장 유용하다:
AI는 기존 자료(지원 스레드, 사고 노트, 설정 파일)에서 초안을 잘 만들지만 인간은 새로운 환경에서 단계들을 검증해야 한다.
가장 단순한 규칙: 모든 제품 변경은 문서 변경과 함께 배포된다. 풀리퀘스트에 '문서 업데이트됨?' 체크리스트 항목을 추가하고 AI에게 이전과 새로운 동작을 비교해 편집을 제안하게 하라.
필요하다면 독자를 지원 페이지로 연결하라(예: /blog 깊은 설명, /pricing 요금 관련 페이지). 문서는 살아있는 지도처럼 작동해야 한다.
출시는 대화의 끝이 아니다 — 오히려 대화가 더 솔직해지는 시점이다. 실제 사용자가 제품을 다루면 제품이 어떻게 작동하는지 추측하는 것을 멈추고 실제로 어떻게 맞아떨어지는지 배우기 시작한다.
프로덕션을 발견 인터뷰나 내부 리뷰와 함께 또 다른 입력 스트림으로 취급하라. 릴리스 노트, 변경 로그, 알려진 문제 리스트는 경청하고 있다는 신호이고 사용자 피드백을 고정할 수 있는 기준을 제공한다.
유용한 피드백은 한 통에 깔끔하게 오지 않는다. 보통 몇 가지 출처에서 끌어온다:
목표는 이 신호들을 하나의 이야기로 연결하는 것이다: 어떤 문제가 가장 빈번한가, 어떤 것이 가장 비용이 큰가, 어떤 것이 가장 고칠 수 있는가.
AI는 주간 지원 테마를 요약하고 유사한 불만을 군집화하며 우선순위화된 수리 목록을 초안할 수 있다. 또한 다음 단계(예: 바��ㄴ증 추가, 온보딩 카피 개선, 이벤트 계측)를 제안하고 패치용 짧은 명세를 생성할 수 있다.
그러나 우선순위는 여전히 제품 결정이다: 영향, 위험, 일정이 중요하다. AI는 읽기와 분류를 줄이는 데 사용하라. 판단을 외주화하지 말라.
변경을 통제할 수 있게 배포하라. 피처 플래그, 단계적 롤아웃, 빠른 롤백은 릴리스를 베팅이 아닌 실험으로 바꾼다. 실용적 기준을 원하면 각 변경과 함께 되돌리기 계획을 정의하라. 문제가 발생한 뒤에 정의하지 말라.
플랫폼 기능은 위험을 실질적으로 줄여줄 수 있다: 스냅샷과 롤백, 감사 가능한 변경 이력, 원클릭 배포는 '항상 되돌릴 수 있다'는 희망을 운영 관행으로 바꾼다.
AI와 일하면 개발 속도가 빨라지지만 새로운 실패 모드도 도입된다. 목표는 모델을 무조건 신뢰하거나 무조건 불신하는 것이 아니라 신뢰가 분위기가 아니라 점검을 통해 얻어지도록 워크플로를 만드는 것이다.
AI는 API, 라이브러리, 코드베이스에 대한 '사실'을 꾸며낼 수 있다. 또한 '사용자가 항상 온라인이다', '날짜는 UTC다', '영어 전용 UI' 같은 숨겨진 가정을 밀어넣을 수 있다. 또 행복 경로 데모는 통과하지만 부하, 이상 입력, 실제 데이터에서 실패하는 취약한 코드를 생성할 수 있다.
간단한 습관이 도움이 된다: AI가 해결책을 제안하면 가정, 엣지 케이스, 실패 모드를 목록으로 만들게 한 뒤 어떤 것들을 명시적 요구사항이나 테스트로 만들지 결정하라.
프롬프트를 공유 작업공간처럼 취급하라: 비밀번호, API 키, 고객의 민감한 데이터, 액세스 토큰, 내부 사고 보고서, 미공개 재무자료, 독점 소스 코드는 조직에서 승인한 도구와 정책이 없는 한 붙여넣지 마라.
대신 마스킹과 요약을 사용하라: 실제 값을 플레이스홀더로 바꾸고, 테이블을 덤프하기보다 스키마를 설명하며, 문제를 재현하는 최소한의 스니펫만 공유하라.
조직에 데이터 레지던시 제약이 있으면 도구가 준수할 수 있는지 확인하라. 일부 플랫폼(예: Koder.ai)은 글로벌 인프라에서 실행하고 서로 다른 리전에 앱을 배포할 수 있어 데이터 프라이버시와 국경 간 전송 요구를 돕지만 정책이 우선이다.
사용자 대상 기능은 추천, 가격 책정, 자격, 중재, 심지어 폼 검증에서 불공정한 기본값을 담을 수 있다. 가볍게 점검하라: 다양한 이름과 로케일로 테스트, 누가 피해를 볼 수 있는지 검토, 결정이 사람에게 영향을 줄 때 설명과 이의 제기 경로를 마련하라.
AI 출력이 검토 가능하도록 만들라: 인간 코드 리뷰 요구, 위험한 변경에 대한 승인, 프롬프트와 diff, 결정의 감사 추적을 유지하라. 이를 자동화 테스트와 린팅과 결합하면 품질은 협상 대상이 아니다 — 단지 가장 빠른 경로만 달라질 뿐이다.
AI는 '개발자를 대체'하기보다는 주목을 재분배할 것이다. 가장 큰 변화는 하루의 더 많은 시간이 의도 명확화와 결과 검증에 쓰이고, 단조로운 번역 작업(명백한 결정을 보일러플레이트로 바꾸는 일)에 쓰는 시간이 줄어드는 것이다.
제품과 엔지니어링 역할은 더 명확한 문제 진술과 더 빈틈없는 피드백 루프를 중심으로 수렴할 것이다. 개발자는 더 많은 시간을 다음에 쓸 것이다:
한편 AI는 초안 작성, 스캐폴딩 화면, 엔드포인트 연결, 마이그레이션 생성, 리팩터 제안 같은 1차 작업을 더 많이 처리한 뒤 인간에게 되돌려줄 것이다.
AI에서 가치를 얻는 팀은 단순한 도구보다 커뮤니케이션 근육을 기른다. 유용한 기술들은 다음과 같다:
이것들은 단순한 기교적 프롬프트가 아니라 명확해지는 습관에 관한 것이다.
고성능 팀은 시스템과 대화하는 방식을 표준화할 것이다. 가벼운 프로토콜 예시는:
/docs의 짧은 노트로 다음 반복이 정보에 기반하도록)지금 AI는 초안 가속화, diff 요약, 테스트 케이스 생성, 리뷰 중 대안 제시에 가장 강하다. 향후 몇 년은 프로젝트 내부에서 더 긴 맥락 기억, 더 신뢰할 수 있는 도구 사용(테스트 실행, 로그 읽기), 코드·문서·티켓 전반의 일관성 향상이 기대된다.
제한 요소는 여전히 명확성이다. 의도를 정확히 묘사할 수 있는 팀이 먼저 혜택을 얻을 것이다. 이기는 팀은 단순히 AI 도구를 갖춘 팀이 아니라 의도를 소프트웨어로 바꾸는 반복 가능한 대화를 만들고, 속도를 안전하게 만드는 가드레일을 갖춘 팀일 것이다.
탐색을 시작하려면 대화, 기획, 구현이 함께 존재하는 워크플로를 시도해보라. 예를 들어 Koder.ai는 채팅 기반 빌드를 지원하며 계획 모드, 소스 내보내기, 배포/호스팅, 커스텀 도메인, 스냅샷/롤백을 제공한다 — 빠른 반복을 원하면서도 통제를 포기하고 싶지 않을 때 유용하다. (여정 중에 배운 내용을 공개하면 Koder.ai의 크레딧 적립 및 추천 옵션 같은 프로그램이 비용을 상쇄해줄 수 있다.)