모바일 출장 데이터 수집 앱 개발 과정3 (끝인 줄 알았지만... )

Lovable → cursor로 되지 않던 문제가 v0.dev에서 해결이 되다.

소개

모바일 출장 데이터 수집 앱 개발이 거의 마무리 단계에 접어들었을 때, 예상치 못한 심각한 문제들이 발생했습니다. 이 글은 그 문제들을 해결하기 위해 시도했던 여러 방법들과 최종적으로 v0.dev를 통해 해결한 경험을 공유합니다.

발생한 문제들

1. 데이터 휘발성 문제

  • 증상: 앱 종료 후 일정 시간이 지나면 사진 등의 데이터가 사라지는 현상

  • 추정 원인: 메모리 관리 또는 localStorage 처리 문제

2. 파일 저장 오류

  • 증상: 파일 용량이 조금만 커져도 DOCX 저장 후 파일 열었을 떄 오류나는 문제

  • 영향: 보고서 생성 기능의 핵심 기능 문제

시도했던 해결 방법들

1차 시도: 리버스 메타 프롬프팅

스터디원 jinmin님의 경험으로 알게 된 리버스 메타 프롬프팅 기법을 적용했습니다. 확실히 개선된 느낌을 받았습니다. 앞으로도 이런 프롬프팅 기법을 적용해볼 계획입니다.

2차 시도: ChatGPT o3와 Cursor의 협업

  1. ChatGPT o3에 문제점 분석 요청

  2. 받은 답변을 Cursor에 적용

  3. 반복적인 피드백 과정

그러나...

리버스 메타 프롬프트와 gpt와의 연계로 잘 되가는 듯 했으나 너무 다양한 방법을 하나에 적용해서일까요... 어느 시점부터 꼬이기 시작해서 되돌릴 수 없는 정도까지 오게 되었습니다.

대충 예시로 "백엔드 구축해줘." "뭐 해줘" "이것도 저것도 해줘" 등등 너무 다양하고 많은 것을 요구하다보니 어느 순간...!

기본적인 기능인 사진 업로드도 안 되고 오류 나고, 로딩 길어지는 기본적인 오류까지 발생

결국 마지막 수단...을 사용해야겠다. 어차피 망한 거... 라고 생각하고 나름 새로운 도전을 했습니다.

마지막 해결책: v0.dev

계기

카카오톡 커뮤니티에서 우연히 v0.dev의 프론트엔드/백엔드 스택?(무슨 말인지 모름)에 대한 글을 발견했습니다.

1. PRD(제품 요구사항 문서) 작성

기존에 작성한 PRD를 약간 수정하여 v0.dev에 입력했습니다. 주요 내용:

2. 디자인 요청

  • 연한 녹색과 연한 푸른색의 조합

  • 디자인의 완성도보다는 기능 구현에 집중, 사실 v0가 디자인은 좀 별로여서 디자인 부분은 반포기. 기능에 집

PRD를 v0에 입력

PRD 작성한 것을 내가 원하는 방향으로 약간 교정 후 v0 도구에 입력을 해보았습니다. 아래 내용을 그대로 v0.dev 프롬프트 화면에 넣었습니다.

