34~35일차 수업 내용을 정리한 글입니다.
Learned
DataBase
1) 개요
- 데이터를 가지고 있는 파일들의 집합체로, 수많은 데이터들이 모여서
구조적으로 저장된 저장소를 의미함. - 회사의 인사 관리, 고객 관리 시스템 등에 대표적으로 활용됨.
2) DBMS (DataBase Management System)
- DB를 생성, 삭제, 수정하는 등 DB를 관리하기 위한 소프트웨어를 의미함.
- 대부분의 DB가 이 DBMS를 통해 생성되고 관리되기 때문에 DB와 그 의미를 혼용하기도 함.
- 계층형, 관계형, 객체관계형, NoSQL 등 다양한 종류의 DBMS가 존재하는데
RDBMS(관계형 데이터베이스 관리 시스템)이 가장 많이 사용됨.
RDBMS (Relational DBMS)
1) 개요
- 저장된 데이터들 사이에 관계를 정의하여 DB를 관리하는 시스템
- 테이블과 컬럼으로 데이터를 구조화하고 테이블 간의 관계를 이용해
필요한 데이터들을 표현함. - 데이터의 정합성을 위해 데이터를 작은 단위 (테이블)로 분리하는 데이터 정규화를 통해
중복 데이터를 방지하고 데이터 독립성을 높임.
데이터 정합성 : 데이터의 일관성과 정확성이 유지되는 것
- 단, Oracle 같은 DBMS를 사용할 경우 비용적 부담이 있을 수 있고
시스템이 복잡해 질 수록 쿼리문이 복잡해지고 성능 저하가 일어날 수 있음. - 수평적 확장이 어려워 수직적 확장만으로는 한계에 도달할 수 있음.
2) 구조
- 스키마(Schema): DB의 구조(테이블 및 컬럼)와 데이터의 제약 조건(타입, 키 등)을 명세한 것
- 테이블(Table): Row와 Column의 형태로 조직화된 데이터들의 집합
- 컬럼(Column): 테이블에서 세로에 해당하는 데이터이며 일관된 속성을 가짐.
- 레코드(Record): 테이블에서 가로에 해당하는 데이터이며 한 객체에 대한 정보를 가짐.
테이블의 제약 조건 (PK, FK, UK)
1) 기본키(Primary Key)
- 테이블의 데이터를 식별하기 위한 값으로 테이블 당 1개만 생성할 수 있음.
- 레코드를 검색할 때 사용하며 빠르게 검색하기 위해 내부적으로 인덱싱을 함.
- 데이터를 구별하는 고유 값이므로 중복 및 빈 값(NULL)을 가질 수 없음.
- 대표적으로 주민등록번호, 핸드폰 번호, 학번 등이 기본키로 사용됨.
인덱싱(Indexing)
- 데이터의 위치를 식별해서 검색 속도를 높이기 위해 사용하는 기능
- key-value 쌍을 이용해 구현하며 기본키는 자동적으로 인덱싱 함.
- 정규화 정도에 따라 인덱싱의 효과가 달리지며 인덱스가 많아지면 성능과 속도가 저하됨.
2) 외래키(Foreign Key)
- 서로 다른 테이블 사이의 관계를 설정할 때 사용하며 한 테이블의 PK가
다른 테이블의 컬럼으로 들어감. - 외래키를 통해 다른 테이블의 데이터를 참조할 수 있음.
3) 유니크키(Unique Key)
- 기본키와 별개로 데이터의 중복을 막기 위해 설정하는 키
- 중복값을 가질 수 없고 빈 값(NULL)을 가질 수 있음
마이그레이션(Migration)
하드웨어, 소프트웨어, 네트워크 등에서 범용적으로 사용되는 개념으로,
현재 운영환경으로부터 다른 운영환경으로 옮기는 작업
Realm
1) 개요
- iOS 자체 데이터베이스인 CoreData의 대안으로 사용되는 외부 데이터베이스
- iOS 뿐만 아니라 macOS, Window, Android 등 다양한 플랫폼에서 사용할 수 있으며,
CRUD 측면에서 속도가 빠르다는 장점이 있음.
2) Realm in Swift
- 클래스를 생성하여 스키마(테이블, 컬럼, 키, 타입 등 DB의 구조)를 결정함.
- 클래스가 테이블, 내부 프로퍼티가 칼럼으로 대응됨.
- Int, String, UUID, ObjecId 등을 기본키로 사용할 수 있음.
class MovieData: Object {
@Persisted var movieTitle: String
@Persisted var releaseDate: String
@Persisted var totalAudience: String
@Persisted(primaryKey: true) var objectId: ObjectId
}
기타
- extension으로 프로토콜에 새로운 기능을 추가할 때는 요구사항이 아니라
실제 구현 부분까지 작성해야 함. - 제네릭에서 where을 사용해 타입 피라미터에 들어올 수 있는 타입을 제한할 수 있음.
- loadView() 메서드는 viewDidLoad() 메서드보다 먼저 실행되어 루트뷰가 nil인지 확인하고
루트뷰에 새로운 값을 할당하는 메서드이다. - loadView() 메서드를 재정의해서 커스텀 뷰를 컨트롤러의 루트뷰로 설정할 수 있음.
단, 내부에서 super.loadView() 호출 금지 - 뷰 컨트롤러가 deint 될 때 NotificationCenter에 등록된 옵저버도 사라지지만
deinit() 내부에서 옵저버를 제거해주는 것이 안정적임. - Snapkit에서 Margin이 붙은 Constraints는 스토리보드에서 체크할 수 있는
시스템 권장 여백(constraints margin) 과 동일한 기능임. (iOS 8.0 부터 등장) - viewDidLoad() 메서드 내부에서는 아직 뷰 컨트롤러(self)가 다른 화면을
띄울 수 없기 때문에 present 하면 오류가 발생함. (대신 viewDidAppear에서 가능) - Realm에서 테이블의 첫 레코드를 등록할 때 스키마가 결정됨.
Learning
- Realm에서 Migration 방법 알아보기
이상입니다.
'TIL' 카테고리의 다른 글
[Sesac IOS] 37일차 TIL (0) | 2022.08.25 |
---|---|
[Sesac IOS] 36일차 TIL (0) | 2022.08.24 |
[Sesac IOS] 33일차 TIL (0) | 2022.08.18 |
[Sesac IOS] 32일차 TIL (0) | 2022.08.18 |
[Sesac IOS] 31일차 TIL (0) | 2022.08.17 |