Open longlivedrgn opened 4 months ago
SQLite
Core Data
NSManagedObject
Realm
트랜잭션
데이터베이스에서 하나의 논리적 작업 단위로, 여러 개의 데이터베이스 연산(읽기, 쓰기, 수정, 삭제)을 하나의 단위로 묶어 처리하는 것을 의미
원자성 (Atomicity): 트랜잭션은 모두 완료되거나 전혀 수행되지 않은 것처럼 보장해야 합니다. 즉, 트랜잭션 내의 모든 연산이 성공적으로 완료되면 그 결과가 데이터베이스에 반영되고, 하나라도 실패하면 트랜잭션 전체가 취소됩니다.
일관성 (Consistency): 트랜잭션이 완료되면 데이터베이스는 일관성 있는 상태를 유지해야 합니다. 트랜잭션의 모든 작업이 완료되기 전과 완료된 후의 데이터베이스 상태는 일관성이 있어야 합니다.
고립성 (Isolation): 동시에 실행되는 트랜잭션은 서로 간섭하지 않도록 고립되어야 합니다. 하나의 트랜잭션이 수행되는 동안 다른 트랜잭션이 그 중간 상태를 볼 수 없고, 각각의 트랜잭션은 독립적으로 수행되어야 합니다.
지속성 (Durability): 트랜잭션이 완료된 후 그 결과는 영구적으로 데이터베이스에 반영되어야 합니다. 시스템 장애가 발생하더라도 완료된 트랜잭션의 결과는 손실되지 않고 보장되어야 합니다.
원자성 (Atomicity):
일관성 (Consistency):
고립성 (Isolation):
지속성 (Durability):
A
: 원자성C
: 일관성I
:격리성D
: 지속성sqlite3_prepare_v2 // _v2 붙은 게 향상된 버전
sqlite3_step
sqlite3_finalize
sqlite3_prepare_v2
: 메모리 할당, SQL문 파싱sqlite3_step
: 삽입·조회·삭제 등 필요한 작업을 수행 (SQL문을 실행)sqlite3_finalize
: SQL문을 명시적으로 종료, 관련된 모든 리소스를 해제하여 메모리 누수 방지
일단 모두 DMBS라는 측면으로 사용이 되는 것으로 알고 있는데요.
Realm은 이름은 들어봤으나 실제로 분석하고 사용해본 적은 없어서 잘 모르겠습니다. SQL 문법을 각 플랫폼에서 지원하는 언어들로 비교적 쉽게 사용할 수 있는 것 정도로만 알고 있습니다.
SQLite는 그 이름처럼 SQL을 사용하는 DBMS이면서, 다른 툴에 비해 상대적으로 많이 가벼운 것으로 알고 있습니다.
CoreData는 애플에서 제공하는 프레임워크인데요. DMBS, ORM 등 인스턴스를 관리하기 위한 기능들을 제공합니다. 또 내부적으로 SQLite를 사용하기도 합니다. https://developer.apple.com/documentation/coredata/nspersistentstore/storetype
먼저 트랜잭션은 함수를 묶어놓은 함수라고 표현할 수 있을 것 같은데요. 이를 묶어놓음으로써 비즈니스 레벨에서 한번에 처리가 되도록 하는 것입니다. 흔히 예시를 드는 게 은행일인데 계좌이체를 한다고 하면 A 계좌에서는 돈을 빼야 하고, B 계좌에는 돈을 넣어야 합니다. 또 이 안에서도 로그를 남기거나 하는 일이 필요할 수 있는데, 이렇듯 작업을 묶어서 하나의 작업으로 단위를 만든 것을 트랜잭션이라 합니다.
이러한 트랜잭션의 특성상 지켜져야하는 성질이 있는데 이들의 앞글자를 따서 부르는 것이 ACID입니다. 각각 Atomic, Consistency, Isolation, Durability인데요. 상세 설명은 다음과 같습니다.
이게 말이 이상하지만, 제가 읽기로는 운영체제 별 RDMBS의 운영방식을 이야기하라는 것 같은데요. 상당히 서로 동떨어진 이야기를 연관지어 시킨다는 생각이 듭니다. 먼저 같은 RDMBS라도 운영체제 별로 인터페이스가 다를 수는 있겠습니다. 또 RDMBS 인터페이스가 달라 운영방식이 다를 수도 있겠습니다. 그런데 많은 RDMBS들이 있는데 특히 iOS에서, 그 많은 RDBMS가 운영되는 방식을 표현하라는 게... 아는 만큼 나열을 하라는 건지, 공통점이 있다면 표현을 하라는 건지 잘 모르겠네요.
일단 공통점으로 가자면 데이터베이스 스키마라는 것부터가 관계형 데이터베이스에서 사용되는 용어인데, 하나의 데이터 집합을 표현하는 테이블입니다. 스키마의 버전을 이야기 한다는 게 또 기존의 스키마를 두고 새로운 스키마를 만든다는 것인지, 기존의 스키마를 확장한다는 것인지 명확한 정의가 필요한데요. 일단 어느 쪽이던 SQL 중에서도 Database Define Language를 통해 스키마를 재정의하는 과정이 필요합니다. 이후 Database managment language를 통해 확장된 스키마에서 삭제, 추가, 변형이 된 컬럼에 대해 어떤 정책을 가져갈 것인지 결정하는 과정이 필요하며, 새로운 스키마를 만든 경우라면 또 새로운 스키마로 모두 옮겨주는 과정이 필요할 수 있습니다.
질문의 의도가 이게 맞는지 솔직히 잘 모르겠는데요. 별 생각없이 코어데이터를 이야기한 것이라면, 매뉴얼한 방법과 오토매틱한 방법이 있습니다. 보통은 오토매틱으로 충분한데, 새로운 모델이 필요하고 기존 모델이 이로 맵핑이 되어야하는 경우라면 매뉴얼한 방식으로 처리할 필요가 있습니다.