[iOS] 앱에 데이터 저장하기

룰루날라·2022년 6월 2일
3
post-thumbnail

닭볶음탕을 해먹으려고 장보기 리스트를 메모 앱에 적어 마트로 출발했다.
마트에 도착해서 메모장을 켰는데 기껏 적은 장보기 리스트 내용이 사라졌다 😵‍💫
이렇게 앱이 데이터를 제대로 저장하지 못하면 제 기능을 할 수 없다.

iOS에는 앱에 데이터를 저장하기 위한 여러가지 방법들이 있다.

  • UserDefaults
  • Keychain
  • FileManager
  • SQLite
  • CoreData
    각 방법마다 사용하기 좋은 상황들이 다르기 때문에 어떤 데이터를 저장하고 싶냐에 따라 적절한 기술을 선택해야 한다.

이전엔 ‘이런게 있구나~’하고 넘어갔었는데 이번에 앱을 만들기 시작하면서 서버 없이 로컬로 앱의 데이터를 저장하는 방식을 고민하다보니 여러 방법들에 대해 차이점을 더 자세히 알아보았다.

하나씩 공부해보자!

UserDefaults

사용자의 기본 설정 정보를 저장하는 데이터베이스라고 보면 간단하다.

UserDefaults라는 이름 그대로 ‘사용자의 기본 설정’을 저장하는 용도이기 때문에 작은 정보(예: 사용자가 라이트모드를 선호하는지 다크모드를 선호하는지, 매일 알림을 받고 싶은 시간, 실제로 알림을 받고 싶은지 등)를 저장하는 데 사용해야 한다.

예를 들어, 아래는 아이폰의 설정 앱에서 ‘사운드 및 햅틱'에 들어간 화면이다.

무음 시 진동이 울리도록 설정을 해두었는데 만약 이 정보를 저장하지 않으면 무음일 때 진동이 안 울려 전화가 오는걸 알아채지 못할 것이다.

iOS에서는 이런 사용자의 설정값들을 UserDefaults에 저장한다.

따라서 앱을 만들 때 설정창이 있다면 UserDefaults를 사용하는 게 좋다👍
반면 사용자가 만들어내는 많은 양의 데이터를 저장하기에는 부적합!

내부적으로 작동하는 방식

UserDefaults로 저장하는 모든 값은 plist에서 유지관리된다.

plist에 간단한 데이터 타입(strings, numbers, dates, boolean, urls, datas 등)을 저장하도록 설계되어 plist로 디스크에 저장된다.

파일이 전체로 읽고 쓰여지기 때문에 UserDefaults를 사용해 부분적으로 변경이 있는 많은 양의 데이터를 저장하면 많은 시간을 낭비하게 된다.

Keychain

비밀번호, 신용카드 정보, 인증서 , 들키기 싫은 메모처럼 안전하게 저장하고 싶은 작은 데이터를 저장하는 암호화된 데이터베이스다.

키체인은 디스크의 특수파일로 하드웨어로 암호화되어 있으며, low level의 API가 많다.

실제로 앱에서 키체인을 사용해야하는 경우에는, 복잡한 과정은 좋은 라이브러리를 통해 수행하는 것이 훨씬 간단하다.

File Manager

File System의 컨텐츠에 대한 인터페이스로, 앱의 파일을 읽고 쓸 수 있도록 해준다.

File System

File System이란, 컴퓨터에서 파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제(위키백과)다.
ㅎㅎ 난 처음 읽고 잘 와닿지가 않았다.

조금 풀어 설명하자면 우리가 옷을 아무렇게나 벗어 놓으면 입고 싶은 옷을 찾기 어렵듯, 컴퓨터가 파일을 쉽게 찾아 접근할 수 있도록 하는 시스템을 말한다.
보통 컴퓨터는 하드디스크같은 보조기억장치에 파일들을 저장하므로, 파일시스템 이란 하드디스크에 있는 데이터를 쉽게 찾고 접근하기 위해 정리하는 체제라고 볼 수 있다.

여러 종류가 있지만 파일에 쉽게 접근해 찾을 수 있도록 하드 드라이브를 데이터를 저장하는 작은 유닛으로 나누고 각 유닛에 어떤 데이터가 있는지를 기억하는 방법을 가진다는 공통점이 있다.
-> iOS에서는 APFS라는 파일시스템을 사용하고 있다.

Sandbox

iOS의 파일 시스템은 보안과 단일성을 위해 모든 앱을 독립된 섬들로 봐서 각 앱은 설치되면, sandbox라고 불리는 곳에 위치하고 하나의 앱은 하나의 샌드박스 내에서만 놀 수 있다.

샌드박스(Sandbox)란, 아이들이 안에서 놀도록 만든 모래사장으로 하나의 앱은 하나의 샌드박스 안에서만 파일을 공유할 수 있도록 만든 보안 모델이다.

이렇게 하는 이유는 샌드박스를 통해 앱마다 별도의 파일을 생성해 공유되지 않도록 하고, 외부로부터의 접근에도 보호되는 영역으로 시스템이 부정적으로 조작되는 것을 막기 위해서다.

앱을 설치하면 인스톨러가 sandbox 디렉토리 안에 앱을 위한 여러 Container 디렉토리를 만든다.

