Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
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
Tags
more
Archives
Today
Total
관리 메뉴

iOS 개발일지

0822 새싹 35회차 정리 - Realm 본문

SeSAC iOS 데뷔과정 2기

0822 새싹 35회차 정리 - Realm

Lia's iOS 2022. 8. 23. 01:00
iOS 앱 개발자 데뷔 과정 35회차

 

 

 

 

#0. Memo

- Realm Table 설계

1. Schema 설정

[MongoDB Documentation] 참고

테이블과 컬럼의 구조를 설계하고, 저장될 데이터의 타입과 옵셔널 여부에 대한 특성을 각 컬럼에 부여한다.

컬럼 중 하나를 Primary Key로 설정하며 보통 ID에 대한 컬럼을 별도로 지정한다. 2번 사진 참고

 

2. Schema에 맞게 Realm Model 설계

RealmModel

 

3. Primary Key 설정

별도 (String, Int) 로 설정하거나, UUID / Object를 사용할 수 있다. 2번 사진 참고

 

 

 

- Realm Create

1. import RealmSwift

No Such Module 에러가 발생할 경우, 빌드하면 해결된다.

HomeViewController

 

2. Realm 파일에 접근하는 상수 선언

렘 테이블에 내용을 추가, 수정, 삭제 등을 할 때 렘 테이블 경로에 접근하기 위해 필요하다.

즉, iOS Document Folder 내 default.realm 의 위치를 찾는 코드이다.

HomeViewController

 

3. Realm에 데이터 저장

기능을 확인하기 위한 코드로, 예외처리와 옵셔널 바인딩 등이 모두 생략되어 있다.

WriteViewController

 

- Realm Read

1. import RealmSwift - 위와 동일

2. Realm 파일에 접근하는 상수 선언 - 위와 동일

 

3. Realm에서 읽어온 데이터를 담을 배열 선언

Realm의 데이터 중 원하는 내용을 필터, 정렬에 가져올 데이터를 보관할 공간을 생성한다.

Realm의 테이블을 직접 수정하지 않고, 데이터만 가져와서 화면에 사용하는 구조이다.

HomeViewController

 

4. 배열에 Realm의 데이터 초기화

Realm에서 데이터를 가져오면 데이터의 순서가 보장되지 않는다.

일관적인 데이터 정렬 유지를 위해 데이터를 가져올 때 특정 컬럼 기준으로 정렬해서 가져오는 것이 사용자의 UX에 좋다.

일기를 등록하고 다시 돌아왔을 때 재정렬/리로드를 위해 viewWillAppear에 작성한다.

HomeViewController

 

5. 테이블뷰에 데이터 표현

HomeViewController

 

 

 

 

#1. Checklist

- DB

Database : Raw Data가 방대한 양으로 이루어져 있고, 효율적으로 저장된 집합체

도서관 시스템, 사원 관리, 고객 관리 등이 모두 이에 해당한다.

 

 

 

- DBMS

Database Management System : DB를 쉽게 만들고 관리하는 여러 프로그램들이 모여 하나의 시스템으로 갖춰진 프로그램

대부분의 DB들이 DBMS를 통해 만들어지고 운영되기 때문에 의미를 혼용해서 사용하기도 한다.

계층형, 관계형, 객체관계형, NoSQL등 종류가 다양하며, 가장 많이 사용되는 것이 관계형 데이터베이스 (RDB) 이다.

 

 

 

- RDBMS

관계형 데이터베이스를 생성, 수정, 관리할 수 있는 소프트웨어

아래와 같은 특징을 가지고 있다.

 

* 명확한 데이터 구조

테이블 - 칼럼 형태로 데이터를 저장하며, 테이블과 테이블간의 연관 관계 (FK) 를 이용해 필요한 정보를 구현한다.

중복 데이터 저장 방지를 위해 정규화를 하기 때문에 데이터의 독립성이 높다.

 

* 비용과 시스템 복잡성

Oracle 등을 사용할 경우 비용적 부담 가능성이 높아진다.

시스템이 복잡해질수록 Query문이 복잡해지고 성능 저하가 일어날 수 있다.

 

* 수직적 확장 가능

수평적 확장이 어려워, 수직적 확장을 하나 한계에 직면할 수 있다.

 

 

 

- Schema

DB의 구조와 데이터들이 갖는 제약 조건에 관해 전반적 명세를 기술한 것

 

 

 

- Column ( = Attribute)

테이블을 구성하는 정보 중 세로로 묶은 데이터

데이터 타입을 지정할 수 있고, 테이블에서 특정한 Record의 내용을 찾기 위해서는 Column의 내용을 기준으로 찾는다.

 

 

 

- Record

테이블을 구성하는 정보 중 가로로 묶은 데이터

일반적으로 한 객체에 대한 정보를 가지고 있으며, 기본키 (PK) 로 구별이 가능하다.

 

 

- 정규화

데이터의 정합성을 확보하기 위해 테이블을 분할해 생성하는 것

 

 

 

- PK

Primary Key  : 기본키 // 테이블에 대한 고유 식별값으로, 테이블에 오직 한개만 갱성 가능

레코드 검색의 기준이기 때문에 빠른 검색을 위해 내부적으로 인덱싱 (Indexing) 을 한다.

중복될 수 없고 비어있을 수 없다.

 

 

 

- FK

Foreign Key : 외래키 // 다른 테이블의 PK

어떤 테이블의 기본키가 다른 테이블의 칼럼에 들어 있는 경우를 지칭하며, 외부 식별자 키로 테이블 간의 관계를 의미한다.

두 테이블간 종속이 필요한 관계이면 접점의 컬럼을 FK로 지정해 서로 참조할 수 있도록 관계를 명시한다.

 

 

 

- UK

PK는 아니지만 값의 중복을 허용하지 않기 위해 컬럼에 unique 제약을 설정하며, 비어있을 수 있다.

 

 

 

- Migration

하드웨어, 소프트웨어, 네트워크 등 넓은 범위에서 사용되고 있는 개념으로, 현재 운영 환경으로부터 다른 운영 환경으로 옮기는 작업이다.

데이터베이스에서는 스키마 버전을 관리하기 위해 수행한다.

 

 

 

 

#2. Assignment

-  쇼핑 목록 리스트에 Realm Database 구현

결과물

 

localRealm.delete 를 통해, 스와이프로 목록을 지우는 기능까지 구현해봤다.

 

 

 

 

# 그 외

-  Realm Studio

Realm Studio 를 통해 간단하게 Realm의 데이터를 직관적으로 확인할 수 있다.

 

1. Realem 파일 경로 찾기

 

2. 경로 열기

 

 

 

- 오류 : call beginWriteTransaction on an RLMRealm instance first

즐겨찾기 버튼과 완료 버튼을 위해 평소처럼 코드를 작성하니 작성하니, 에러가 발생했다.

 

Thread 1: "Attempting to modify object outside of a write transaction - call beginWriteTransaction on an RLMRealm instance first."

 

write transaction 안에서만 수정이 가능한데, 지금 write transaction가 없는 채로 시도를 하고 있다는 뜻이다.

따라서 try! localRealm.write 로 감싸주면 해결된다.

수정 전

 

수정 후