스토리 보드로 UI 디자인과 함께 코어데이타를 바인딩해서 최소한의 코드로 코어데이타를 구현하는 예제 입니다.
코어데이타 (Core Data)
데이타를 저장하고 관리할 수 있는 기능을 구현하려면 데이타베이스 연동은 필수 입니다. 아이폰 또는 맥용 앱 개발할때 간편하게 코어데이타를 사용할 수 있습니다. 특히 스토리보드 바인딩을 사용해서 최소한의 코드로 데이터베이스 서비스를 구축할 수 있습니다. 코어데이타는 애플의 아이클라우드 기능을 사용 가능하기 때문에 다중기기와 쉽게 연동이 가능합니다. 아이폰과 아이패드, 맥 각각의 앱과 공유하는 데이타베이스를 사용할 수 있다는 이야기 입니다. 단, 다중기기는 연동이 되지만 다중 사용자와 공유할 수 없기 때문에 개인사용자를 위한 데이타베이스로 사용이 제한되어 있습니다.
1. Xcode 실행 및 새 프로젝트 생성하기
Xcode 를 실행합니다.
새 프로젝트를 생성하고 템플릿을 선택합니다.
1. 메뉴 FIle → New → Project...
2. macOS → App 선택
프로젝트 생성 옵션을 설정합니다.
Product Name: CoreDataTest
Interface: Storyboard
Language: Swift
☑️ Use Core Data 체크
2. 코어데이타 모델 생성하기
데이터 모델을 생성합니다.
➊ CoreDataTest 데이타 모델 선택
➋ Add Entity 클릭
➌ 엔티티 이름 Data 로 변경
➍ 속성 추가 클릭
➎ 속성 이름 name, 타입은 String 으로 설정
데이타 모델 서브 클래스 파일 생성
➊ Data 엔티티 선택
➋ Codegen: Manual/None
➌ 메뉴 Editor → Create NSManagedObject Subclass.. 선택
Next
Next
➍ 서브 클래스 파일 생성 확인
3. ViewController 코드추가
ViewController 에 코드를 추가합니다.
➊ ViewController 선택
➋ 아래 코드 둘중 하나를 추가해 줍니다
[코드 1]
@objc let managedObjectContext: NSManagedObjectContext
required init?(coder: NSCoder) {
self.managedObjectContext = (NSApp.delegate as! AppDelegate).persistentContainer.viewContext
super.init(coder: coder)
}
[코드 2]
@objc dynamic var managedObjectContext: NSManagedObjectContext!
override func viewDidLoad() {
super.viewDidLoad()
self.managedObjectContext = (NSApp.delegate as! AppDelegate).persistentContainer.viewContext
}
4. 스토리보드 작업하기
스토리보드 UI 를 추가 합니다.
⓪ 왼쪽 프로젝트 네비게이터에서 Main 선택 (깜빡 했네요^^)
➊ 라이브러리 추가 버튼
➋ TableView 추가
➌ Push Button 추가
➍ Array Controller 추가
라이브러리 추가시 드래그 앤 드롭으로 해당 UI 를 잡아다 끌어서 추가할 수 있습니다
Array Controller 속성 인스펙터 설정
➊ Array Controller 선택
➋ 속성 인스펙터 선택
➌ Mode : Entity Name
Entity Name: Data
☑️ Prepares Content 체크
Prepares Content 로 데이타베이스의 데이타를 Arrray Controller 에 자동으로 불러옵니다.
Array Controller 커넥션 인스펙터 설정
➊ Array Controller 선택
➋ 커넥션 인스펙터 선택
➌ Control 누른 상태에서 add: 액션 ➕ 버튼으로 드래그 앤 드롭
➍ Control 누른 상태에서 remove: 액션 ➖ 버튼으로 드래그 앤 드롭
Array Controller 바인딩 인스펙터 설정
➊ Array Controller 선택
➋ 바인딩 인스펙터 선택
➌ ☑️ Bind to View Controller
Model Key Path: self.managedObjectContext
모델 키패스의 self.manageObjectContext 는 ViewController 파일에 self.manageObjectContext 와 연결됩니다.
Table View 속성 인스펙터 설정
➊ Table View 선택
➋ Columns: 1
Table View Column 바인딩 인스펙터 설정
➊ Table Column 선택
➋ 바인딩 인스펙터 선택
➌ ☑️ Bind to Array Controller
Controller Key: arrangedObjects
Table View Cell 속성 인스펙터 설정
➊ Table View Cell 선택
➋ 속성 인스펙터 선택
➌ Behavior: Editable
Table View Cell 바인딩 인스펙터 설정
➊ Table View Cell 선택
➋ 바인딩 인스펙터 선택
➌ ☑️ Bind to Table Cell View
Model Key Path: objectValue.name
5. 앱 실행 및 테스트
앱 실행
▶️ 버튼은 실행
◼︎ 버튼은 종료
앱 실행 및 테스트
➕ 버튼 : 데이타 추가
➖ 버튼 : 데이타를 삭제
추가된 항목을 더블클릭하면 이름을 수정할 수 있습니다.
⚠️ 데이타 저장이 안된다면?
앱을 ◼︎정지하고 다시 ▶️실행하면 기존에 추가한 데이타가 저장되지 않고 날라가 버립니다. 메뉴에서 CoreDataTest → Quit CoreDataTest 로 앱을 종료하면 저장은 되지만 앱을 종료하지 않고 명시적으로 저장하는 버튼을 따로 만들어 보겠습니다.
# [예제] 저장버튼 추가하기
데이타 저장하는 메뉴 추가하기
➊ 메뉴 File 클릭
➋ 라이브러리 선택
➌ Menu Item 추가
➍ 속성 인스펙터 선택
➎ Title: Save Data
First Responder 바인딩
➊ First Responder 클릭
➋ 바인딩 인스펙터 선택
➌ saveAction: 드래그 드롭 으로 Save Data 메뉴에 바인딩
데이타 저장 테스트
1. 앱을 ▶️실행하고 데이타를 추가합니다.
2. 메뉴 → File → Save Data 를 클릭합니다.
3. 앱을 ◼︎종료하고 다시 ▶️실행하면 이전에 추가한 데이타를 확인 할 수 있습니다.
# [예제] 엔티티 속성 추가하기
엔티티 속성 추가하기
➊ CoreDataTest 데이타 모델 선택
➋ Data 엔티티 선택
➌ 속성 추가 클릭
➍ 속성 이름 point, 타입은 Interger64 로 설정
데이타 모델 서브 클래스 파일 업데이트
➊ Data 엔티티 선택
➋ Codegen: Manual/None
➌ 메뉴 Editor → Create NSManagedObject Subclass.. 선택
서브 클래스 파일 업데이트 확인
➊ Data+CoreDataProperties 선택
➋ point 변수 추가된것 확인
테이블뷰와 라벨 추가하기
➊ Main 스토리보드 선택
➋ Table View 선택
➌ Columns: 2
➍ 라이브러리 추가
➎ Label 2개, Pupup Button 1개 추가
첫번째 라벨 바인딩
➊ 첫번재 라벨 선택
➋ 바인딩 인스펙터 선택
➌ ☑️ Bind to Array Controller
Controller Key: selection
Model Key Path: name
두번째 라벨 바인딩
➊ 두번재 라벨 선택
➋ 바인딩 인스펙터 선택
➌ ☑️ Bind to Array Controller
Controller Key: arrangedObject
Model Key Path: @sum.point
팝업 버튼 바인딩
➊ 팝업 버튼 선택
➋ 바인딩 인스펙터 선택
➌ ☑️ Bind to Array Controller
Controller Key: arrangedObject
Model Key Path: name
Table Column 바인딩
➊ 추가된 Table Column 선택
➋ 바인딩 인스펙터 선택
➌ ☑️ Bind to Array Controller
Controller Key: arrangedObjects
Table View Cell 바인딩
➊ Table View Cell 선택
➋ 바인딩 인스펙터 선택
➌ ☑️ Bind to Table Cell View
Model Key Path: objectValue.point
Table View Cell 속성 수정하기
➊ Table View Cell 선택
➋ 속성 인스펙터 선택
➌ Behavior: Editable
Number Formatter 추가
➊ 라이브러리 추가
➋ Number Formatter 검색
➌ 표시 위치로 추가
Number Formatter 설정
➊ Number Formatter 선택
➋ 속성 인스펙터 선택
➌ Style: Decimal
앱 실행 및 테스트
▷ 첫번째 라벨은 선택된 Data 의 name 을 표시합니다.
▷ 두번째 라벨은 모든 Data 의 point 합계를 표시합니다.
▷ 팝업 버튼은 테이블과 같이 Data 의 name 리스트를 표시합니다.
테이블에 데이타를 수정하면 실시간으로 바인딩된 라벨과 팝업버튼의 값도 변합니다.
# [예제] 이미지, 바이너리 데이타 속성 추가하기
엔티티 속성 추가
➊ CoreDataTest 데이타 모델 선택
➋ Data → MyData 엔티티 이름 변경
➌ 속성 content 추가, 타입은 Binery Data 설정
속성 image 추가, 타입은 Transformable 설정
➍ 기존 Data+CoreDataClass, Data+CoreDataProperties 파일 삭제
메뉴 Editor → Create NSManagedObject Subclass.. 로 변경된 이름의 Subclass 파일 추가
⚠️ 엔티티 Data 의 이름을 변경하는 이유 : Binery Data 가 Swift 에서 타입 이름이 Data 로 엔티티 이름과 겹치기 문제로 에러가 발생합니다. 그렇기 때문에 엔티티 이름을 MyData 로 변경해 주었습니다.
Array Controller 엔티티 이름 변경
➊ Main 스토리보드 선택
➋ Array Controller 선택
➌ 속성 인스펙터 선택
➍ Entity Name: MyData
이미지 뷰와 텍스트 뷰 추가하기
➊ Main 스토리보드 선택
➋ 라이브러리 추가
➌ Image Well 추가
➍ Scrollable Text View 추가
Image Well 속성 수정하기
➊ Image Well 선택
➋ 속성 인스펙터 선택
➌ ☑️ Editable 체크
Image Well 바인딩
➊ Image Well 선택
➋ 바인딩 인스펙터 선택
➌ ☑️ Bind to Array Controller
Controller Key: selection
Model Key Path: image
Text View 속성 수정하기
➊ Text View 선택
➋ 속성 인스펙터 선택
➌ ☑️ Rich Text 체크
Text View 바인딩
➊ Text View 선택
➋ 바인딩 인스펙터 선택
➌ ☑️ Bind to Array Controller
Controller Key: selection
Model Key Path: content
앱 실행 및 테스트
▷ Image Well 에 이미지 파일을 드래그 앤 드롭으로 추가할 수 있습니다.
▷ Text View 에 있는 content 는 일반 텍스트가 아닌 Attributed Text 로 속성을 갖는 특징 때문에 바이너리 데이타 타입으로 저장합니다. Attributed Text 는 텍스트 칼라나 볼드체 등의 표현이 가능합니다.
댓글