Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[레벨 0] 6주차 12. 데이터베이스의 종류와 iOS에서 주로 사용되는 데이터베이스에 대해 설명해주세요. #12

Open
longlivedrgn opened this issue May 15, 2024 · 6 comments
Assignees
Labels

Comments

@longlivedrgn
Copy link
Contributor

  • iOS에서 사용되는 SQLite, Core Data, Realm 등의 특징과 사용 사례를 설명해주세요.
  • 관계형 데이터베이스의 ACID 특성과 트랜잭션의 개념에 대해 설명해주세요.
  • iOS에서 데이터베이스 스키마 버전 관리와 마이그레이션을 처리하는 방법을 설명해주세요.
@longlivedrgn longlivedrgn self-assigned this May 15, 2024
@JasonLee0223
Copy link

iOS에서 사용되는 SQLite, Core Data, Realm 등의 특징과 사용 사례를 설명해주세요.

SQLite는 RDBMS의 경량화 한 버전으로 볼 수 있으며 서버가 아닌 응용프로그램(혹은 앱)에 넣어 사용하는 비교적 가벼운 DB입니다.
하여 가장 널리 사용되고 Swift에서도 별도의 설치 없이 사용할 수 있다는 장점이 있습니다.
하지만 모바일에 최적화되어 있지 않는 부분이 있다보니 Realm보다 성능 면에서 뒤쳐진다는 평이 있습니다.

Realm은 NoSQL(보편적으로 Not Only SQL 이라고 칭함) 일종으로 볼 수 있습니다.
여기서 NoSQL을 잠시 짚고 넘어가자면 단순히 기존 RDBMS가 갖고 있는 특성뿐만 아니라, 다른 특성들을 부가적으로 지원한다는 것을 의미합니다.
예를 들어 웹 쇼핑몰에 접속했을 때, 선호하시는 상품을 실시간으로 추천해 줄 때, 거의 예외 없이 사용되는 기술이 바로 NoSQL DB기술이 적용된다는 아티클을 보았습니다.

기존의 관계형 데이터베이스 시스템의 주요 특성을 보장하는 ACID(Atomic, Consistency, Integrity, Duarabity) 특성을 제공하지 않는,
그렇지만 뛰어난 확장성이나 성능 등의 특성을 갖는 수많은 비관계형, 분산 데이터 베이스들이 등장했고 NoSQL이라는 용어가 보편적으로 사용되었습니다.
소셜네트워크가 활성화 되면서 비정형데이터라는 것을 보다 쉽게 담아서 저장하고 처리할 수 있는 구조를 가진 데이터 베이스들이 관심을 받게 되었고,
해당 기술이 점점 더 발전하게 되면서, NoSQL 데이터베이스가 각광을 받게 되었습니다.

이에 Realm은 오픈 소스 라이브러리로 모바일에 최적화된 데이터베이스 라이브러리로서 복잡한 Entity에 대한 매핑을 처리해야할 문제가 없으므로
Realm은 메모리 상의 객체를 디스크로 빠르게 가져올 수 있으며 데이터 용량에 제한 없이 무료로 사용이 가능하고
대용량의 테이터와 대규모 스토리지에 상관없이 일관된 속도 및 성능을 보장하며 SQLite 및 CoreData 대비 빠른 속도를 자랑합니다.
하지만 외부 라이브러리를 설치해서 사용해야 하기 때문에 비교적 위험이 있습니다.

CoreData는 애플 자체 파일시스템 플랫폼으로서 안정성이 있습니다.
Object에 더 중심을 가져가며 Obejctive-C에 클래스로 표현되는 객체의 내용을 저장한다는 특징이 있습니다.
SQLite보다 더 빠르게 저장된 기록을 가져온다. 최근에는 SwiftData가 발표되면서 차츰차츰 사용 빈도가 줄어들 것으로 예상됩니다.

관계형 데이터베이스의 ACID 특성과 트랜잭션의 개념에 대해 설명해주세요.
ACID를 알기 전에 트랜잭션의 개념에 대해 먼저 설명드리겠습니다.  

