AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

파일 시스템 탐색과 WalkDir: 재귀적 트리 탐색 4/9

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

Go 언어로 파일 시스템 작업을 수행하는 개발자, 특히 대규모/성능 중심 애플리케이션 개발자

난이도: 중급~고급 (파일 시스템 탐색과 Go 표준 라이브러리 이해 필요)

핵심 요약

  • filepath.WalkDirfilepath.Walk 대체로 성능 향상정리된 인터페이스 제공
  • DirEntry 사용으로 메모리 효율성 확보 (필요 시 Info() 호출로 메타데이터 얻음)
  • SkipDir/SkipAll 반환 값을 통해 탐색 제어 가능 (예: .git 폴더 무시, 특정 파일 찾기 종료)

섹션별 세부 요약

1. 함수 시그니처 및 기본 동작

  • WalkDir(root string, fn WalkDirFunc) error
  • root는 파일/디렉터리 경로 가능 (파일일 경우 단일 처리, 디렉터리일 경우 재귀 탐색)
  • WalkDirFunc 콜백은 path, DirEntry, error 매개변수 전달

2. 사전 정렬 및 예측 가능한 탐색

  • 디렉터리 내부는 이름 기반 사전 순으로 처리 (테스트/디버깅에 유리)
  • 부모 디렉터리 → 자식 디렉터리 순, 형제 디렉터리는 알파벳 순 처리

3. 메모리 효율성 최적화

  • DirEntry 사용으로 FileInfo의 비싼 stat 시스템 콜 호출 회피
  • 디렉터리 엔트리 점진적 읽기로 메모리 부하 감소 (대규모 계층 구조 지원)

4. 콜백 내 성능 고려사항

  • 불필요한 문자열/슬라이스 할당 피하기 (수천 개 파일 처리 시 영향 큼)
  • Info() 호출은 필요 시만 수행 (예: .log 파일 크기 검사)

5. 오류 처리 및 탐색 제어

  • error 매개변수로 접근 오류 처리 (콜백 실행 전 발생)
  • 반환 값에 따른 탐색 제어:

- nil: 정상 처리

- SkipDir: 현재 디렉터리 무시 (형제 디렉터리 계속)

- SkipAll: 전체 탐색 중단

- 기타 오류: 상위 호출자로 전달

6. 예제: 특정 디렉터리 건너뛰기

func skipHiddenDirs(path string, d fs.DirEntry, err error) error {
    if d.IsDir() && strings.HasPrefix(d.Name(), ".") {
        return filepath.SkipDir // .git, .vscode 등 무시
    }
    return nil
}

7. 깊이 기반 탐색 제한

func maxDepthWalker(maxDepth int) filepath.WalkDirFunc {
    rootDepth := -1
    return func(path string, d fs.DirEntry, err error) error {
        if rootDepth == -1 {
            rootDepth = strings.Count(path, string(filepath.Separator))
        }
        currentDepth := strings.Count(path, string(filepath.Separator)) - rootDepth
        if d.IsDir() && currentDepth >= maxDepth {
            return filepath.SkipDir
        }
        return nil
    }
}

결론

  • SkipDir을 사용해 불필요한 디렉터리 무시로 성능 최적화
  • DirEntryInfo() 호출 제어로 메모리 사용량 관리
  • 오류 처리 패턴에 따라 fail-fast 또는 fine-grained 접근 선택 (예: .git 디렉터리 무시, 특정 파일 찾기 중단)