iOS개발/Swift 기본

Swift iOS 저장소 알아보기 FileManager 편

Larooly 2025. 6. 12. 18:10

안녕하세요.

요즘 여러가지를 공부하다가

문뜩 iOS 저장소에는 어떤 것들이 있는지 궁금해져서 정리해봤는데

  1. UserDefaults
  2. FileManager
  3. Core Data
  4. SQLite
  5. KeyChain

별도의 설치 없이 사용이 가능한 저장 방법은 이렇게 5가지 인 것 같습니다.

그래서 이들을 순서대로 글을 써보려 했으나 이미 1번은 정리한 적이 있더라고요;;;;(머쓱)

 

2022.12.07 - [iOS개발/Swift 기본] - Swift UserDefaults로 간단한 데이터 저장하기

 

Swift UserDefaults로 간단한 데이터 저장하기

이번에는 UserDefault 에 대해 알아볼까 합니다. 사실 굉장히 많이 쓰이고 간단하게 쓸 수 있는 편리한 부분인데따로 정리를 해본적이 없더라고요. 그래서 한번 해볼까 합니다. * UserDefault ? 주로 앱

world-of-larooly.tistory.com

무려 3년전 글이라니....

아무튼 그래서 2번인 FileManager부터 시작해볼까합니다. 이건 없을꺼에요....

 

FileManager 

* 그래서 이게 뭔가요?

- 간단하게 설명드리면 말 그대로 앱에서 파일을 쉽게 관리할수있도록 도와주는 친구입니다. 

- Sandbox 의 영역에 저장되기 때문에 앱 삭제시 같이 삭제됩니다.

- AppGroup을 지원하기 때문에 설정에 따라 다른 앱과 파일 공유가 가능합니다.

- 폴더를 만들어 경로를 지정하고 거기에 파일을 저장하는 것이 기본 이라고 생각하시면 됩니다.

- 윈도우나 맥에서 없는 폴더(잘못된 경로)에 저장을 못하듯 여기도 마찬가지입니다. (에러납니다.)

 

자 그럼 이제 뭔지 알았으니 한번 해봅시다. 

생성 (디렉토리 , 파일) / 내용 가져오기 / 삭제 이렇게 알아봅시다. 

복사나 이동 같은 기능도 당연히 제공하지만 이번 글에서는 기본적인것만 다뤄볼까 합니다.

(윈도우나 맥에서 파일이랑 폴더 다루듯 한다고 생각하시면 편합니다.)  

 

일단 이렇게 선언하고 시작하겠습니다. 

let myFolder = "myFolder" // 만들 폴더 이름
let myFile = "myFile.txt" // 파일 이름
let filemanager = FileManager.default // 파일매니저 선언

 

1. 폴더와 파일 생성 

- 어떻게 보면 처음 파일을 저장하는 과정이죠 

- 솔직히 이 부분만 잘하면 나머지는 쉽다고 생각합니다.

- 참고로 같은 경로에 같은 파일이름으로 또 저장하면 덮어쓰기 됩니다.(사실상 수정 기능)

 

* 폴더 생성 

- 보시면 아시겠지만 if 로 폴더의 존재 여부를 확인하는 과정이 들어갑니다. 

- 괜히 폴더 있는지 모르고 새로 만들면 내용물도 날라 갈 수 있기 때문에 존재 여부 확인을 권장드립니다.

//기본 경로 설정
let docUrl = filemanager.urls(for:.documentDirectory, in: .userDomainMask).first!
// 내가 원하는 폴더URL 생성
let folderURL = docUrl.appendingPathComponent(myFolder)
// 폴더가 없으면?
if !filemanager.fileExists(atPath: folderURL.path) {
    do {
        // 폴더 생성
        try filemanager.createDirectory(at: folderURL, withIntermediateDirectories: true, attributes: nil)
        print("폴더 생성을 성공했습니다.")
    } catch {
        print("폴더 생성을 실패했습니다.")
    }
}

- 맨 첫줄에 documentDirectory 말고도 아래처럼 다양하게 종류가 많습니다. 

- 원하시는거 고르시면 되는데 caches는 진짜 캐시라서 임시 데이터라 원치 않는 타이밍에 사라지실 수 도 있으니 주의하셔야합니다. 

- 대부분 일반적인 거는 Document 를 사용하시는걸 권장드립니다. 

 

* 파일 생성 

- 조금 놀랐는데 Xcode16.4 인데 자동완성으로 코드를 잘 보여주네요??

// 파일 저장
let myFilePath = folderURL.appendingPathComponent(myFile)// 파일이름 넣어주시면됩니다(형식포함)
let data: Data = "Hello, 안녕!".data(using: .utf8)!
do {
    try data.write(to: myFilePath) // 거기에 적어줘
    print("파일을 성공적으로 저장했습니다.")
} catch {
    print("파일을 저장하는 데에 실패했습니다.")
}

 

근데 여기서 문제가 하나 있습니다. 

저는 시뮬레이터에서 작업중인데 원래라면 이 저장된 파일을 확인하려면 경로를 따고 찾아가야 합니다. 

하지만 귀찮으니 약간의 편법을 쓸겁니다. 

후훗

 

사실 권한을 주면 저희가 만든 파일이 사용자에게도 파일앱을 통해 보이게 됩니다. 

이렇게 두개입니다.

Info.plist 에 해당 권한 두 개를 둘다 YES로 해두면 (기본 NO)

이 기능은 필요하신 분들만 사용하시는 걸 권장드립니다.

잘 저장되었죠?

 

저희가 만든 게 잘 보이니 다음으로 넘어 갑시다.

(사용자한테 보인다는 점 주의)

 

2. 저장된 내용 가져오기 

- 저장은 했는데 앱에서 못 가져오면 아무 의미가 없죠?

do{ // 저장된 파일 가져오기
    let storeData = try String(contentsOf: myFilePath, encoding: .utf8)
    print("파일을 성공적으로 가져왔습니다.\n내용: " + storeData)
} catch{
    print("파일을 가져오지 못했습니다.")
}

- 가져오는 데이터에 따라 형식은 조금씩 바뀌지만 다 같은 맥락입니다. (실제 출력은 아래와 같습니다.)

파일을 성공적으로 저장했습니다.
파일을 성공적으로 가져왔습니다.
내용: Hello, 안녕!

 

3. 저장된 내용 삭제하기 

- 더 이상 필요가 없으면 삭제를 해서 용량을 확보하는게 좋겠죠?

- 삭제는 매우 간단합니다. (자동 완성이 장난 아니군요;;;;)

// 파일 삭제하기
do {
    try filemanager.removeItem(at: myFilePath)
    print("파일을 성공적으로 삭제했습니다.")
} catch {
    print("파일을 삭제하는 데에 실패했습니다.")
}

 

삭제를 할때 파일을 삭제한 것이기 때문에 폴더는 남게 됩니다.

 이 부분은 넣어준 경로만 바꿔주시면 폴더도 삭제가 가능하게 됩니다. 

 

자 이렇게 해서 저장소 1탄 Filemanager 이 마무리 되었습니다. 

익숙하신 분들도 많겠지만 저처럼 가끔씩 헷갈리거나 처음하시는 분들에게

도움이 되었으면 좋겠습니다.

 

오늘도 파이팅입니다.