DBMS에서 트랜잭션은 하나의 논리적인 작업 단위를 의미합니다.    
트랜잭션은 여러 개의 연산을 묶어서 하나의 작업으로 처리하기 때문입니다.     
이러한 트랜잭션 관리는 데이터의 일관성과 무결성을 유지하는 데 필수적인 요소입니다.    
따라서 트랜잭션 관리는 데이터베이스 시스템의 성능과 안정성을 결정짓는 중요한 요소 중 하나입니다.

ACID는 RDBMS의 주요 특성을 보장하는 4가지의 특성의 영단어 첫문자를 따와 만들었습니다.
Atomicity(원자성) - 트랜잭션이 데이터베이스에 모두 반영되거나 전혀 반영되지 않아야 한다는 원칙
Consistency(일관성) - 트랜잭션이 실행되기 전과 후에 데이터베이스가 일관된 상태를 유지해야 한다.
Isolation(독립성) - 동시에 실행되는 트랜잭션이 서로 영향을 주지 않아야 한다.
Duarabity(지속성) - 성공적으로 완료된 트랜잭션의 결과가 영구적으로 반영되어야 한다.
iOS에서 데이터베이스 스키마 버전 관리와 마이그레이션을 처리하는 방법을 설명해주세요.

스키마 버전 관리는 데이터베이스 스키마(데이터베이스의 구조, 테이블, 열, 인덱스 등)의 변경 사항을 관리하는 프로세스를 의미합니다.

애플리케이션이 발전하고 데이터 요구사항이 변화함에 따라 데이터베이스 스키마가 업데이트될 필요가 있기 때문에 중요한 개념입니다.

스키마 버전 관리를 수행하는 방법

  1. 버전 번호 부여
  2. 변경 사항 기록
  3. 마이그레이션 스크립트 작성
  4. 버전 확인 및 적용

Core Data에서 마이그레이션 처리

  1. 모델 버전 추가
  2. 디폴트 모델 설정
  3. 마이그레이션 정책 설정

SQLite를 사용하는 방법

  1. DB 버전 확인
  2. 마이그레이션 실행

@ohdair
Copy link

ohdair commented May 19, 2024

블로그 기재

@longlivedrgn
Copy link
Contributor Author

iOS에서 사용되는 SQLite, Core Data, Realm 등의 특징과 사용 사례를 설명해주세요.

SQLite

  • 관계형 DBMS이다.
  • 서버리스
  • 모든 트랜잭션이 ACID를 준수한다.
  • iOS에 기본적으로 내장되어 있어 별도의 설치가 필요 없습니다.
  • 소규모 데이터 관리를 할 때 사용한다.

Core Data

  • 직접 데이터베이스에 접근하지 않고 Core Data를 통해서 DB에 접근할 수 있다.
  • 데이터베이스를 객체 모델로 관리한다.
    • NSManagedObject
  • 프레임 워크이다.

Realm

  • 사용해보지 않았음

관계형 데이터베이스의 ACID 특성과 트랜잭션의 개념에 대해 설명해주세요.