1.1. 제품 개요
본 문서는 모바일 환경에서 출장 중 수집하는 위치 및 건물 정보를 효율적으로 관리하고, 이를 바탕으로 보고서를 생성할 수 있는 웹 애플리케이션(이하 '앱') 개발을 위한 제품 요구사항을 정의한다. 사용자는 현장에서 직접 데이터를 입력하고, 사진을 첨부하며, 저장된 데이터를 기반으로 DOCX 형식의 보고서를 받아볼 수 있다.
1.2. 목표
•	효율적인 데이터 수집: 모바일 기기를 활용하여 현장에서 신속하고 정확하게 위치 및 건물 정보를 입력하고 저장한다.
•	간편한 보고서 생성: 수집된 데이터를 바탕으로 표준화된 형식의 DOCX 보고서를 손쉽게 생성하고 내보낸다.
•	데이터 관리 용이성: 사용자가 입력한 데이터를 체계적으로 관리하고, 필요시 수정 및 삭제할 수 있는 기능을 제공한다.
•	사용자 편의성 증대: 직관적인 UI/UX를 제공하여 사용자가 별도의 교육 없이 앱의 모든 기능을 쉽게 사용할 수 있도록 한다.
1.3. 타겟 사용자
•	공무원 등
2. 제품 기능
2.1. 핵심 기능
•	데이터 입력: 위치 정보, 건물 정보, 층별 세부 정보, 사진 등을 모바일에서 직접 입력한다.
•	데이터 저장 및 관리: 입력된 데이터를 모바일 기기 내부 저장소(localStorage)에 안전하게 저장하고, 필요시 조회, 수정, 삭제한다.
•	보고서 생성 및 내보내기: 저장된 데이터를 기반으로 지정된 형식(DOCX)의 보고서를 생성하고, 다운로드하거나 이메일로 전송한다.
2.2. 세부 기능
2.2.1. 데이터 입력 폼
•	필수 입력 항목:
o	지번 주소 및 상호명 (텍스트)
o	장소 유형 (선택: 예시 - 종교시설, 영유아시설, 공영주차장, 유흥주점, 멸실, 신축, 가설건축물, 지역아동센터, 노인복지시설)
•	선택 입력 항목:
o	건물 층수 (선택: B3, B2, B1, 1층, 2층, 3층, 4층, 5층, 6층, 7층. 다중 선택 가능하도록 고려)
o	내부 정보 (텍스트 입력)
o	특이사항 및 메모 (텍스트 입력)
2.2.2. 사진 업로드 및 관리
•	층별로 최대 5장의 사진 업로드 지원
•	사진 업로드 시, 사용자는 다음 두 가지 옵션 중 선택 가능:
o	기기 내 사진첩에서 선택
o	카메라를 실행하여 직접 촬영
•	업로드된 사진 미리보기 기능 제공
•	개별 사진 삭제 기능 제공
2.2.3. 층별 정보 입력
•	하나의 장소에 대해 여러 층의 정보를 개별적으로 입력 가능
•	'추가' 버튼을 통해 다음 층의 정보 입력 인터페이스를 동적으로 생성
2.2.4. 데이터 저장
•	새로운 장소 정보 저장 기능
•	기존에 저장된 장소 정보 수정 기능
•	데이터 저장 시, 해당 시점의 timestamp 자동 기록
•	모든 데이터는 localStorage의 locationData 키에 JSON 문자열 형태로 저장 및 자동 동기화
2.2.5. 저장된 장소 보기
•	저장된 장소 목록을 요약 형태로 표시 (예: 주소, 장소 유형)
•	각 장소별 대표 사진(첫 번째 사진) 썸네일 표시
2.2.6. 데이터 수정 및 삭제
•	저장된 각 장소 항목별로 수정 및 삭제 버튼 제공
•	데이터 삭제 시, 사용자 실수를 방지하기 위한 확인 모달 팝업창 표시
•	데이터 수정 시에는 장소 목록 제일 상단에 제일 최근에 수정했던 데이터가 표시
2.2.7. 알림 시스템
•	사용자 액션(저장, 수정, 삭제, 내보내기 등)에 대한 피드백 제공
•	성공, 오류, 경고 메시지를 화면 상단 또는 하단에 0.3초간 표시 후 자동 사라짐
2.2.8. 보고서 내보내기 (DOCX)
•	저장된 장소 정보를 기반으로 DOCX 형식의 보고서 파일 생성
•	보고서 스타일:
o	제목: 14pt
o	본문(텍스트 입력 내용): 12pt
•	보고서 내용에는 입력된 모든 정보(주소, 장소 유형, 층별 정보, 메모, 사진 등) 포함
•	한글 데이터가 깨짐 없이 정상적으로 추출되어야 함
•	파일 다운로드 기능 (실제 파일 생성 및 다운로드)
2.2.9. 메일로 보고서 내보내기
•	생성된 DOCX 보고서 파일을 이메일 앱을 통해 전송할 수 있는 기능 (mailto 링크 또는 유사 기능 활용)
2.2.10. 내보내기 미리보기
•	보고서 내보내기 전, 선택된 데이터에 대한 요약 정보 제공
o	총 장소 수
o	각 장소의 유형, 주소, 사진 수 요약
3. 기술 요구사항
3.1. 플랫폼
•	모바일 웹 브라우저 환경에서 동작하는 웹 애플리케이션
•	반응형 웹 디자인을 통해 다양한 모바일 기기 화면 크기 지원
3.2. 데이터 저장
•	클라이언트 사이드 저장: localStorage 사용
o	키 이름: locationData
o	데이터 형식: locations 배열을 JSON 문자열로 직렬화하여 저장
•	앱 초기 로딩 시 localStorage에서 locationData를 로드하고 파싱하여 상태 복원
3.3. 데이터 구조
•	locations: 장소 객체들을 담는 배열
•	각 장소 객체(location)의 속성:
o	id: (String) 고유 식별자 (예: UUID 또는 timestamp 기반)
o	address: (Object) 주소 정보
	jibunAddress: (String) 지번 주소 및 상호명
