Temporary Directory(tmp)는 iOS 앱 샌드박스 내의 디렉토리로, 현재 앱 세션 내에서만 필요한 매우 단기적인 데이터를 저장합니다. Apple File System Programming Guide(2024)에 따르면, 시스템은 앱이 종료되거나 기기가 재시작될 때 tmp를 지울 수 있습니다. Caches Directory와 달리 tmp의 임시 파일은 실행 간에 유지되지 않으며, 개발자는 디스크 공간을 낭비하지 않도록 사용 후 명시적으로 삭제해야 합니다.
핵심 요점
Temporary Directory(tmp라고도 함)는 iOS 앱 샌드박스 내의 디렉토리로, 수명이 현재 세션으로 제한된 데이터를 저장하도록 설계되었습니다. 모든 샌드박스 디렉토리 중 가장 수명이 짧은 스토리지입니다.
iOS는 중간 파일 저장이 필요한 작업을 위해 tmp를 제공합니다: Documents로 이동하기 전 파일 다운로드, 내보내기 전 임시 복사본 생성, 스트리밍 데이터 버퍼링. 작업이 완료된 후에는 임시 파일을 삭제해야 합니다.
Apple Developer Documentation(2024)에 따르면, tmp 디렉토리는 경로가 앱 실행 간에 변경될 수 있다는 점에서 독특합니다. iOS는 실행할 때마다 새로운 tmp 경로를 생성하며, 이를 통해 이전 세션의 데이터가 실수로 읽히지 않도록 보장합니다. 개발자는 실행 간에 tmp 경로를 저장해서는 안 됩니다.
중요한 점: Caches Directory에서는 데이터가 여러 실행에 걸쳐 유지될 수 있지만, tmp는 장기적으로 세션 간 데이터를 보존하지 않습니다. 진정으로 임시적인 데이터를 저장하는 가장 신뢰할 수 있는 방법입니다.
Swift에서 tmp 경로를 가져오려면 전역 함수 NSTemporaryDirectory() 또는 FileManager.temporaryDirectory를 사용합니다. 이는 모든 샌드박스 디렉토리 중 가장 간단한 API입니다.
import Foundation
// Option 1: NSTemporaryDirectory()
let tempDir = NSTemporaryDirectory()
let tempFile = (tempDir as NSString)
.appendingPathComponent("export_temp.pdf")
// Option 2: FileManager.temporaryDirectory (URL)
let tempURL = FileManager.default.temporaryDirectory
let exportURL = tempURL.appendingPathComponent("export_temp.pdf")
Objective-C는 동일한 전역 함수 NSTemporaryDirectory()를 사용합니다. 결과는 앱의 임시 디렉토리에 대한 전체 경로가 포함된 문자열입니다.
@import Foundation;
NSString *tempDir = NSTemporaryDirectory();
NSString *tempFile = [tempDir stringByAppendingPathComponent:@"temp_data.bin"];
다른 디렉토리와의 주요 차이점: NSTemporaryDirectory()는 도메인이나 검색 마스크를 지정할 필요가 없으며 전역 함수입니다. 하지만 다음 실행 시 경로가 변경될 수 있으므로 UserDefaults나 다른 영구 저장소에 저장하지 마십시오.
Temporary Directory는 엄격하게 정의된 시나리오를 위해 설계되었습니다. 개발자는 종종 tmp를 Caches와 혼동하여 한 세션 이상 지속되어야 하는 데이터를 tmp에 배치합니다. 올바른 사용 사례를 살펴보겠습니다.
데이터 내보내기 중에 생성되는 파일: 이메일로 보내기 전 보고서의 임시 복사본, 업로드 전 압축 아카이브, 형식 변환을 위한 중간 파일. 내보내기가 완료되면 파일을 삭제해야 합니다.
실시간으로 처리되는 오디오, 비디오 또는 스트리밍 데이터를 기록하기 위한 임시 버퍼. 예를 들어, 영구 저장소에 저장하기 전 음성 녹음 또는 스트리밍 중 비디오 스트림 버퍼링.
| 시나리오 | 디렉토리 | 이유 |
|---|---|---|
| 보내기 전 PDF 내보내기 | tmp | 보낸 후 파일 불필요 |
| 이미지 캐시 | Caches | 세션 간 유용 |
| 이동 전 파일 다운로드 | tmp | 중간 저장 |
| 세션 로그 | tmp | 세션 중에만 관련 |
| 문서 편집 | tmp | 저장 전 버전 |
데이터가 지금 여기서만 필요하다면 tmp를 사용하세요. 다음 세션에서 유용할 수 있다면 Caches를 사용하세요. 데이터 손실이 허용되지 않는다면 Documents를 사용하세요.
iOS는 tmp의 라이프사이클을 다른 샌드박스 디렉토리와 다르게 관리합니다. 이 주기를 이해하는 것은 앱에서 적절한 파일 저장소를 설계하는 데 중요합니다.
앱이 실행될 때마다 iOS는 tmp에 새 경로를 할당할 수 있습니다. 이전 경로는 접근할 수 없게 되지만, 물리적 파일은 기기가 재시작될 때까지 디스크에 남아 있을 수 있습니다. 이것이 Apple이 세션 간에 tmp 경로를 저장하지 말 것을 강력히 권장하는 이유입니다.
Apple Tech Note TN2150(2024)에 따르면, 시스템은 다음 경우에 tmp를 지울 수 있습니다: 기기 재시작, 디스크 공간 제한 도달, 앱 오프로드(Offload). Caches와 달리 tmp는 여러 실행에 걸쳐 데이터를 저장하도록 설계되지 않았으며, 샌드박스에서 가장 신뢰할 수 없는 스토리지입니다.
개발자는 FileManager.removeItem(at:)을 사용하여 작업 완료 후 임시 파일을 명시적으로 삭제해야 합니다. tmp에서 삭제되지 않은 파일은 축적되어 디스크 공간을 낭비하며, iOS는 가까운 시일 내에 자동 정리를 보장하지 않습니다.
tmp와 Caches를 비교하면 개발자가 저장소 디렉토리를 선택할 때 올바른 결정을 내리는 데 도움이 됩니다. 잘못된 선택은 조기 데이터 손실이나 불필요한 공간 소비로 이어질 수 있습니다.
| 매개변수 | Temporary Directory | Caches Directory |
|---|---|---|
| 수명 | 현재 세션만 | 세션 간 (보장 없음) |
| 경로 변경 | 실행마다 변경될 수 있음 | 안정적인 경로 |
| 자동 정리 | 재시작 시, 오프로드 시 | 공간 부족 시 |
| 개발자 삭제 | 작업 후 필수 | 한도 초과 시 권장 |
| 사용 | 중간 작업 | 영구 캐시 |
실용적인 규칙: 생성 후 몇 초 또는 몇 분 내에 삭제될 데이터에는 tmp를 선택하세요. 세션 간에 몇 시간 또는 며칠 동안 유지하는 것이 유용하지만 재생성할 수 있는 데이터에는 Caches를 선택하세요.
Temporary Directory 작업에는 규율이 필요합니다. tmp의 데이터는 수명이 짧고 축적되면 공간 낭비로 이어질 수 있으므로 개발자는 몇 가지 주요 사례를 따라야 합니다.
FileManager.removeItem(at:)은 임시 파일 작업이 완료된 직후 호출해야 합니다. 오류가 발생하더라도 삭제를 보장하려면 Swift에서 defer를 사용하세요.
import Foundation
let tempURL = FileManager.default
.temporaryDirectory
.appendingPathComponent("upload_temp.dat")
defer {
try? FileManager.default.removeItem(at: tempURL)
}
// Work with temp file
try "temporary data".write(to: tempURL, atomically: true)
// ... file operation ...
// defer executes when scope exits
생성 후 1시간 후에도 데이터가 필요할 수 있다면 Caches 또는 Application Support에 저장하세요. tmp는 몇 분 동안의 작업을 위해 설계되었으며 저장용이 아닙니다.
이러한 규칙을 따르면 임시 파일이 축적되지 않고, 디스크 공간이 효율적으로 사용되며, 앱이 iOS 파일 시스템 정리 시나리오를 올바르게 처리할 수 있습니다.
자주 묻는 질문
일반적으로 단일 세션 내에서는 경로가 변경되지 않지만, iOS는 이를 보장하지 않습니다. 드물게 앱이 백그라운드에서 포그라운드로 전환될 때 시스템이 tmp를 변경할 수 있습니다. 따라서 Apple은 경로를 변수에 저장하는 대신 필요할 때마다 NSTemporaryDirectory()를 호출할 것을 권장합니다.
파일이 축적되어 디스크 공간을 차지합니다. iOS는 기기 재시작 시 tmp를 지울 수 있지만, 그때까지 앱은 디스크 공간을 낭비하게 됩니다. 상당히 축적되면 사용자는 저장소 설정에서 앱이 많은 공간을 차지하고 있음을 확인할 수 있습니다.
네, 민감한 데이터가 포함된 임시 파일에는 NSFileProtectionComplete와 함께 DataProtectionType을 사용할 수 있습니다. 하지만 파일이 현재 세션 내에서만 읽히고 삭제될 경우 암호화가 과도할 수 있습니다. 데이터 유형에 따라 암호화 필요성을 평가하세요.
고유 식별자를 생성하려면 ProcessInfo.processInfo.globallyUniqueString 또는 UUID().uuidString을 사용하세요. FileManager는 tmp에서 자동으로 고유한 이름을 생성하는 urlForCreatingTemporaryFile 메서드도 제공합니다. 이는 병렬 쓰기 시 충돌이 없음을 보장합니다.
간접적으로 — 네. Apple은 앱이 디스크에 저장하는 총 데이터 양에 주의합니다. tmp에 삭제되지 않은 기가바이트의 파일이 있는 경우 리뷰어가 앱을 거부할 수 있습니다. tmp의 권장 제한은 항상 100 MB를 초과하지 않는 것입니다. 정기적으로 tmp를 정리하고 FileManager를 통해 크기를 확인하세요.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.