-
210429 - TILTIL/2021 2021. 4. 30. 03:11
CoreData
계속 Coredata에 대해서 공부 중이다.
계속 정보를 가져올때 network에 요청을 보낼 수 없으니 꼭 필요한 부분이다.
오늘 공부한 내용은 entity들의 관계와 data를 가져올 때 즉 fetch 할 때 정렬하고 async로 실행하는 방법에 대해서 공부했다.
Entity Hierarchy
- Class의 상속을 생각하면 된다.
- Abstract Entity는 Abstarct class와 같은 개념이다.
- Instance를 생성하지 못하게 된다.
- Paent Entity를 지정해주면 끝!
- 그럼 attribute가 상속된다.
Entity Relationship
- Realtionships에서 작성하면 된다.
- 두개의 Entity를 연결해주는 역할을 한다.
- To - One Relationship
- 1:1 대응
- 이름을 단수로 설정
- To - Many Relationship
- 1:다 연결
- 이름을 복수로 설정
- Array가 아닌 Set
- Delete rule
- 삭제할 때 같이 삭제할 것인지 아닌지
- Deny
- 하나라도 남아있으면 삭제가 안된다.
- Nullify
- 소스가 삭제되면 연결된 attribute만 삭제된다.
- Cascade
- 삭제할때 같이 삭제된다.
- Inverse를 적용하면 양방향 연결이 된다.
- 기본으로 제공되는 CRUD 메서드가 있다.
- 확인해보고 싶다면 Create NSManagedObject Subclass로 확인해보면 된다.
Fetch Request
- 저장소의 데이터를 직접 가져오지 않고 대부분 context에게 요청한다.
- request를 만드는 3가지 방법
- 두 방법은 NSFetchRequest<T> 생성자를 이용한다.
- 빈 생성자로 만드는 방법
- 이건 entity를 직접 만들고 request.entity 속성에 entity를 넣어하는데 entity를 직접 만드는 게 귀찮다.
- (entityName:) 생성자 이용하기
- entity를 생성안해도 되지만
- String으로 entityName 오타가 날 수 있어서 위험하다.
- EntityClass에서 자동으로 생성되는 fetchRequest()를 이용한다.
- context의 fetch(_:) 메서드로 data를 가져올 수 있다.
NSSortDescriptor
- Fetch 할 때 정렬 방식을 지정할 수 있다.
- Request의 sortDescriptors 속성에 할당하면 된다.
- 배열이므로 []로 전달해야한다.
ResultType
- 결과를 4가지 중 하나로 return 해준다.
- request.resultType에서 지정할 수 있다.
- 지정하지 않으면 ManagedObject로 return
- countResultType은 count만 return
- managedObject로 return한다음 count를 센다면 아주 비효율 적이다.
- countResultType으로 하면 숫자만 리턴하므로 아주 효율적이다.
- dictionaryResultType은 특정 attribute만 가져올 때 사용한다.
- propertyToFetch를 이용하면 특정 attribute를 배열로 지정한다.
- managedObjectIDResultType
- 다른 context로 managedObject를 주고받을 때 주로 사용한다.
Paging, Scrolling
- fetchLimit
- 가져오는 데이터의 수를 결정한다.
- Top10과 같은데에서 사용하면 좋다.
- fetchOffset
- 리턴하는 data의 index를 설정한다.
- 0이 기본값
- 1이면 0은 제외하고 1부터 가져오는 것
- fetchBatchSize
- 전체 데이터중에 정해진 size만큼 가져오고 더 필요하다면 또 가져온다.
- 전체 데이터수를 확인하고 지정된 데이터 숫자만큼 가져온다
- 성능이 더 좋아지므로 사용하면 좋다.
AsyncFetchRequest
- 지금까지 동기로 가져오는 거였고 비동기로 가져올 수 도 있다.
- NSAsynchronousFetchRequest<T>로 만든다.
- 기존에 있던 request를 이용해서 비동기로 실행하는 거다.
- 그래서 생성자를 보면 request를 전달해야 한다.
- completion에 parameter는 NSAsynchronousFetchResult<T>로 finalResult 속성에 배열로 결과가 담겨있다.
- 주의점은 context의 excute(request:)를 직접 호출해줘야 한다.
MainContext가 아닌 BackgroundContext를 사용하는 방법
- 지금까지 mainContext를 사용했는데 이는 mainThread에서 실행돼서 mainContext였다.
DataModel에서 FetchRequest를 만드는 방법
- 지금까지 fetchRequest instance를 직접 생성했다.
- Add Entity 아이콘을 꾹 누르면 추가 옵션이 나오고 AddFetchRequest를 클릭한다.
- Request 이름을 만들어주고 entity를 선택해준다.
- filter기능도 있다.
- +를 누르면 attribute에 따라 filter를 설정할 수 있다.
- ResultType, FetchLimit, BatchSize도 설정이 가능하다.
- Predicate도 지정할 수 있다.
- 이렇게 생성한 request를 가져오려면 Model을 가져와야 한다.
- context.container.managedObjectModel 속성을 통해서 가져와야 한다.
- 그리고 model의 4가지 속성이 있다.
- fetchRequestTemplate(forName:)을 이용하면 이름으로 가져올 수 있지만 오타에 주의해야 한다.
- 단점은 model을 수정할 수 없다.
- 정렬은 코드로 직접 추가시켜야 한다.
- 이때 crash를 조심해야 한다.
- fetchRequestTemplate(forName:)로 request의 copy를 생성하고 정렬을 추가시켜야 한다.
Fetched Property
- 지금 딱히 필요없을거 같아서 다음에 공부하도록 하자…
Entity Instance 삭제하는 방법
로그아웃을 할 때 저장된 데이터들을 삭제해야 하는데 어떻게 하면 쉽게 지울 수 있을까??
NSBatchDeleteRequest를 이용하면 쉽게 지울수 있는 거 같다.
마찬가지로 fetchRequest를 이용해야 해서 이름에 오타가 날 수 있으니 enum으로 만들어두고 삭제하는 방법을 택했다.
stackoverflow.com/questions/1383598/core-data-quickest-way-to-delete-all-instances-of-an-entity
Core Data: Quickest way to delete all instances of an entity
I'm using Core Data to locally persist results from a Web Services call. The web service returns the full object model for, let's say, "Cars" - could be about 2000 of them (and I can't make the Web
stackoverflow.com
DTO와 VO
밥 먹으면서 유튜브를 보는데 영상이 있어서 보게 됐다.
마침 내가 서버 -> 클라이언트로 데이터를 보낼 때 원본 데이터보다 필요한 정보만 담은 DTO를 보내기 때문에 궁금해서 보게 됐다.
면접 준비 정보
저번에 봤던 코딩 테스트 준비 테크 캐스트를 유용하게 봤는데 새로운 테크 캐스트가 올라왔길래 시청했다.
yagom.net/courses/tech-cast-2/
[TechCast] 개발자 면접노하우 - 야곰닷넷
개발자 면접노하우 멋진 기업에서 개발자로 활약하고 있는 멋쟁이 선배들이 들려주는 이야기를 들어봅니다. 면접을 준비하면서 가장 […]
yagom.net
728x90'TIL > 2021' 카테고리의 다른 글
210502 - TIL (0) 2021.05.03 210430 - TIL (0) 2021.05.01 210427 - TIL (0) 2021.04.28 210426 - TIL (0) 2021.04.28 210425 - TIL (0) 2021.04.26