Model
모델은 DB의 구조를 단순화, 추상화하여 체계적으로 표현하는데 사용되는 도구이다. 즉, DB의 테이블 또는 컬렉션에 저장 된 데이터를 나타낸다. 모델은 하나 이상의 필드를 가지고 있어야하고 모든 모델들은 고유한 식별자를 가지고 있다. Fluent에서 모델은 기본적으로 Codable을 채택하고, 모델 생성 시 반드시 빈 이니셜라이저를 가져야한다.
final class Movie: Model {
static let schema = "movies"
@ID(key: .id)
var id: UUID?
@Field(key: "title")
var title: String
@Enum(key: "info")
var info: Info
init() { }
init(id: UUID? = nil,
title: String,
info: Info) {
self.id = id
self.title = title
self.info = info
}
}
enum Info: String, Codable {
case genre, actor
}
위의 모델은 영화 데이터를 담고 있는 모델이다. 모델은 제약사항, Index, Key와 같은 DB의 모든 Schema를 담고 있는건 아니다.
Schema
Schema는 관계형 DB에서 데이터가 구조화되는 방식을 정의한다. Fluent에서 모든 모델은 "schema"라는 정적 문자열 프로퍼티를 필요로 한다. 이 문자열은 모델이 나타내는 테이블 또는 컬렉션의 이름을 나타낸다.
final class Movie: Model {
static let schema = "movies"
}
해당 모델에 Query를 요청할 때, movies라는 schema에 값을 저장하거나 불러온다.
Identifier
Identifier는 @ID(key:) property wrapper를 사용해야한다. id는 모델의 인스턴스를 고유하게 식별하는데 사용된다.
final class Movie: Model {
@ID(key: .id)
var id: UUID?
}
@ID는 UUID 타입이어야한다. Fluent는 모델이 새로 생성될 때 자동적으로 새로운 UUID 식별자를 생성하여 부여한다.
Fluent는 모든 드라이버와 호환이 되는 UUID와 .id라는 필드 키를 사용하는 것을 권장한다.
✅ SQL의 경우 id, NonSQL의 경우 _id를 사용한다.
Field
Field는 데이터를 저장하기 위한 프로퍼티이다.
final class Movie: Model {
@Field(key: "title")
var title: String
}
단순한 Field의 경우 @Field(key:) property wrapper를 사용한다. Fluent에서 Field를 사용하려면 위와 같이 DB key를 명시적으로 정의해야한다. 다만, 프로퍼티 이름과 반드시 동일할 필요는 없다.
✅ Fluent는 Field 명명 규칙이 스위프트와 다를 수 있는 경우, camelCase 대신 snake_case를 사용한다.
✅ @Field(key:) 프로퍼티는 Codable을 준수하는 타입이라면 어떤 타입이라도 지정할 수 있다.
final class Movie: Model {
@OptionalField(key: "review")
var review: String?
}
위와 같이 옵셔널 타입에는 @OptinalField(key:)를 사용한다.
Timestamp
Timestamp는 @Field의 한 종류로, Foundation.Date 타입을 지정한다. @Timestamp는 지정된 트리거(.create, .update, delete)를 토대로 Fluent에 의해 자동으로 설정된다.
final class Movie: Model {
@Timestamp(key: "created_date", on: .create)
var createdDate: Date?
}
@Timestamp는 옵셔널 타입이므로 이니셜라이저에 기본으로 nil로 설정해야한다.
Initializer
모든 모델은 반드시 빈 이니셜라이저(init)을 가져야한다. Fluent가 쿼리에 의해 모델을 생성하는데 내부적으로 사용하기 때문이다. 물론 모든 프로퍼티를 사용하는 이니셜라이저도 구현할 수 있다.
final class Movie: Model {
init() { }
init(id: UUID? = nil,
title: String,
info: Info) {
self.id = id
self.title = title
self.info = info
}
}
Enum
Enum은 @Field의 한 종류로, String의 원시값을 갖는 열거형을 네이티브 DB 열거형으로 저장한다.
final class Movie: Model {
@Enum(key: "info")
var info: Info
}
enum Info: String, Codable {
case genre, actor
}
'iOS > Vapor' 카테고리의 다른 글
[Vapor/Databse] CRUD 기능 구현하기 (1) | 2023.10.21 |
---|---|
[Vapor/Database] Fluent Migration (0) | 2023.10.20 |
[Vapor/Database] PostgreSQL 시작하기 (1) | 2023.10.18 |
[Vapor/Server] Fluent란? (0) | 2023.10.18 |
[Vapor/Server] Vapor 시작하기 (1) | 2023.10.16 |