1. CoreData의 각 Entity, Attribute, Relationship의 역할을 아는 대로 설명해주세요.
내가 만든 CoreData 자료
CoreData는 Swift에서 제공되는 프레임워크로, 데이터를 유지,캐시를 할수있으며, 추가적으로 ClouldKit를 사용해서 여러장치에서 데이터를 동기화할수 있게 해주는 프레임워크입니다. 저 또한 처음에는 CoreData에서 제공되는 Persistence (영속성) 때문에 데이터베이스와 헷갈렸지만, 영속성은 Coredata 프레임워크에서 제공되는 하나의 기능일뿐, CoreData는 데이터를 객체로 다루며, 정규화된 데이터 사이의 참조 관계를 바탕으로 한쪽 객체에서 발생한 변경 내용을 다른 쪽 객체에도 전파하는 등 객체 간 관계의 일관성을 우지하는 객체 그래프 관리자의 역할을 하는 프레임워크입니다.
- CoraData Stack은 크게 5개의 요소로 구성이 되어 있습니다. 데이터를 저장하기 위해 생성되는 인스턴스, 관리 객체, 관리 객체를 담거나 생성, 삭제하고 영구 저장소의 대한 관리라는 하는 관리 객체 컨텍스트, 관리 객체 컨텍스트와 직접 데이터를 주고 받으면서 영구 저장소들의 접근을 조정하고 입출력을 담당하는 영구 저장소 코디네이터, 실제로 데이터가 저장되는 영구 객체 저장소, 그리고 마지막으로 Entity,Attribute,Relationship이 정의되는 관리 객체 모델이 있습니다.
- 엔티티는 데이터가 저장될 구조 또는 형식으로, 관계형 데이터베이스에서 테이블이랑 같은 개념입니다. Entity안에 Attribute, Relationship이 정의됩니다. Attribute는 엔티티 하위 속성들을 정의하는 역할이고, Relationship은 다른 Entity와 관계를 정의하는 역할을 합니다.
- Attribute는 문자열, 날짜, 정수 등의 값을 정의할 수 있습니다. Relationship이 저는 이해하는데 조금 어려웠던것 같습니다. 데이터베이스에서의 조인을 생각했지만, 데이터베이스에서의 조인은 양쪽 테이블을 연결하고 필요한 칼럼을 가져오는 방식이라면, Relationship같은 경우에는 Entity를 직접 참조함으로서 모든 데이터를 받아옵니다. 참조하는 형식이다 보니깐 순환참조의 오류가 발생할 수 있기 때문에, 참조 타입, To one, To Many 등등을 고려해야합니다. 또한 데이터베이스와 다르게 Relationship은 방향성을 가지게 되기 때문에 구현할때 고려를 해야합니다.
- 저는 코어데이터를 비교적 쉽게 이해하기 위해서 제가 기존에 배웠던 객체 프로그래밍과 연결해서 비교적 쉽게 이해할 수 있도록 했습니다. 관리 객체 모델은 BluePrint 역할을 하는 Class라고 생각하고, Attribute는 Class안에 있는 프로퍼티, 메서드라고 생각하고, Relationship은 다른 클래스 참조하는 역할로 생각하고, 마지막으로 관리 객체는 Class Instance로 생각했습니다.
2. 앱 화면의 콘텐츠를 표시하는 로직과 관리를 담당하는 객체가 무엇인지 아는 대로 설명해주세요.
ViewController 공부
- UIView 클래스는 앱 화면의 콘텐츠를 표시하는 하고 요소라고 정의합니다. UIView는 우리가 사용하는 대부분은 UIComponent의 부모 클래스로, 예를 들어서, UIImageView,UILabel 등등 전부 UIView의 자식 클래스로 구현되어 있습니다. UIView를 관리를 담당하는 객체는 UIVIewController입니다. UIViewController는 UIView의 변화를 업데이트 하고, 해당 View에서 일어나는 사용자 상호작용의 대한 응답 및 처리를 담당하고, View를 리사이징 및 전체적인 인터페이스의 레이아웃을 관리합니다.
- 이 부분을 공부하면서 우리가 실제로 코딩하면서도 알게모르게 관리를 당하고(?) 있다 라는걸 알게 되었습니다. UIButton을 생성하더라도, UIButton도 마찬가지로 UIView를 상속받고 있으며, 만약에 IBAction을 추가해서 Button이 눌렷을때 어떤 동작하는것을 구현했다고 한다면, 사용자가 버튼을 눌렀을때, 해당 신호를 감지하는것은 UIButton, 즉 상호작용이 일어난 객체이구, 해당 객체가 눌럿다는것을 ViewController에서 인지하고 IBaction에서 구현되어 있는 코드를 실행하는것을 직접적으로 생각을 하지않았었지만, 이제는 정확히 콘텐츠를 표시하는 로직과 담당하는 객체가 나눠져있다는것을 인지하게 되었습니다.
3. 앱의 콘텐츠나 데이터 자체를 내부 저장/보관하는 특별한 객체로는 무엇이 있는지 아는 대로 설명해주세요.
내부저장소 공부
- Swift에서 기본적으로 제공되는 것은 총 4개라고 생각합니다.
- UserDefaults는 간단한 Key-Value 데이터를 저장하는데 사용됩니다. 앱이 실행되는 동안 내부 저장소에 접근해서 데이터를 기록하거나 가져옵니다. 다만 UserDefault는 간단한 데이터, 예를 들면 사용자 로그인 여부 확인, 다크모드 라이트모드 여부 확인, 이러한 데이터들만 저장하는게 대부분의 경우이다. 그 주된 이유는 기본적으로 암호화가 되지 않기 때문입니다.
- CoreData는 데이터베이스가 아니라 프레임워크이지만, 기본으로 제공되는 기능중에 데이터베이스의 기능중 하나인 데이터 저장 및 읽기 기능이 제공되기 떄문에, 데이터를 내부 저장/보관하는 프레임워크로 사용됩니다.
- KeyChain은 Swift에서 제공되는 데이터를 암호화해서 보관하는 공간이다. 다만 Keychain은 일반적인 데이터보다는 암호화가 제공되기 때문에, 비밀번호, 인증서 등 보안이 요구되는 데이터를 저장하는 공간으로 사용한다. 일반적인 데이터 저장소와는 사용하는 목적과 보안수준이 다르기 때문에 주의해야 한다.
- FileManager도 swift에서 내부 파일 시스템에 파일을 생성, 수정을 할 수 있습니다. 본 목적이 파일 저장이라기 보다는 Manage하는게 맞지만, 데이터를 내부적으로 생성을 할 수도 있습니다. 외부 데이터베이스 라이브러리도 filemanager를 이용해서 파일 시스템에 데이터베이스 파일을 저장하는 경우도 있습니다.
- 많이 사용되는 외부 라이브러리로는 Realm이 있습니다.
- Realm은 무료로 제공되는 데이터베이스 이며, CoreData보다 작업 속도가 빠릅니다. Realm이 많이 사용되는 이유 중 하나는 Cross Platform을 지원해서 안드로이드에서도 같은 DB파일을 공유할 수 있습니다. 저도 한번 써봤는데, 객체지향 데이터 모델을 활용하기 때문에 기본 객체로 작업할 수 있다는게 저한테는 큰 장점으로 와닿았습니다.
4. URLSession에 대해서 아는대로 설명해주세요.
네트워킹 공부
- URLSession은 Swift에서 제공되는 클래스로 URL에 표현되는 엔드포인트의 데이터를 받아오거나, 업로드를 할 수 있게 하는 기능을 제공합니다. URLSession을 설명하기 위해서는 URL Loading System의 대해서도 이해를 하고 있어야합니다.
- URL Loading System은 표준 인터넷 프로토콜 (Https 같은) 을 사용하여 서버와 통신하고 URLs와 사용작용하는 시스템입니다. URL Loading System은 비동기적으로 진행하는 특징을 갖고 있으며, 비동기적으로 실행하기 때문에 데이터를 받아오는 중간에도 다른 작업을 동시에 수행할 수 있으며, swift에서는 메인 쓰레드 즉 화면을 그리는 작업의 영향을 주지 않을수 있습니다. URLSession 클래스는 URL Loading System이 가능하게끔 합니다.
- 하나의 URLSession은 여러개의 URLSessionTask의 인스턴스르 만들수 있으며, URLSessionTask는 각각의 작업 (데이터 Fetch, 업로드 등)을 할수 있습니다.
- URLSession의 기본 설정을 변경하는 객체는 URLSessionConfiguration입니다,timeout 값, Caching 정책, Connection Requirement 등등을 URLSessionConfiguration에서 구성할 수 있습니다.
- URLSession을 공부할때 처음에는 다른 사람의 코드를 참고하면서 구현을 했는데, URLSession.shared 객체를 항상 만들었습니다. 여기서 Shared Session은 어떤 개체일까 고민을 하게 되었습니다. 앞서 설명드린 URLSessionConfiguration에서 옵션을 변경할 수 있다고 했지만, Shared Session은 기본적으로 따로 Configuration을 하지 않아도 네트워크 요청을 할 수 있습니다. 하지 않아도 좋다고 하면 좋은거지만, 반대로는 개발자가 원하는대로 완벽하게 맞출수는 없다는 말이기도 합니다. 따라서 Shared Session 이외에 .default session, .ephemeral session, .background session이 제공됩니다.
- 그리고 또 항상 session.dataTask를 사용해서 데이터를 받아왔습니다. URLSessionDataTask는 기본적인 데이터를 받을 때 사용됩니다. 리로스를 요청하고 서버에서의 응답을 메모리상에서 처리하게 됩니다. 해당 task는 .background session에서도는 지원하지 않습니다. URLSessionUploadTask는 말그대로 업로드를 위한 task객체이며, reqeust body를 쉽게 제공하고, .background session에서도 지원합니다. URLSesionDownloadTask도 URLSessionUploadTask는 마찬가지로 .background session에서 제공되지만, 파일로 직접 다운로드 할때 사용하는 task입니다.
- Background session에서는 URLSessionDataTask를 사용할 수 없는 이유는 Foreground 작업과 Background 작업에 있어서 시스템 리소스, 네트워크 연결 상태 등의 제약사항이 있기 때문입니다, 또한 Foreground 작업은 주로 사용자 상호작용 및 UI 업데이트 등 작업을 하는 반면, 백그라운드에서는 데이터 다운로드 및 업로드 등 후속 작업을 수행하기 때문에, swift에서는 forGround 및 background 작업을 나누기 위해서 다른 task이 존재하는걸로 이해했습니다.