Context는 CoreData로 관리되는 DB와 application 사이를 연결해주는 Area 개념으로 이해하면 쉽다.
Context를 학습하기 전에, CoreData와 DB(SQLite)의 관계에 대해서 먼저 이해해야 한다.
CoreData는 DB가 아니라 Framework이다!
이렇게만 이야기하면 CoreData를 처음 공부하는 사람들은 당연히 무슨 말인지 하나도 이해하기 힘들 것이다.
(내 이야기다...)
쉬운 이해를 위해, 실제 CoreData와 함께 사용되는 SQLite (<- 얘는 DB) 와 함께 이야기해보겠다.
우리가 swift를 통해 어떤 SQLite DB에 무언가를 저장하려고 한다고 가정해보자.
어떻게 할 것인가?
...
당연히 방법을 모른다. 아마 swift를 마스터한 사람이 아니라면 대부분의 사람들은 DB에 CRUD(Create, Read, Update, Destroy) 하는 방법을 알지 못할 것이다. (방법이 없을 수도...?) 당연히 있다. swift는 C기반이다.
CoreData는 이렇게 어려운 CRUD 작업을 쉽게 만들어주는 Framework이다.
CoreData는 이를 위해 Context를 사용한다.
여기서 Context라는 개념이 나온다.
Context는 우리가 data를 생성하거나 읽기, 업데이트, 제거할 수 있도록 하는 임시적인 공간이다.
우리는 Persistent Container(영구적인 저장소)에 바로 접근할 수 없기 때문에, Context라는 중개자를 거쳐야 한다.
Context는 Git과 비교하면 이해하기 편하다.
우리가 Git을 이용할 때, 로컬에서 git add, git commit 과 같은 명령어를 아무리 써봤자, 실제로 git 서버에는 적용이 되지 않는다.
또한 git pull을 하면 코드를 가져올 수 있지만, 그 코드를 local에서 수정한다고 해도, git 서버에 영향을 미치지 않는다.
반드시 git push 작업을 해야 실제 git 서버에 적용이 된다.
CoreData를 이용한 DB관리도 마찬가지이다.
우리는 DB를 관리하기 위해, CoreData의 Context를 사용한다.
Context는 DB에서 정보를 뽑아와서 가져온 임시 Area라고 생각하면 되는데, 우리가 이 곳에서 아무리 수정을 해도 실제 DB에는 영향을 주지 못한다. (CRUD 되지 않는다.)
좀 더 이해를 돕기 위해서, 먼저 데이터를 추가하는 것을 살펴보자.
Item은 내가 DB에 올려놓은 테이블(Entity) 이름이다.
테이블은 done이라는 Boolean 타입과 titled이라는 String 타입의 Attribute들을 가진다.
Item 객체를 생성한다는 것은, 테이블에 올라갈 행 하나를 생성하는 것과 같다.
여기서 우리는 Context를 통해 Item에서 NSManagedObject를 가져온다. (NSManagedObject는 DB Table의 한 행을 의미한다.)
즉, NSManagedObject 타입의 객체를 하나 만들어서, 이를 다루는 것이다!
그리고 위와 같이 DB를 수정하면 변경사항이 생긴다.
이러한 변경 사항을 반영하기 위해서는
context.save()
해당 코드를 통해서 마치 git push 처럼 DB에 적용시켜주어야 한다.
(context.save() 는 반드시 try와 같이 사용해야 한다는 점은 잊지말자!)
'iOS 개발 > CoreData' 카테고리의 다른 글
[CoreData] Relationship을 통해 Data를 관리하기 (0) | 2022.01.06 |
---|---|
[CoreData] Coredata 자체를 sort 할 수 있을까? (0) | 2021.11.17 |
[Core Data] Context를 이용해 Entity에 Attributes들을 추가, 삭제 (0) | 2021.09.08 |
[Core Data] Entity의 Name Attribute들을 Cell에 표시하기 (0) | 2021.09.07 |
[Core Data] TableView와 Navgation Cotroller을 임베디드 하기 (0) | 2021.09.07 |
[Core Data] Entity와 Attribute를 생성하는 방법 (0) | 2021.09.07 |
[Core Data] Entity Class 설정 - Codegen option 탐구 (0) | 2021.09.03 |
[애플 Document 번역] Core Data (0) | 2021.08.27 |