# CoreDataStack / App Life Cycle Method
## CoreData 저장 위치 관리 객체
CoreData를 활용하기 위해서는 먼저 CoreDataModel을 생성하고 **Core Data Stack**을 준비해야한다.
iOS 10 이전 버전에서는 NSPersistentContainer 클래스가 없었기 때문에 Core Data Stack을 구성하는 ManagedObjectModel, ManagedObjectContext, PersistentStoreCoordinator를 직접 설정해야 했지만 PersistentContainer의 등장으로 해당 과정이 캡슐화되었다.
ManagedObject를 PersistentStore에 저장하고, 해당 경로를 관리하는 객체는 `NSPersistentStoreCoordinator` 인스턴스이다.
<img src="https://i.imgur.com/tTftQrB.png" width="500">
- NSManagedObjectModel : 관리 객체 모델로 .xcdatamodeld 파일을 나타내는 프로그래밍적인 표현입니다.
- 해당 타입의 인스턴스에 접근해 모델을 변경하거나 수정하는 등의 기능을 수행할 수 있다.
- NSManagedObjectContext : 관리 객체 컨텍스트로 관리 객체가 존재하는 영역입니다.
- 앱에서 관리 객체의 생성, 삭제, 편집 등을 수행하기 위해 NSManagedObjectContext와 통신한다.
- NSPersistentStoreCoordinator : 모델을 사용하여 컨텍스트와 persistent store의 통신을 돕는 역할을 한다.
- 실제 저장소와 object model을 연결하는 다리 역할을 합니다. NSManagedObjectContext의 요청에 대한 답을 주고, data에 대한 검증도 수행한다.
Persistent container는 인스턴스는 프로퍼티로 persistentStoreCoordinator를 가지고 있다. 해당 프로퍼티의 `setURL(_:for:)` 메서드로 저장소 위치를 특정할 수 있으며, 기본적으로 Application Support가 기본 위치로 되어있다.
</br>
## App Life Cycle
### iOS 13 이상
iOS 13 이상부터는 SceneDelegate가 app life cycle event에 응답한다.
Scene 기반 app life cycle event

### SceneDelegate의 메소드
``` swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
```
- UISceneSession 생명주기에서 첫번째로 호출되는 메서드
- 앱에 Scene이 추가될 때 호출
<br>
``` swift
func sceneDidDisconnect(_ scene: UIScene)
```
- Scene이 앱에서 해제되었을 때 호출
- 나중에 다시 연결할 수 있음
<br>
``` swift
func sceneDidBecomeActive(_ scene: UIScene)
```
- Scene이 활성화 되고 사용자 이벤트에 응답을 시작할 때 호출
<br>
``` swift
func sceneWillResignActive(_ scene: UIScene)
```
- Scene이 비활성화되고 Scene이 사용자 이벤트에 대한 응답을 중지하기 직전에 호출
<br>
``` swift
func sceneWillEnterForeground(_ scene: UIScene)
```
- Scene이 전면에서 실행되기 시작하고 사용자에게 표시되기 직전에 호출
<br>
``` swift
func sceneDidEnterBackground(_ scene: UIScene)
```
- Scene이 백그라운드로 돌아가고 화면에서는 표시되지 않을때 호출
- UISceneDidEnterBackgroundNotification 이벤트가 발생하면 호출된다.