트랜잭션

  • 데이터베이스에서 하나의 논리적 작업 단위로, 여러 개의 데이터베이스 연산(읽기, 쓰기, 수정, 삭제)을 하나의 단위로 묶어 처리하는 것을 의미

  • 원자성 (Atomicity): 트랜잭션은 모두 완료되거나 전혀 수행되지 않은 것처럼 보장해야 합니다. 즉, 트랜잭션 내의 모든 연산이 성공적으로 완료되면 그 결과가 데이터베이스에 반영되고, 하나라도 실패하면 트랜잭션 전체가 취소됩니다.

  • 일관성 (Consistency): 트랜잭션이 완료되면 데이터베이스는 일관성 있는 상태를 유지해야 합니다. 트랜잭션의 모든 작업이 완료되기 전과 완료된 후의 데이터베이스 상태는 일관성이 있어야 합니다.

  • 고립성 (Isolation): 동시에 실행되는 트랜잭션은 서로 간섭하지 않도록 고립되어야 합니다. 하나의 트랜잭션이 수행되는 동안 다른 트랜잭션이 그 중간 상태를 볼 수 없고, 각각의 트랜잭션은 독립적으로 수행되어야 합니다.

  • 지속성 (Durability): 트랜잭션이 완료된 후 그 결과는 영구적으로 데이터베이스에 반영되어야 합니다. 시스템 장애가 발생하더라도 완료된 트랜잭션의 결과는 손실되지 않고 보장되어야 합니다.

  • 원자성 (Atomicity):

    • 트랜잭션의 모든 연산이 성공적으로 완료되거나 모두 취소되어야 함을 의미합니다. 예를 들어, 은행 계좌 이체에서 한 쪽의 출금만 이루어지고 입금이 이루어지지 않는 경우가 없도록 보장합니다.
  • 일관성 (Consistency):

    • 트랜잭션이 데이터베이스의 일관성을 유지해야 함을 의미합니다. 데이터베이스의 모든 규칙(예: 무결성 제약 조건)이 트랜잭션의 전과 후에 모두 충족되어야 합니다.
  • 고립성 (Isolation):

    • 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 보장합니다. 한 트랜잭션의 중간 상태가 다른 트랜잭션에 보이지 않아야 합니다. 예를 들어, 두 트랜잭션이 동시에 같은 계좌에서 출금을 시도하는 경우 서로 간섭하지 않도록 해야 합니다.
  • 지속성 (Durability):

    • 트랜잭션이 완료되면 그 결과는 영구적으로 데이터베이스에 반영되어야 하며, 시스템 장애가 발생하더라도 손실되지 않아야 합니다. 예를 들어, 이체가 완료되었다면 시스템이 갑자기 중단되더라도 이체된 금액은 손실되지 않고 유지되어야 합니다.

@ueunli
Copy link

ueunli commented May 21, 2024

SQLite

특징

  • 데이터베이스를 단일 파일로 관리
    • 이 파일만 있으면 사용할 수 있으므로 설치나 별도 설정이 필요 없음
    • 자원 사용이 적음
    • 단순하고 가벼운 데이터 관리에 유리
  • ACID 준수
    • A: 원자성
    • C: 일관성
    • I:격리성
    • D: 지속성
  • 호환성
    • 앱과 동일한 프로세스 내에서 동작하므로 서버 프로세스가 필요 없음
    • 자체로도 장점이지만, 덕분에 다양한 환경에서 적용이 가능하여 모바일 앱, 데스트탑 앱, 임베디드 시스템 등 높은 호환성을 자랑

사용

  • import SQLite3
    • Xcode(Swift)에서 SQLite를 사용하려면 import SQLite3
    • SQLite는 2000년, SQLite2와 SQLite3은 2004년에 릴리즈 되었음
    • SQLite3부터 iOS 및 macOS 시스템에 기본적으로 포함되었기 때문에 Xcode로 사용할 수 있게 된 것
    • (⇒ SQLite, SQLite2는 관심 안 가져도 될 듯)
  • Transaction(aka 작업 단위)
    • Swift에서의 하나의 트랜잭션 구현을 요약하자면 아래와 같음
      sqlite3_prepare_v2  // _v2 붙은 게 향상된 버전
      sqlite3_step
      sqlite3_finalize
    • 위 3가지가 한 세트로, prepare를 했다면 이후 finalize를 반드시 해줘야 함
    • sqlite3_prepare_v2: 메모리 할당, SQL문 파싱
    • sqlite3_step: 삽입·조회·삭제 등 필요한 작업을 수행 (SQL문을 실행)
    • sqlite3_finalize: SQL문을 명시적으로 종료, 관련된 모든 리소스를 해제하여 메모리 누수 방지

주의 !!!

  • 속성 추가할 때 평소 Swift에서 타입 내 프로퍼티 순서 바꾸듯이 중간에 끼워넣거나 이리저리 옮기면 큰일 남
  • 예컨대 name-age-email-image에 nickname을 추가할 때, 아무리 name과 age 사이에 nickname을 배치하고 싶어 근질거려도 그러면 안 됨... name-age-email-image-nickname 해야 함...

 

