지난 장에서 개인 소개 웹페이지를 만들며 바이브 코딩의 기본 워크플로우를 경험했습니다. 이제는 사용자와 직접 상호작용하는 기능을 가진 애플리케이션 개발에 도전할 차례입니다. 간단한 타이머 앱을 만들며 실시간 상태 관리와 사용자 이벤트 처리를 AI 개발 파트너와 함께 구현하는 과정을 살펴봅니다.
간단한 타이머 앱, 왜 만들어야 할까?
지난 프로젝트에서 정적인 웹페이지를 만들며 AI 개발 파트너와의 협업에 익숙해지는 시간을 가졌습니다. 이번에는 좀 더 동적이고 상호작용적인 요소를 가진 애플리케이션 개발에 도전하여, 실제 사용자 경험을 개선하는 방향으로 AI의 활용 범위를 넓혀보고자 합니다. 간단한 타이머 앱은 실시간으로 시간을 추적하고, 사용자의 입력(시작, 정지, 초기화)에 즉각적으로 반응해야 하는 명확한 요구사항을 가지고 있어 바이브 코딩의 효율성을 입증하기에 적합한 프로젝트입니다.
이 프로젝트를 통해 우리는 다음과 같은 핵심 개발 역량을 강화할 수 있습니다. 첫째, 애플리케이션의 상태(예: 타이머가 실행 중인지, 정지 상태인지)를 관리하는 방법. 둘째, 사용자 인터페이스(UI) 이벤트를 처리하고 이에 따라 화면을 동적으로 업데이트하는 방법. 셋째, AI에게 특정 기능 구현을 요청하고, 그 결과물을 검토하며 개선하는 반복적인 워크플로우를 숙달하는 것입니다. 이러한 경험은 앞으로 더 복잡한 기능을 가진 애플리케이션을 개발하는 데 중요한 기반이 됩니다.
타이머 앱의 기능 요구사항 정의
모든 프로젝트의 시작은 명확한 요구사항 정의에서 비롯됩니다. 간단한 타이머 앱이라 할지라도 어떤 기능이 필요하며, 사용자는 어떻게 앱과 상호작용할 것인지 구체적으로 명시해야 AI 개발 파트너가 정확한 방향으로 코드를 생성할 수 있습니다. 우리는 다음과 같은 핵심 기능을 목표로 합니다.
1. 타이머 표시
- 초, 분, 시간을 명확하게 표시해야 합니다.
- 실시간으로 업데이트되어야 합니다.
2. 시작/정지 기능
- ‘시작’ 버튼을 누르면 타이머가 0부터 카운트업을 시작합니다.
- ‘정지’ 버튼을 누르면 타이머가 멈추고 현재 시간을 유지합니다.
- 정지 상태에서 ‘시작’ 버튼을 다시 누르면 멈춘 시점부터 다시 카운트업을 시작합니다.
3. 초기화 기능
- ‘초기화’ 버튼을 누르면 타이머가 0으로 돌아가고 정지 상태가 됩니다.
4. 사용자 인터페이스 (UI)
- 시간을 표시하는 영역이 명확해야 합니다.
- ‘시작’, ‘정지’, ‘초기화’ 버튼이 직관적으로 배치되어야 합니다.
이러한 요구사항을 바탕으로 AI 개발 파트너에게 초기 설계를 요청할 준비가 되었습니다. AI와의 대화는 구체적인 요구사항을 전달하는 것에서부터 시작됩니다. 필요한 기술 스택(HTML, CSS, JavaScript)과 함께 각 기능의 동작 방식을 상세히 설명해 주세요.
AI 개발 파트너와 함께하는 초기 설계 및 코드 생성
이제 정의된 요구사항을 바탕으로 AI 개발 파트너와 함께 앱의 뼈대를 만들어나갈 차례입니다. 이 과정은 AI를 활용한 초기 설계 및 코드 생성의 원칙을 따릅니다. 안티그라비티(Antigravity)와 같은 AI 개발 환경에서 새로운 프로젝트를 생성하고, AI에게 타이머 앱의 구체적인 구현을 요청합니다.
예를 들어, 다음과 같은 프롬프트로 시작할 수 있습니다.
"HTML, CSS, JavaScript를 사용하여 간단한 웹 기반 타이머 앱을 만들어줘. 앱은 시작, 정지, 초기화 버튼을 가지고 있고, 현재 시간을 분:초 형태로 표시해야 해. 시작 버튼을 누르면 타이머가 카운트업하고, 정지 버튼은 타이머를 멈추며, 초기화 버튼은 타이머를 0으로 리셋해야 해."
AI는 이 요청을 바탕으로 HTML 구조, CSS 스타일, 그리고 JavaScript 로직을 포함하는 초기 코드를 생성합니다. AI가 제시한 코드는 다음과 같은 형태일 것입니다.

