앱 MVP 문서 첨부: 파일 선택·폴더 권한·재접근을 나누는 5가지 기준
문서 첨부 기능을 MVP에 넣을 때 “파일을 고르면 업로드한다”는 한 문장으로 범위를 정하면 곧 문제가 생깁니다. 사용자가 한 개의 견적서만 붙이는 흐름과, 앱이 특정 폴더를 다시 읽는 흐름은 같은 권한이 아닙니다. 한 번 고른 파일을 다음 실행에서도 열 수 있는지, 파일이 이동·삭제됐을 때 무엇을 보여 줄지도 따로 정해야 합니다.
먼저 답하면, 문서 첨부 MVP는 이번 작업에 필요한 한 파일 선택을 기본으로 두고, 폴더 전체 접근이나 다음 실행 뒤 재접근은 실제 사용자 과업이 있을 때만 별도 기능으로 추가하는 편이 좋습니다. Android의 Storage Access Framework는 사용자가 시스템 선택기에서 고른 문서·폴더에 대해 URI 접근을 주는 구조입니다. 선택 범위와 접근 기간을 같은 것으로 취급하지 마세요.
사진 첨부와 문서 첨부의 판단은 다릅니다. 사진만 받는 흐름이라면 앱 MVP 사진 선택 기준처럼 전용 선택기를 우선 검토할 수 있습니다. 반면 PDF·한글 문서·스프레드시트처럼 여러 문서 형식을 받는 흐름은 파일 형식, 선택 범위, 업로드 완료 기준을 별도로 정해야 합니다. 파일을 외부에 내보내는 기능은 앱 MVP 파일 내보내기 기준에서 다룹니다.
1. 첫 버전은 ‘한 파일 선택’인지부터 정합니다
사용자가 신청서에 사업자등록증 한 장을 붙이거나, 상담 요청에 제안서 한 개를 올리는 장면이라면 앱이 필요한 것은 특정 문서 하나를 읽는 권한입니다. Android 문서는 ACTION_OPEN_DOCUMENT가 사용자가 특정 문서나 파일을 고르게 한다고 안내합니다. 앱이 지원하는 MIME 유형을 제한하면 선택 화면과 서버 검수 기준도 더 분명해집니다.
사용자 과업: 한 번에 하나의 증빙·계약서·제안서를 붙이는가?
수용 형식: PDF만 받을지, 문서·스프레드시트도 받을지 정했는가?
완료 신호: 파일명 표시가 아니라 업로드 성공·실패와 다음 행동을 보여 주는가?
취소 처리: 선택기를 닫거나 지원하지 않는 파일을 고르면 기존 입력을 보존하는가?
여러 개의 파일을 선택할 수 있다는 이유만으로 폴더 권한이 필요해지는 것은 아닙니다. 여러 파일 첨부가 제품의 핵심이라면 다중 선택의 상한, 각 파일의 업로드 상태, 재시도 단위를 먼저 정하고, 폴더 탐색은 다음 단계의 별도 결정으로 남기세요.
2. 폴더 접근은 ‘편의 기능’이 아니라 더 넓은 선택 범위입니다
ACTION_OPEN_DOCUMENT_TREE는 사용자가 선택한 디렉터리와 하위 디렉터리의 파일에 앱이 접근하게 합니다. Android 11 이상에서는 저장소 루트, Download, Android/data·Android/obb 같은 위치에 제한도 있습니다. 따라서 “최근 폴더를 기억하자”는 기획을 곧바로 폴더 선택으로 구현하면, 기기·저장소에 따라 동일한 경로를 고르지 못하는 예외가 생길 수 있습니다.
폴더 접근이 필요한 근거는 “사용자가 매주 같은 폴더의 여러 문서를 고른다”처럼 반복 과업으로 써야 합니다. 단순히 선택 단계를 줄이고 싶다는 이유라면 먼저 한 파일 선택의 최근 항목·재선택 안내로 문제를 풀 수 있는지 확인하세요.
폴더를 허용할 때 기록할 것
선택한 폴더의 용도, 앱이 실제로 읽을 파일 유형, 하위 폴더를 탐색하는지, 목록을 언제 갱신하는지, 사용자가 접근을 끊은 뒤의 안내를 한 기록에 남기세요. 문서 제공자마다 가능한 작업이 다를 수 있으므로, 삭제·수정 버튼은 제공자가 지원하는 플래그를 확인한 결과로만 보여 주는 편이 안전합니다.
폴더를 허용하지 않을 때의 대안
사용자에게 매번 시스템 선택기를 열어 주되, 현재 입력 항목과 필요한 파일 형식을 명확히 표시하세요. 이 방식은 기능 수가 적지만, 사용자가 무엇을 공유하는지 직접 통제한다는 장점이 있습니다. 어떤 방식이든 파일의 실제 서버 보관 정책과 기기 내 URI 접근을 하나의 ‘저장’ 상태로 합치지 않아야 합니다.
3. 재실행 뒤 재접근은 별도의 사용자 약속입니다
선택 직후의 URI 권한은 기기 재시작 뒤에도 자동으로 계속된다고 가정하면 안 됩니다. Android는 앱이 재시작 뒤에도 문서에 접근해야 할 때 persistable URI permission을 가져가는 방법을 안내하며, 문서가 이동되거나 삭제되면 그 권한을 가져도 다시 선택을 요청해야 할 수 있다고 설명합니다.
즉시 업로드형: 선택한 파일을 바로 전송하고, 전송 결과만 서비스 기록으로 남깁니다.
나중 처리형: 업로드 재개·미리보기·수정을 위해 재접근이 실제로 필요한지 결정합니다.
재선택형: URI 읽기에 실패하면 실패 이유를 숨기지 말고, 같은 입력 항목에서 다시 고를 수 있게 합니다.
서버 보관형: 업로드가 완료된 뒤 서버에 남는 문서와 기기에서 읽는 원본 URI의 책임을 구분합니다.
여기서 ‘첨부 완료’의 의미를 합의하세요. 사용자 화면에서 선택이 끝난 것, 앱이 바이트를 읽은 것, 서버가 검증·저장을 마친 것은 서로 다른 상태입니다. 네트워크 중단이나 앱 종료가 있는 MVP라면 각 상태에서 다시 시도할 수 있는지와 중복 업로드를 어떻게 막을지도 정해야 합니다.
4. 권한 오류를 ‘파일이 없다’로 뭉뚱그리지 않습니다
파일을 열지 못한 원인은 선택 취소, 형식 미지원, 제공자 오류, 파일 이동·삭제, 접근 권한 변화처럼 다를 수 있습니다. 사용자에게 내부 예외를 노출할 필요는 없지만, 다음 행동은 구분해서 보여 줘야 합니다. 예를 들어 선택 취소에는 “파일을 선택하지 않았습니다”, 재접근 실패에는 “파일을 다시 선택해 주세요”, 업로드 실패에는 “다시 시도”가 맞습니다.
원본 파일의 이름과 크기 같은 메타데이터도 제공자에 따라 비어 있거나 달라질 수 있습니다. 그러므로 화면에 표시한 파일명이 곧 서버에 전달된 파일의 확정 증거라고 단정하지 말고, 업로드 요청 ID·검증 결과·최종 저장 상태를 서비스 측에서 따로 확인하세요. 이 글은 특정 저장소·클라우드 제공자의 동작을 보장하지 않습니다.
5. 출시에 앞서 선택 범위와 실패 복귀를 같이 시험합니다
문서 첨부 QA는 PDF가 한 번 올라갔는지 확인하는 데서 끝나지 않습니다. 실제 지원 기기와 문서 제공자에서 사용자가 고른 범위, 재실행 뒤 접근, 실패 후 재선택, 서버 완료 표시가 이어지는지 확인해야 합니다.
한 파일 선택, 다중 선택, 폴더 선택을 필요한 흐름에만 연결했는가?
지원 MIME 유형과 용량·서버 검증 실패 안내가 실제 동작과 일치하는가?
파일 선택 취소, 파일 이동·삭제, 오프라인, 앱 재시작에서 다음 행동을 제공하는가?
지속 URI 접근이 필요한 흐름과 즉시 업로드 후 끝나는 흐름을 구분했는가?
업로드 완료·검증 실패·재시도 중인 상태를 같은 완료 문구로 표시하지 않는가?
문서 첨부 MVP의 핵심은 파일 선택기를 빨리 여는 것이 아니라, 사용자가 어떤 범위를 공유했고 앱이 언제까지 무엇을 다시 읽을 수 있는지를 제품 약속으로 명확히 하는 일입니다. 유인어스는 민간 사업 지원 서비스이며, 이 글은 특정 앱의 심사·보안 적합성·업로드 성공을 보장하지 않습니다. 실제 출시 전에는 서비스의 데이터 보관 정책, 지원 형식, 서버 검증, 사용자 안내를 함께 점검하세요.
자주 묻는 질문
문서 첨부 MVP는 저장소 권한부터 받아야 하나요?
항상 그렇지는 않습니다. Android의 Storage Access Framework는 사용자가 시스템 선택기에서 문서나 폴더를 직접 고르는 방식입니다. 먼저 앱이 필요한 것이 한 파일의 사용자 선택인지, 앱 전체의 저장소 접근인지 구분하세요.
한 번 고른 문서를 다음 실행에서도 열 수 있나요?
지속 URI 권한을 별도로 가져가는 설계가 필요할 수 있습니다. 다만 문서가 이동되거나 삭제되면 재선택을 요청해야 할 수 있으므로, 재접근 실패와 다시 고르는 흐름을 함께 설계하세요.
폴더 선택을 넣으면 Download 폴더도 항상 고를 수 있나요?
그렇지 않습니다. Android 11 이상에서 ACTION_OPEN_DOCUMENT_TREE에는 저장소 루트와 Download 등을 포함한 선택 제한이 있습니다. 실제 지원 OS와 선택기에서 시험한 뒤 사용자 안내를 정하세요.
파일명이 보이면 첨부가 완료된 것인가요?
아닙니다. 파일 선택, 앱의 읽기, 서버 업로드·검증 완료는 다른 상태입니다. 사용자에게는 현재 어느 단계에서 실패했는지와 재시도 방법을 구분해 보여 주는 편이 좋습니다.
확인한 공식 출처
Android Developers · Access documents and other files from shared storage — 2026-09-19 확인
Android Developers · Intent ACTION_OPEN_DOCUMENT — 2026-09-19 확인
Android Developers · Intent ACTION_OPEN_DOCUMENT_TREE — 2026-09-19 확인