[swift] Swift 데이터베이스 연동 방법

Swift 언어를 사용하여 iOS 앱을 개발하다보면 데이터베이스 연동이 필요한 경우가 많습니다. 이번 포스트에서는 Swift에서 데이터베이스를 어떻게 연동하는지에 대해 알아보겠습니다.

1. 데이터베이스 선택

Swift에서는 다양한 데이터베이스를 사용할 수 있습니다. 일반적으로 사용되는 데이터베이스 중 가장 많이 사용되는 것은 SQLite, Core Data, Realm 등이 있습니다. 각 데이터베이스는 장단점이 있으므로 프로젝트의 요구 사항에 맞게 선택해야 합니다.

2. 데이터베이스 라이브러리 설치

선택한 데이터베이스에 맞는 라이브러리를 설치해야 합니다. Cocoapods나 Swift Package Manager를 사용하여 라이브러리를 프로젝트에 추가할 수 있습니다. 각 데이터베이스 라이브러리의 공식 문서를 참조하여 설치 방법을 확인하세요.

3. 데이터베이스 연결 및 설정

설치된 라이브러리를 사용하여 데이터베이스에 연결하고 설정을 구성해야 합니다. 일반적으로는 데이터베이스 파일의 경로를 지정하고 연결하는 작업이 필요합니다. 데이터베이스 연결 코드는 아래와 같이 작성할 수 있습니다.

// SQLite 연결 예시
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("database.sqlite")
let database = try! Connection(fileURL.path)

// Core Data 연결 예시
let managedObjectContext: NSManagedObjectContext = {
    let container = NSPersistentContainer(name: "Model")
    container.loadPersistentStores { (_, error) in
        if let error = error as NSError? {
            fatalError("Error: \(error), \(error.userInfo)")
        }
    }
    return container.viewContext
}()

// Realm 연결 예시
let configuration = Realm.Configuration(
    fileURL: try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("default.realm"),
    schemaVersion: 1
)

let realm = try! Realm(configuration: configuration)

4. 데이터 조작

데이터베이스에 연결한 후에는 데이터를 조작하고 쿼리를 실행할 수 있습니다. 이 작업은 선택한 데이터베이스의 문법과 API에 따라 다를 수 있습니다. 아래는 각 데이터베이스의 예시입니다.

SQLite 데이터 조작 예시

let users = Table("users")
let id = Expression<Int>("id")
let name = Expression<String>("name")
let email = Expression<String>("email")

try! database.run(users.create { t in
    t.column(id, primaryKey: true)
    t.column(name)
    t.column(email, unique: true)
})

let insert = users.insert(name <- "John", email <- "john@example.com")
let rowID = try! database.run(insert)

for user in try! database.prepare(users) {
    print("id: \(user[id]), name: \(user[name]), email: \(user[email])")
}

Core Data 데이터 조작 예시

let entity = NSEntityDescription.entity(forEntityName: "User", in: managedObjectContext)!
let user = NSManagedObject(entity: entity, insertInto: managedObjectContext)
user.setValue("John", forKey: "name")
user.setValue("john@example.com", forKey: "email")
try! managedObjectContext.save()

let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "User")
let users = try! managedObjectContext.fetch(fetchRequest)
for user in users {
    print("name: \(user.value(forKey: "name") as! String), email: \(user.value(forKey: "email") as! String)")
}

Realm 데이터 조작 예시

class User: Object {
    @objc dynamic var name = ""
    @objc dynamic var email = ""
}

let user = User()
user.name = "John"
user.email = "john@example.com"
try! realm.write {
    realm.add(user)
}

let users = realm.objects(User.self)
for user in users {
    print("name: \(user.name), email: \(user.email)")
}

5. 데이터베이스 연결 종료

데이터베이스 작업이 완료되면 연결을 종료해야 합니다. 데이터베이스 라이브러리에 따라 종료하는 방법이 다를 수 있으므로 해당 라이브러리의 문서를 참조하세요.

참고 자료