Skip to content

Task-프로젝트 저장 위치 정책 및 가드 정비 #170

@SilverSupplier

Description

@SilverSupplier

Summary

프로젝트 생성/저장 시 사용자가 임의의 폴더(시스템 디렉터리, 드라이브 루트, 정션 등)를 그대로 지정할 수 있는 문제를 정비합니다. 기본 저장 위치를 제공하고 저장 시점의 폴더 안전성 검사를 추가하며, Qt 애플리케이션 메타데이터를 명시해 최근 목록 인덱스의 위치를 안정화합니다. 관련 정책은 docs에도 명문화합니다.

Parent Issue

#2

Area

Application

Target Sprint

Sprint 1

Scope

  • src/application/main.cpp에서 QCoreApplication::setOrganizationName / setApplicationName을 명시 설정해 QStandardPaths::AppDataLocation이 안정적인 경로를 가리키도록 합니다.
  • NewProjectWidget의 폴더 Browse 다이얼로그가 기본적으로 <Documents>/SafeCrowd Projects/ 아래에서 열리도록 하고, 프로젝트 이름이 입력된 상태에서는 해당 이름의 하위 폴더를 후보로 제안합니다.
  • ProjectPersistence::saveProject에 저장 전 폴더 안전성 검사를 추가합니다.
    • 드라이브/볼륨 루트 거부 (QDir::isRoot + QStorageInfo)
    • 심볼릭 링크 / Windows 정션 거부
    • 비어 있지 않으면서 SafeCrowd 프로젝트가 아닌 폴더 거부 (관리되는 파일 4종 외의 항목이 있을 때)
  • 삭제 흐름과 공유 가능한 안전성 헬퍼로 정리해 중복을 제거합니다.
  • docs/UI.md에 저장 위치 정책(기본 위치, 폴더 요구사항, 최근 목록 인덱스 경로)을 추가합니다.

Acceptance Criteria

  • 새 프로젝트 생성 화면의 Browse 버튼을 누르면 <Documents>/SafeCrowd Projects/ 위치가 시작점으로 표시됩니다(필요 시 자동 생성).
  • 프로젝트 이름이 입력된 상태에서 Browse 후 새 폴더로 진입하지 않으면, 저장 시 자동으로 프로젝트 이름의 하위 폴더가 사용되거나 사용자에게 안내됩니다.
  • 저장 시 다음 조건을 만족하지 않으면 명확한 메시지와 함께 거부됩니다.
    • 드라이브/볼륨 루트가 아니어야 함
    • 심볼릭 링크/정션이 아니어야 함
    • 비어 있거나 기존 SafeCrowd 관리 파일만 있는 폴더여야 함
  • 앱 실행 시 QStandardPaths::AppDataLocationSafeCrowd 조직/앱 이름을 따른 경로를 가리킵니다.
  • docs/UI.md에 저장 위치 정책 섹션이 존재합니다.

Architecture / Dependency Check

  • 변경 범위는 src/application/docs/에 한정합니다.
  • domain / engine에 의존성을 추가하지 않습니다.
  • include는 application/... 경로를 사용하며, Qt는 application 레이어 안에서만 사용합니다.

Verification Plan

  • cmake --preset windows-debug
  • cmake --build --preset build-debug
  • ctest --preset test-debug
  • 수동 검증:
    1. 첫 실행 후 새 프로젝트 → Browse 시작 위치가 <Documents>/SafeCrowd Projects/인지 확인
    2. 프로젝트 이름 입력 후 저장 → 의도한 하위 폴더에 저장되고 최근 목록에 표시되는지 확인
    3. 드라이브 루트/정션/비관리 파일 포함 폴더에 저장 시도 → 거부 메시지 확인
    4. %APPDATA%(Windows)에서 SafeCrowd/SafeCrowd/recent-projects.json이 생성되는지 확인

Dependencies / Blockers

Repository Checks

  • I checked for an existing related issue or epic before creating this task.
  • I will keep the issue title aligned with the repository naming convention.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions