개발자 블로그

Documents 폴더 파일 읽기/쓰기 시 주의사항 본문

프로그래밍/iOS-SWIFT

Documents 폴더 파일 읽기/쓰기 시 주의사항

로이드.Roid 2017. 8. 17. 16:34

안드로이드만 하다가 iOS 앱을 개발하려니 파일 시스템에 대한 개념 부터 참 새로웠다. 안드로이드는 이미 익숙히 알고 있던 개념이라서 배우는데 어려움이 없었는데, iOS는 iCloud도 있고.. 디렉토리에 따라 용도가 이미 정해져있기 때문에 아무 디렉토리나 마음대로 쓰면 안된다. 아이폰 앱 개발 초보자라면 일단 아래 가이드 문서를 본 다음에 시작하도록 하자.

타이틀에 이미 적었듯이, Documents 폴더가 앱에서 만든 파일들은 저장하기 위해서 일반적으로 사용되는 디렉토리다. 


구현할 내용은 간단했다. ImagePicker를 통해서 선택한 이미지를 Documents 디렉토리에 저장하면 되는 딱히 어려울게 없는 코드다. 문제는 이미지를 저장할 때는 에러가 없는데, 다시 읽으려고 해당 경로에 접근하면 파일이 존재하지 않는다는 것.

그냥 결론부터 이야기하면, 이미지를 저장하는 코드, 다시 읽어들이는 코드 모두 문제가 없었다. 그럼에도 불구하고 저장한 곳에는 파일이 존재하지 않았다. 이거 실화냐고? 실화다. 

나도 이번 삽질을 통해서 이런 일이 발생할 수 있다는걸 처음 알았다. (안드로이드 코드도 점검해봐야겠다.)


이런 문제가 발생한 원인은 샌드박스 내 Documents 디렉토리에 저장한 파일의 경로를 저장할 때, fullpath를 가지고 있었기 때문이다. 그럼 왜 fullpath를 가지고 있는게 문제가 되느냐? 

저장한 파일의 전체 경로는 아래와 같다. (주소 중 일부는 *로 처리했다.)

file:///Users/***/Library/Developer/CoreSimulator/Devices/6BBBBEEB-14D1-4E43-91C4-1BCAD1C4F9BA/data/Containers/Data/Application/5620403B-E6EC-4154-8CEA-DD513767DC95/Documents/*****/636377662424976000_asset.PNG

첫 번째로 보여지는 긴 ID 문자열은 기기의 UUID이고, 굵게 처리한 두 번째 나타나는 ID 문자열은 어플리케이션 ID이다.


그리고 앱을 다시 실행하고, 파일을 저장 했을 때 얻어진 fullpath는 아래와 같았다.

file:///Users/***/Library/Developer/CoreSimulator/Devices/6BBBBEEB-14D1-4E43-91C4-1BCAD1C4F9BA/data/Containers/Data/Application/FBEA3524-CD99-4774-A2E5-14099E86F005/Documents/*****/636377661469969920_asset.PNG

굵게 처리한 곳의 문자열을 보면 달라진 걸 확인 할 수 있다.


이렇게 중간에 경로명이 달라지기 때문에 절대로 fullpath를 저장하면 안된다. Documents 디렉토리는 api를 통해서 가져올 수 있기 때문에 파일의 경로를 저장할 때는 "Documents" 미만의 경로만 저장하고 있다가 나중에 필요할 때 결합해서 조회해야 한다.

이게 꽤 심각한 문제인게 실제로 스토어를 통해서 이미 운영중인 앱도 나중에 업데이트를 배포하면 발생할 수 있는 문제이기 때문이다. 뭐 해결을 못하는건 아니지만.. 데이터 컨버전하는 코드 추가하고, 테스트하고, 업데이트 배포하고, 리뷰 대응하고.. 으.. 생각만해도 골치가 아프다. 

여기 실제로 이런 일을 겪은 사람이 있다. (업데이트 배포될 때 까지 얼마나 가슴 졸였을까..-_-;;)


오늘의 삽질 기록 끝.

Comments