파일 시스템 탐색과 WalkDir: 재귀적 트리 탐색 4/9
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
Go 언어로 파일 시스템 작업을 수행하는 개발자, 특히 대규모/성능 중심 애플리케이션 개발자
난이도: 중급~고급 (파일 시스템 탐색과 Go 표준 라이브러리 이해 필요)
핵심 요약
filepath.WalkDir
는filepath.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
을 사용해 불필요한 디렉터리 무시로 성능 최적화DirEntry
의Info()
호출 제어로 메모리 사용량 관리- 오류 처리 패턴에 따라
fail-fast
또는fine-grained
접근 선택 (예:.git
디렉터리 무시, 특정 파일 찾기 중단)