TIL

[Sesac IOS] 34~35일차 TIL

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