핵심 JavaScript 로직 이해하기
타이머 앱의 핵심은 JavaScript를 통해 시간을 관리하고 UI를 업데이트하는 로직입니다. 특히, setInterval() 함수를 사용하여 일정 시간 간격으로 특정 코드를 반복 실행하는 것이 중요합니다.
let timerInterval;let totalSeconds = 0;let isRunning = false;const display = document.getElementById('display');const startBtn = document.getElementById('startBtn');const stopBtn = document.getElementById('stopBtn');const resetBtn = document.getElementById('resetBtn');function formatTime(seconds) { const minutes = Math.floor(seconds / 60); const remainingSeconds = seconds % 60; return `${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;}function startTimer() { if (!isRunning) { isRunning = true; timerInterval = setInterval(() => { totalSeconds++; display.textContent = formatTime(totalSeconds); }, 1000); // 1초마다 업데이트 }}function stopTimer() { isRunning = false; clearInterval(timerInterval);}function resetTimer() { stopTimer(); totalSeconds = 0; display.textContent = formatTime(totalSeconds);}startBtn.addEventListener('click', startTimer);stopBtn.addEventListener('click', stopTimer);resetBtn.addEventListener('click', resetTimer);
AI가 생성한 코드에서 setInterval의 사용법과 변수(totalSeconds, isRunning)를 통해 타이머의 상태를 관리하는 방식을 이해하는 것이 중요합니다. 이 코드는 타이머의 기본적인 동작을 구현하며, UI 요소를 JavaScript와 연결하는 이벤트 리스너를 포함합니다.
코드 검토, 수정 및 실행
AI가 생성한 초안 코드를 받았다면, 이제 코드 검토, 수정 및 실행 단계를 거쳐야 합니다. AI는 강력한 도구이지만, 생성된 코드가 항상 완벽하거나 우리의 모든 의도를 정확히 반영하지 못할 수 있습니다. 개발자의 검토와 수정은 필수적입니다.
1. 코드 검토
생성된 HTML, CSS, JavaScript 코드를 면밀히 검토합니다. 특히 다음과 같은 사항을 확인합니다.
- HTML 구조: 의미론적으로 올바른 태그가 사용되었는지, 접근성을 고려했는지.
- CSS 스타일: 디자인 요구사항에 맞게 깔끔하게 적용되었는지, 반응형 디자인이 필요한 경우 그 기반이 마련되었는지.
- JavaScript 로직: 타이머의 시작, 정지, 초기화 로직이 요구사항대로 정확하게 작동하는지, 예외 처리(예: 타이머가 이미 실행 중일 때 시작 버튼을 다시 누르는 경우)는 적절한지.
- 변수명 및 함수명: 가독성이 좋고 의미가 명확한 이름이 사용되었는지.
이 과정에서 부족하거나 개선할 부분이 있다면, AI에게 추가적인 피드백을 주어 코드를 수정하게 하거나, 직접 코드를 수정할 수 있습니다. 예를 들어, 타이머를 ‘시:분:초’ 형태로 표시하도록 요청하거나, 사용자에게 경고 메시지를 표시하는 기능을 추가하도록 요청할 수 있습니다.
2. 코드 수정 및 개선
예를 들어, AI가 분까지만 표시하는 타이머를 생성했다면, 초를 포함하도록 수정 요청을 할 수 있습니다. 혹은 버튼의 색상을 변경하거나, 타이머 숫자의 크기를 키우는 등 UI/UX 개선을 위한 CSS 수정을 요청할 수 있습니다.
/* CSS 코드 수정 예시 */#display { font-size: 4em; color: #333; margin-bottom: 20px;}button { padding: 10px 20px; font-size: 1.2em; margin: 5px; border: none; border-radius: 5px; cursor: pointer;}#startBtn { background-color: #4CAF50; color: white; }#stopBtn { background-color: #f44336; color: white; }#resetBtn { background-color: #008CBA; color: white; }
이러한 수정 작업은 AI와 대화하며 진행할 수도 있고, 개발자가 직접 원하는 방향으로 빠르게 적용할 수도 있습니다. 중요한 것은 AI의 결과물을 맹목적으로 수용하는 것이 아니라, 바이브 코딩 성공을 위한 마인드셋처럼 비판적으로 검토하고 개선하는 개발자의 역할입니다.
3. 실행 및 테스트
코드를 수정한 후에는 반드시 실행하여 정상적으로 작동하는지 확인해야 합니다. 안티그라비티(Antigravity)와 같은 AI 개발 환경에서는 통합된 브라우저나 테스트 환경을 제공하여 실시간으로 결과를 확인할 수 있습니다.

- ‘시작’ 버튼이 타이머를 올바르게 시작하고 시간을 업데이트하는지 확인합니다.
- ‘정지’ 버튼이 타이머를 정확히 멈추고 시간을 유지하는지 확인합니다.
- ‘초기화’ 버튼이 타이머를 0으로 리셋하고 정지 상태로 만드는지 확인합니다.
- 다양한 시나리오(예: 시작 -> 정지 -> 다시 시작, 정지 후 초기화)에서 예상대로 동작하는지 테스트합니다.
발생 가능한 문제 해결 및 디버깅
개발 과정에서는 예상치 못한 문제가 발생하기 마련입니다. 타이머 앱에서도 여러 문제가 발생할 수 있으며, 이럴 때 발생 가능한 문제 해결 및 디버깅 기술이 중요합니다. AI 개발 파트너는 디버깅 과정에서도 큰 도움을 줄 수 있습니다.
흔히 발생하는 문제와 해결책
- 타이머가 작동하지 않음: JavaScript 코드에 오류가 있거나, HTML 요소와 JavaScript가 올바르게 연결되지 않았을 수 있습니다. 브라우저 개발자 도구의 콘솔을 확인하여 오류 메시지를 찾고, AI에게 오류 메시지와 관련 코드를 제공하여 해결책을 요청합니다.
- 시간이 정확하게 업데이트되지 않음:
setInterval()의 지연 시간이 너무 길거나, UI 업데이트 로직에 문제가 있을 수 있습니다.console.log()를 사용하여totalSeconds변수의 변화를 추적하거나, AI에게 특정 로직의 문제점을 분석해달라고 요청합니다. - UI가 반응하지 않음: CSS 선택자 오류, JavaScript 이벤트 리스너 오류 등이 원인일 수 있습니다. HTML 요소의 ID나 클래스 이름이 JavaScript 코드와 일치하는지 확인하고, AI에게 해당 부분의 검토를 요청합니다.
AI 개발 파트너에게 문제 상황을 설명하고, 오류 메시지를 공유하며, 어떤 부분이 예상과 다르게 작동하는지 구체적으로 질문하면, AI는 가능한 원인을 분석하고 수정 코드를 제안하거나 디버깅 팁을 제공할 것입니다. 이 과정은 개발자가 스스로 문제를 해결하는 능력을 향상시키는 동시에, AI의 도움으로 시간을 절약할 수 있게 합니다.
결론: AI와 함께하는 동적 앱 개발의 첫걸음
간단한 타이머 앱 개발 프로젝트를 통해 우리는 AI 개발 파트너와 함께 동적인 웹 애플리케이션을 구현하는 실질적인 경험을 쌓았습니다. 요구사항 정의부터 초기 코드 생성, 검토 및 수정, 그리고 발생 가능한 문제 해결에 이르기까지 바이브 코딩의 전체 워크플로우를 실제 프로젝트에 적용해 보았습니다.
이 경험은 단순히 타이머 앱을 만드는 것을 넘어, 복잡한 로직과 사용자 인터랙션을 요구하는 미래의 프로젝트들을 AI와 함께 어떻게 효율적으로 개발할 수 있을지에 대한 통찰을 제공합니다. AI는 반복적이고 표준적인 코드 생성을 담당하며 개발자의 생산성을 극대화하고, 개발자는 AI가 생성한 코드를 비판적으로 검토하고 개선하며 더 높은 수준의 문제 해결과 창의적인 설계에 집중할 수 있게 됩니다. 바이브 코딩은 이러한 시너지를 통해 개발의 새로운 지평을 열어줄 것입니다.
참고 자료
- [1] Antigravity 공식 사이트 — https://antigravity.dev/
- [2] Python 공식 문서 — https://docs.python.org/ko/3/