각 컨테이너 디렉토리는 특정 역할을 가지고 있는데, 파일을 저장하기 위해 주로 사용하는 디렉토리들은 Data Container에 있다.

이 디렉토리와 파일들에 접근하도록 도와주는 것이 File Manager이다.

File Manager

파일 매니저를 통해서 파일시스템과 상호작용을 할 수 있다.
파일과 디렉토리를 찾고, 만들고, 복사하고, 이동하는 데 사용한다.

파일 매니저를 통해 주로 접근해 사용할 디렉토리들에 대해 살펴보면서 어떤 데이터를 저장할 때 사용하면 좋을지 알아보자.

  • Document : 사용자가 생성하는 콘텐츠를 저장하기에 완벽한 장소다.(iCloud에도 자동으로 백업된다.)
    • Documents/Inbox : 다른 앱이 우리 앱에 파일을 열도록 요청할 때마다 시스템에 의해 생성되는 특수 폴더다. 이 폴더는 읽기 전용인데, 예를 들어 메일 프로그램의 경우 앱과 연결된 이메일 첨부 파일을 이 디렉토리에 배치한다.
  • Library : 이 폴더에는 사용자가 생성하지 않은 파일과 앱 실행 사이에 지속되어야 하는 파일을 넣을 수 있다. 그러나 장치에 여유 공간이 충분하지 않으면 일부 파일이 삭제될 수 있다.
    • Library/Caches : 이 디렉토리는 특수 폴더다. 잃어버릴 염려 없이 곧 필요할 수도 있는 파일을 저장할 수 있다. 파일의 사용을 중단하면 시스템에서 파일을 삭제한다. 앱을 더 빨리 로드하기 위해 다운로드한 이미지는 이 폴더에 있어야 한다.
  • tmp : 이 폴더에는 앱에 일시적으로 필요한 파일을 저장할 수 있다. 앱이 실행되지 않을 때 운영 체제에서 삭제할 수 있다.

SQLite

앱에서 쓰이는 가장 표준적인 데이터베이스다.
애플리케이션이 관계가 있는 많은 양의 데이터를 처리하는 경우 SQLite를 살펴볼 수 있다.
서버리스, 구성이 필요 없는 트랜잭션 SQL 데이터베이스 엔진으로 즉, 애플리케이션에 포함되어 있어 매우 빠르다.

데이터의 양이 많고 잘 구조화되어있는 경우에 적절하게 사용될 수 있다.
저장 기능 외에도 효율적인 검색이 가능하고 복잡한 쿼리를 작성할 수 있다.

Core Data

Core Data는 Apple의 persistence 솔루션으로 코어데이터를 사용하면 앱이 모든 형식의 데이터를 저장하고 다시 가져올 수 있다.
쉽게 말하면 코어 데이터는 객체지향 데이터베이스로, 코어데이터라는 인프라를 사용해서 데이터베이스에 데이터를 저장하고 찾아올 수 있다.

하지만 Core Data는 일반적으로 데이터를 SQLite 데이터베이스에 저장함에도 불구하고 기술적으로 데이터베이스 자체는 아니다.
ORM도 아니지만 ORM처럼 느껴질 수도 있다.

제대로 말하면 객체 그래프를 관리하는 시스템이라고 할 수 있는데, attribute와 다른 객체에 대한 relationship이 있는 객체를 생성, 저장 및 찾아올 수 있다.
코어데이터는 아주 단순하면서 강력한 도구로 기본 데이터 모델부터 복잡한 형식까지 모든 형식의 데이터를 저장할 수 있다.

코어 데이터는 저장 기능 외에도 실행 취소 및 다시 실행 작업을 수행할 수 있다.
또한 성능이 매우 우수하며 데이터를 검색하고 찾아오는 시간이 매우 빠르다.

나는 무엇을 쓸 것인가🤔

나는 앱의 모델 데이터, 객체 간에 관계가 있는 데이터를 저장하고 싶기 때문에 SQLite와 Core Data 중 하나를 선택해야겠다고 생각했다.

코어 데이터가 데이터를 저장하기 위해서는 내부적으로 SQLite를 사용하기 때문에 데이터 저장의 측면에서는 거의 유사한 기능을 사용할 수 있다. 따라서 추가적인 코어데이터의 기능을 사용할 것이냐가 관건인데..

사실 지금 내가 만드려는 앱이 데이터의 개수 자체가 엄청나게 많지 않고 객체간의 관계가 지나치게 복잡하지 않아서 Core Data가 오버헤드를 추가하긴 하지만, 써보고싶기 때문에..ㅋㅋㅋㅋㅋ Core Data를 써보려고 한다.
직접 써보면서 Core Data가 왜 Database도 아니고, ORM도 아닌 객체 그래프를 관리하는 Framework인지를 느껴보고싶다!!!

너무 답정너였나..ㅎ

참고
https://developer.apple.com/documentation/foundation/userdefaults
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/AboutPreferenceDomains/AboutPreferenceDomains.html https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/AboutPreferenceDomains/AboutPreferenceDomains.html
https://medium.com/@imranjutt/data-persistence-in-ios-2804d04bde62
https://betterprogramming.pub/5-ways-to-store-user-data-in-your-ios-app-595d61c89667

profile
즐거운 인생 (~-_-)~ ~(-_-~)

0개의 댓글