일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- combine
- Clean Code
- Protocol
- SWIFT
- swiftUI
- 스위프트
- 리펙토링
- collectionview
- Xcode
- ios
- HIG
- 리펙터링
- 클린 코드
- 리팩토링
- rxswift
- clean architecture
- 애니메이션
- uiscrollview
- UICollectionView
- Refactoring
- RxCocoa
- MVVM
- Observable
- uitableview
- Human interface guide
- tableView
- swift documentation
- UITextView
- map
- ribs
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 12. 코어 데이터(Core Data)의 개념 - (2) 본문
기초 개념은 다음 링크 참조 : 11. 코어 데이터(Core Data)의 개념 - (1)
1. MO모델을 위한 엔터티 설정
1) 엔터티(데이터 저장 구조) 정의 : 레코드 단위의 데이터를 관리객체(Managed Object)로 만들기 위한 기본 모델 역할 담당
* AppDelegate.swfit에 코드가 추가된것을 확인
* 추가된 핵심 코드
(1) 추가된 xcdatamodeld파일을 코어 데이터 시스템에 등록, NSPersistentContent객체 생성하는 역할
※ 프로젝트 이름이 변경된다면 이 부분을 수정해야함
let container = NSPersistentContainer(name: "CoreDataTest")
(2) 컨텍스트 객체(데이터를 읽고 쓸 때 필요한 객체)를 참조하는 부분
let context = persistentContainer.viewContext
창 하단 탭에서 Add Entity선택 -> 추가된 엔터티 선택 -> 엔터티명 수정
2) 어트리뷰트 생성(엔터티의 하위속성들을 정의하는 역할)
앤터티 선택 -> Attributes에서 "+"버튼으로 추가
3) 릴레이션(엔터티끼리의 관계) 기입
4) 클래스명 설정
(엔터티와 클래스의 차이: 엔터티는 데이터 저장 구조를 나타내며, 이것을 통해 "데이터 모델 클래스"정의 )
엔터티 이름이 Employee라면, 클래스 이름을 EmployeeMO라함(접미사 "MO")
5) 엔터티의 상속과 추상 엔터티
엔터티는 클래스처럼 상속 기능이 존재
* 위 그림에서 "Abstract Entity"를 체크한다면 추상 엔터티로 지정 가능
(추상엔터티 : 인스턴스 생성 불가, 단순 상속 용도)
2. 어트리뷰트 정의
1) 어트리뷰트 명명 규칙
- 대소문자를 구분하지만 대문자로 시작 불가
2) 도메인(Domain) : 특정 속성이 가질 수 있는 값의 범위
3. 릴레이션 정의
1) 참조방식
데이터베이스에서의 "조인"은 정규화된 공통 칼럼을 이용하여 양쪽의 테이블을 연결하고 필요한 칼럼을 가져오는 방식이지만,
"릴레이션"은 다른 쪽 엔터티를 직접 참조함으로 해당 데이터를 모두 반입하는 방식
* 데이터베이스의 조인("사원"테이블과 "부서"테이블을 사원코드를 통해 조인)
사원명 | 사원코드 | 부서명 | 근무지 |
김길동 | 20001 | 개발팀 | 301호 |
이하늘 | 20007 | 인사팀 | 302호 |
* 릴레이션에서의 참조(사원 릴레이션이 부서 엔터티를 참조)
사원명 | 사원코드 | 부서 |
김길동 | 20001 | 부서명 근무지 개발팀 301호 |
이하늘 | 20007 | 부서명 근무지 인사팀 302호 |
2) 릴레이션의 데이터 관계
1 : 1 엔터티 A의 레코드 하나와 엔터티 B의 레코드 하나가 서로 참조하는 형태
1 : M 엔터티 A의 레커드 하나와 엔터티 B의 레코드 여러 개가 서로 참조하는 형태
M : N 엔터티 A의 레코드 여러 개와 엔터티 B의 레코드 여러 개가 서로 참조하는 형태 (==양쪽 모두 1:M관계)
* 릴레이션의 참조는 엔터티를 기준으로 방향성을 갖음
- 일반참조 : 엔터티 A가 B를 참조
- 역참조 : 엔터티 B가 A참조
ex) 사원 엔터티에서 부서 엔터티로의 참조 = 1:1 (한명의 사원은 한 부서에만 속하므로)
부서 엔터티에서 사원 엔터티로의 참조 = 1:M(한 부서에는 여러명의 사원이 속할 수 있으므로)
* 1:M 관계를 표현하려면 "To Many"속성으로 변경
3) 옵셔널 설정
- 참조 대상에서 nil이 올 수 있는 대상이 있을 때 체크
4) Inverse항목 설정
- 두 개의 엔터티가 상호 참조하는 경우 순환 참조의 오류를 방지하기 위해 사용 (위 그림에서 Inverse항목 확인)
(상대방 릴레이션과 서로 역참조 관계라는 것을 알림)
5) Delete Rule
- 참조 대상 엔터티의 레코드가 삭제되었을 경우 이를 참조하고 있는 엔터티의 레코드를 어떻게 할 것인가를 결정
*옵션
Nullify | 참조 대상이 삭제되면 nil 값으로 처리하도록 하는 옵션 |
Cascade | 참조 대상이 삭제되면 이를 참조하고 있던 모든 레코드를 같이 삭제 |
Deny | 참조하고 있는 엔터티가 있을 경우 참조 대상을 삭제하지 못하도록 설정 |
4. 데이터 모델 클래스
1) Codegen속성 선택 : Class Definition(코어 데이터가 자동으로 생성되게끔)
2) 생성 : .xcdatamodeled 파일 선택 -> 상단 "Editor"탭 선택 -> "Create NSManagedObject Subclass"선택
단, 우측에서 "Class"의 Name(EmployeeMO)를 먼저 설정
cf) CoreData 프로토콜과 in-memory 개념까지 적용한 설계 방법: https://ios-development.tistory.com/236
'iOS 실전 (swift) > 데이터베이스' 카테고리의 다른 글
[iOS - swift] 14. UISearchBar와 NSPredicate(코어데이터 조건문) - (4) (0) | 2020.05.20 |
---|---|
[iOS - swift] 13. 코어 데이터(Core Data)의 개념(실습) - (3) (0) | 2020.05.19 |
[iOS - swift] 12. 코어 데이터(Core Data)의 개념 - (1) (0) | 2020.05.13 |
[iOS - swift] 11. FMDB 데이터베이스 (실습) (0) | 2020.05.10 |
[iOS - swift] 10. FMDB 데이터베이스 (기본) (0) | 2020.05.09 |