o	locationType: (String) 장소 유형
o	floors: (Array) 층별 정보 객체의 배열
	각 floor 객체 속성:
	floorName: (String) 층 이름 (예: "B1", "1층")
	floorInfo: (String) 해당 층 체크 사항
	photos: (Array) 해당 층의 사진 URL 또는 Base64 데이터 배열 (최대 3개)
	photoData[]는 photos[]의 원본 데이터 또는 미리보기용 데이터일 수 있음. 명확화 필요. (본 PRD에서는 photos에 Base64 인코딩된 이미지 데이터 문자열을 저장하는 것으로 가정)
o	notes: (String) 특이사항 및 메모
o	timestamp: (Number) 데이터 저장/수정 시점의 타임스탬프
3.4. UI/UX
•	프레임워크/라이브러리: TailwindCSS를 사용한 반응형 레이아웃 및 스타일링
•	사용자 인터페이스: 직관적이고 사용하기 쉬운 인터페이스 제공
•	인터랙션: 부드러운 화면 전환 및 사용자 피드백
3.5. 아이콘
•	주요 기능 버튼에 아이콘 사용 (예: Lucide Icons 또는 유사 SVG 아이콘 라이브러리 활용)
o	저장: Save
o	사진 촬영/업로드: Camera
o	수정: Edit2
o	삭제: Trash2
o	다운로드/내보내기: Download
3.6. DOCX 생성 라이브러리
•	클라이언트 사이드에서 DOCX 파일을 생성할 수 있는 JavaScript 라이브러리 사용 (예: docx (npm 패키지), Pizzip + Docxtemplater)
•	한글 지원 및 이미지 삽입 기능 필수
4. 비기능적 요구사항
4.1. 사용성
•	앱은 별도의 사용자 매뉴얼 없이도 쉽게 사용할 수 있도록 직관적이어야 한다.
•	입력 필드는 명확하게 레이블링되어야 한다.
•	오류 발생 시 사용자에게 명확한 메시지를 전달해야 한다.
4.2. 성능
•	데이터 입력, 저장, 조회, 보고서 생성 등의 주요 기능은 모바일 환경에서 적절한 속도로 응답해야 한다.
•	사진 업로드 및 처리 시 과도한 지연이 발생하지 않도록 최적화한다. (예: 이미지 압축)
4.3. 호환성
•	최신 버전의 주요 모바일 브라우저(Chrome, Safari 등)에서 정상적으로 동작해야 한다.
4.4. 데이터 무결성
•	입력된 데이터는 손실 없이 정확하게 저장되어야 한다.
•	DOCX 보고서로 변환 시 데이터의 누락이나 왜곡이 없어야 한다.

디자인은 연한 녹색과 연한 푸른색의 조합으로 해달라고 했습니다.

결과물

녹색 배경이있는 웹 사이트의 스크린 샷
한국 앱의 스크린 샷

결과

놀랍게도 v0.dev를 통해 생성된 코드는 기존 문제들을 해결했습니다: 물론 극한까지 몰아붙인 경험은 없습니다.

  • 데이터 휘발성 문제 해결(현재까지)

  • DOCX 파일 저장 정상 작동(현재까지)

  • 이전에 비해 안정적인 앱 성능

배운 점

1. 문제 해결 접근법의 중요성

때로는 기존 도구에 매달리기보다 에라 모르겠다...(?) 새로운 도구를 시도하는 것이 효과적일 수도 있겠다.

2. 다른 분들의 경험

  • 스터디원 분들의 다양한 경험과 조언이 도움이 되었습니다. 이번에는 프롬프트 방법에 대한 경험을 크게 해봐서 좋았습니다.

    물론 상황이 달라서 모든 걸 집중해서 받아들이기는 어렵지만 이번엔 저희 스터디원 분들의 프롬프트 등 다양한 사례들, 경험들을 저의 상황과 수준에 맞춰서 시도해보려는 것들이 조금은 잘 작용이 된 듯합니다.

마치며

밤 늦게 시작해서 2시간밖에 못 잤지만, 문제를 해결하고 나니 그 피로감도 그래도 조금은 보람으로 느껴집니다.

'어차피 실제로 얼마 사용할 것도 아닌데 적당히 끝내야지' 한 게 이렇게 까지 오게 되었네요

그럼에도 이 경험이 나중에 또 다른 것들을 시도해볼 때 하나의 기반이 되는 좋은 경험이 되기를 희망합니다.

감사합니다.^^

4
6개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요