@SunnnySong
Copy link

SunnnySong commented May 21, 2024

1️⃣ iOS에서 사용되는 SQLite, Core Data, Realm 등의 특징과 사용 사례를 설명해주세요.

  • iOS에서 사용할 수 있는 Local DB

SQLite

  • SQL 데이터베이스
  • 작고 가벼움
  • 따로 라이브러리를 설치할 필요가 없다.
  • Date Time과 같은 필드가 존재하지 않는다.

CoreData

  • 객체 중심 데이터베이스
  • iOS 자체 제공
  • SQLite보다 빠른 속도를 갖지만, 더 많은 저장공간을 사용한다.
  • 큰 저장공간 사용
  • iOS를 제외한 다른 플랫폼에서 사용 불가

Realm

  • 객체 중심 데이터베이스
  • Entity에 대한 매핑 없이, 메모리 상의 객체를 디스크로 빠르게 가져올 수 있다.
  • 여러 플랫폼에서 사용이 가능하다.
  • 외부 라이브러리 설치 필요
  • realm 파일과 불러온 object들은 해당 realm에 접근한 스레드에 종속된다.
    • 다른 스레드에서 접근하면 앱이 죽는다.

2️⃣ 관계형 데이터베이스의 ACID 특성과 트랜잭션의 개념에 대해 설명해주세요.

관계형 데이터베이스

  • 데이터가 하나 이상의 열과 행의 테이블에 저장되어 있는 데이터베이스 시스템이다.
  • 데이터의 종속성을 관계(relationship)로 표현한다.

트랜잭션, Transaction

  • 데이터베이스의 상태를 변화시키기 위해 수행하는 논리적 작업의 단위이다.
    • 상태 변화 == 데이터베이스에 접근해 수행하는 create, delete, update 등의 작업
  • 데이터베이스 시스템에서 여러 작업을 하나의 단위로 묶어 처리한다.
    • 트랜잭션의 주 목적은 데이터베이스의 일관성과 무결성을 유지하는 것이다.
  • 관계형 데이터베이스는 데이터의 무결성과 일관성을 보장하기 위해 트랜잭션을 사용한다.

트랜잭션의 특징, ACID

  • 원자성(Atomicity)
    • 트랜잭션 내 모든 작업이 모두 성공하거나 모두 실패해야 한다.
    • 만약 중간에 실패한 경우, 모든 작업이 롤백(rollback)되어 데이터베이스는 해당 트랜잭션이 시작하기 전 상태로 되돌아간다.
  • 일관성(Consistency)
    • 트랜잭션이 성공적으로 완료되면 데이터베이스는 일관된 상태를 유지해야 한다.
  • 격리성(Isolation)
    • 여러 트랜잭션이 동시에 실행될 때, 각 트랜잭션은 독립적으로 수행되어야 한다.
    • 하나의 트랜잭션이 완료되기 전에 다른 트랜잭션에서 그 작업에 접근할 수 없어야 한다.
      • locking과 같은 메커니즘이 사용된다.
  • 지속성(Durability)
    • 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 데이터베이스에 저장된다.

@soo941226
Copy link

iOS에서 사용되는 SQLite, Core Data, Realm 등의 특징과 사용 사례를 설명해주세요.

일단 모두 DMBS라는 측면으로 사용이 되는 것으로 알고 있는데요.

Realm은 이름은 들어봤으나 실제로 분석하고 사용해본 적은 없어서 잘 모르겠습니다. SQL 문법을 각 플랫폼에서 지원하는 언어들로 비교적 쉽게 사용할 수 있는 것 정도로만 알고 있습니다.

SQLite는 그 이름처럼 SQL을 사용하는 DBMS이면서, 다른 툴에 비해 상대적으로 많이 가벼운 것으로 알고 있습니다.

