[swift] Swift Realm의 트랜잭션 처리 방법

Realm은 모바일 앱에서 데이터베이스를 사용하기 위한 오픈 소스 라이브러리로, Swift에서 사용할 수 있는 데이터베이스 처리 도구입니다. 이 글에서는 Swift Realm의 트랜잭션 처리 방법에 대해 알아보겠습니다.

1. Realm 트랜잭션

Realm에서 트랜잭션은 데이터베이스 작업의 단위를 나타내는 개념입니다. 여러 개의 데이터 변경 작업을 한 번에 처리하거나 롤백할 수 있도록 도와줍니다.

Swift Realm에서 트랜잭션은 write 메서드를 이용하여 시작합니다. 아래는 트랜잭션의 기본적인 구조입니다.

try! realm.write {
    // 트랜잭션 내에서 수행할 작업을 작성합니다.
    // 데이터 삽입, 수정, 삭제 등
}

트랜잭션 내에서는 데이터 변경 작업을 수행할 수 있습니다. 예를 들어, 새로운 객체를 데이터베이스에 삽입하거나 객체의 속성을 업데이트하거나 삭제할 수 있습니다.

2. 트랜잭션 롤백

트랜잭션을 롤백하는 것은 트랜잭션 내에서 수행한 변경 작업을 취소하는 것을 의미합니다. 예외가 발생하거나 특정 조건을 만족하지 않는 경우 롤백을 수행할 수 있습니다.

try! realm.write {
    // 트랜잭션 내에서 수행할 작업을 작성합니다.
    // 데이터 삽입, 수정, 삭제 등

    if someConditionNotMet {
        throw NSError(domain: "SomeErrorDomain", code: 0, userInfo: nil)
    }
}

// 롤백
realm.cancelWrite()

cancelWrite() 메서드를 호출하여 트랜잭션을 롤백할 수 있습니다. 롤백 후에는 트랜잭션 내에서 수행한 모든 변경 작업이 취소됩니다.

3. 트랜잭션 범위

Realm에서는 트랜잭션의 범위를 지정할 수 있습니다. 특정 객체에 대한 트랜잭션을 실행하거나 여러 개의 트랜잭션을 중첩해서 실행할 수 있습니다.

객체별 트랜잭션

let myObject = MyObject()

try! realm.write {
    realm.add(myObject)

    try! realm.write(myObject) {
        myObject.name = "New Name"
    }
}

write 메서드를 객체에 대해 실행하면 해당 객체에 대한 트랜잭션을 시작할 수 있습니다.

중첩된 트랜잭션

Realm에서는 트랜잭션을 중첩하여 실행할 수도 있습니다. 중첩된 트랜잭션은 외부 트랜잭션이 롤백되면 내부 트랜잭션도 함께 롤백됩니다.

try! realm.write {
    // 외부 트랜잭션
    realm.add(...)
    
    try! realm.write {
        // 내부 트랜잭션
        realm.add(...)
    }
}

4. 요약

이번 글에서는 Swift Realm의 트랜잭션 처리 방법에 대해 알아보았습니다. 트랜잭션을 사용하면 여러 개의 데이터베이스 작업을 한 번에 처리하거나 롤백하는 것이 가능합니다. 트랜잭션의 범위를 지정하여 객체별로 트랜잭션을 실행하거나 중첩된 트랜잭션을 사용할 수도 있습니다.

참고 : Realm Documentation