CoreData는 애플에서 제공하는 프레임워크인데요. DMBS, ORM 등 인스턴스를 관리하기 위한 기능들을 제공합니다. 또 내부적으로 SQLite를 사용하기도 합니다. https://developer.apple.com/documentation/coredata/nspersistentstore/storetype

관계형 데이터베이스의 ACID 특성과 트랜잭션의 개념에 대해 설명해주세요.

먼저 트랜잭션은 함수를 묶어놓은 함수라고 표현할 수 있을 것 같은데요. 이를 묶어놓음으로써 비즈니스 레벨에서 한번에 처리가 되도록 하는 것입니다. 흔히 예시를 드는 게 은행일인데 계좌이체를 한다고 하면 A 계좌에서는 돈을 빼야 하고, B 계좌에는 돈을 넣어야 합니다. 또 이 안에서도 로그를 남기거나 하는 일이 필요할 수 있는데, 이렇듯 작업을 묶어서 하나의 작업으로 단위를 만든 것을 트랜잭션이라 합니다.

이러한 트랜잭션의 특성상 지켜져야하는 성질이 있는데 이들의 앞글자를 따서 부르는 것이 ACID입니다. 각각 Atomic, Consistency, Isolation, Durability인데요. 상세 설명은 다음과 같습니다.

  • 원자성Atomic: 트랜잭션 내 세부 작업들은 트랜잭션과 함께 모두 성공하거나, 모두 실패해야 합니다. 일부만 성공하거나 실패해서는 안됩니다.
  • 일관성Consisntency: 트랜잭션 실행 전후로 데이터의 성격이 변화해서는 안됩니다.(일관적이어야 합니다)
  • 고립성Isolation: 트랜잭션이 여러개 실행되는 경우, 각 트랜잭션이 서로에게 영향을 끼쳐서는 안됩니다.
  • 지속성Durability: 트랜잭션이 성공하면 이는 유지되어야 합니다.

iOS에서 데이터베이스 스키마 버전 관리와 마이그레이션을 처리하는 방법을 설명해주세요.

이게 말이 이상하지만, 제가 읽기로는 운영체제 별 RDMBS의 운영방식을 이야기하라는 것 같은데요. 상당히 서로 동떨어진 이야기를 연관지어 시킨다는 생각이 듭니다. 먼저 같은 RDMBS라도 운영체제 별로 인터페이스가 다를 수는 있겠습니다. 또 RDMBS 인터페이스가 달라 운영방식이 다를 수도 있겠습니다. 그런데 많은 RDMBS들이 있는데 특히 iOS에서, 그 많은 RDBMS가 운영되는 방식을 표현하라는 게... 아는 만큼 나열을 하라는 건지, 공통점이 있다면 표현을 하라는 건지 잘 모르겠네요.

일단 공통점으로 가자면 데이터베이스 스키마라는 것부터가 관계형 데이터베이스에서 사용되는 용어인데, 하나의 데이터 집합을 표현하는 테이블입니다. 스키마의 버전을 이야기 한다는 게 또 기존의 스키마를 두고 새로운 스키마를 만든다는 것인지, 기존의 스키마를 확장한다는 것인지 명확한 정의가 필요한데요. 일단 어느 쪽이던 SQL 중에서도 Database Define Language를 통해 스키마를 재정의하는 과정이 필요합니다. 이후 Database managment language를 통해 확장된 스키마에서 삭제, 추가, 변형이 된 컬럼에 대해 어떤 정책을 가져갈 것인지 결정하는 과정이 필요하며, 새로운 스키마를 만든 경우라면 또 새로운 스키마로 모두 옮겨주는 과정이 필요할 수 있습니다.

질문의 의도가 이게 맞는지 솔직히 잘 모르겠는데요. 별 생각없이 코어데이터를 이야기한 것이라면, 매뉴얼한 방법과 오토매틱한 방법이 있습니다. 보통은 오토매틱으로 충분한데, 새로운 모델이 필요하고 기존 모델이 이로 맵핑이 되어야하는 경우라면 매뉴얼한 방식으로 처리할 필요가 있습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

6 participants