코틀린(Kotlin) 직렬화
이 페이지의 내용
개요
애플리케이션 에서 코틀린 (Kotlin) 객체를 직렬화 및 역직렬화할 때 kotlinx.serialization
라이브러리를 사용할 수 있습니다.
이 운전자 는 @Serializable
주석으로 표시된 클래스와 함께 사용할 수 있는 효율적인 Bson
직렬 변환기를 제공하여 코틀린( 코틀린 (Kotlin) ) 객체의 BSON 데이터 직렬화를 처리하다 합니다.
코틀린 (Kotlin) 직렬화 Json
라이브러리를 사용할 수 있지만 Json
직렬 변환기는 ObjectId
와 같은 BSON 값 유형을 직접 지원 하지 않습니다 . BSON 과 JSON 간의 변환을 처리하다 할 수 있는 사용자 지정 직렬 변환기를 제공해야 합니다.
기본값, null을 인코딩하고 클래스 판별자를 정의하는 구성이 있는 사용자 지정 코덱을 지원 하려면 bson-kotlinx
라이브러리를 설치하는 것이 좋습니다.
참고
kotlinx.serialization
라이브러리 대신 Codec
인터페이스를 사용하여 사용자 지정 직렬화 동작을 지정하는 방법을 학습 보려면 코덱 가이드 를 참조하세요.
라이브러리에 이미 익숙하거나 관용적 인 접근 방식을 선호하는 경우 코틀린 (Kotlin) 직렬화를 사용할 수 있습니다.
지원되는 유형
코틀린 동기 (Kotlin Sync) 운전자 는 다음 유형을 지원합니다.
kotlinx.serialization
라이브러리에서 지원하는 모든 코틀린 (Kotlin) 유형모든 BSON types
프로젝트에 직렬화 종속성 추가
애플리케이션 에서 데이터를 직렬화 및 역직렬화하려면 공식 코틀린 (Kotlin) 직렬화 라이브러리인 을 설치해야kotlinx.serialization
합니다. 이 라이브러리에 학습 보려면 kotlinx.serialization GitHub 리포지토리 를 참조하세요.
다음 탭에서 선택하여 Gradle 또는 Maven 를 사용하여 프로젝트 에 직렬화 종속성을 추가하는 방법을 확인합니다.
Gradle 을 사용하는 경우 종속성을 관리 하려면 build.gradle.kts
종속성 목록에 다음을 추가하세요.
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1") implementation("org.mongodb:bson-kotlinx:5.2.0")
Maven 을 사용하는 경우 종속성을 관리 하려면 pom.xml
종속성 목록에 다음을 추가하세요.
<dependency> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-serialization-core</artifactId> <version>1.5.1</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>bson-kotlinx</artifactId> <version>5.2.0</version> </dependency>
참고
bson-kotlin 종속성
기본 코덱 레지스트리를 통해 bson-kotlin
종속성을 선택적으로 설치할 수도 있습니다. 이 종속성은 리플렉션과 코덱 레지스트리를 사용하여 Kotlin 데이터 클래스를 지원하지만 BsonDiscriminator
, BsonExtraElements
및 BsonConstructor
과 같은 특정 POJO 주석은 지원하지 않습니다. 자세한 내용은 bson-kotlin API 설명서를 참조하세요.
일반적으로 코덱 구성을 위해 조뮤더 빠른 bson-kotlinx
라이브러리를 설치하고 사용하는 것이 좋습니다.
데이터 클래스에 어노테이션을 첨가합니다.
클래스를 직렬화 가능으로 선언하려면 @Serializable
주석으로 코틀린 (Kotlin) 데이터 클래스에 주석을 추가합니다.
데이터 클래스를 직렬화 가능으로 표시한 후 다른 데이터 클래스를 사용하는 것처럼 코드에서 사용할 수 있습니다. 코틀린 동기 (Kotlin Sync) 운전자 와 코틀린 (Kotlin) 직렬화 프레임워크 는 BSON 직렬화 및 역직렬화를 처리하다 합니다.
이 예시 에서는 다음 주석이 있는 샘플 데이터 클래스를 보여줍니다.
@Serializable
: 클래스를 직렬화 가능으로 표시합니다.@SerialName
: BSON 문서 에서id
및manufacturer
속성의 이름을 지정합니다. 이 주석은 직렬화 가능 클래스에서 지원되지 않는@BsonId
및@BsonProperty
주석 대신 사용할 수 있습니다.@Contextual
: 내장ObjectIdSerializer
을(를) 사용하도록 BSONid
속성 을 표시합니다. 이 주석은 운전자 가 BSON types를 올바르게 직렬화하는 데 필요합니다.
data class PaintOrder( // Use instead of @BsonId val id: ObjectId?, val color: String, val qty: Int, val manufacturer: String = "Grumbacher" // Use instead of @BsonProperty )
참고
POJO 어노테이션 제한
@Serializable
주석으로 표시된 데이터 클래스에는 org.bson.codecs.pojo.annotations
패키지 의 주석을 사용할 수 없습니다.
직렬화 가능 클래스 및 사용 가능한 주석에 학습 보려면 직렬화 가능 클래스를 kotlinx.serialization
참조하세요. 라이브러리 문서에서 확인 가능합니다.
사용자 지정 직렬 변환기 예시
사용자 지정 직렬 변환기를 만들어 BSON 에서 데이터가 표현되는 방식을 처리하다 할 수 있습니다. 코틀린 동기 (Kotlin Sync) 운전자 는 kotlinx.serialization
라이브러리의 KSerializer
인터페이스를 사용하여 사용자 지정 직렬 변환기를 구현 합니다. 특정 필드 에 대한 @Serializable
주석에 대한 매개 변수로 사용자 지정 직렬 변환기를 지정할 수 있습니다.
다음 예에서는 kotlinx.datetime.Instant
를 BsonDateTime
으로 변환하기 위해 사용자 지정 KSerializer
인스턴스를 만드는 방법을 보여 줍니다.
object InstantAsBsonDateTime : KSerializer<Instant> { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("InstantAsBsonDateTime", PrimitiveKind.LONG) override fun serialize(encoder: Encoder, value: Instant) { when (encoder) { is BsonEncoder -> encoder.encodeBsonValue(BsonDateTime(value.toEpochMilli())) else -> throw SerializationException("Instant is not supported by ${encoder::class}") } } override fun deserialize(decoder: Decoder): Instant { return when (decoder) { is BsonDecoder -> Instant.ofEpochMilli(decoder.decodeBsonValue().asDateTime().value) else -> throw SerializationException("Instant is not supported by ${decoder::class}") } } }
다음 코드는 orderDate
필드에 이전 코드에 정의된 사용자 지정 직렬 변환기 클래스를 지정하는 주석이 있는 PaintOrder
데이터 클래스를 보여 줍니다.
data class PaintOrder( val color: String, val qty: Int, val orderDate: Instant, )
이 섹션에 언급된 메서드 및 클래스에 학습 보려면 다음 API 설명서를 참조하세요.
KSerializer 코틀린 (Kotlin) 문서에서
직렬 변환기 구성을 사용자 지정합니다.
org.bson.codecs.kotlinx
패키지 의 KotlinSerializerCodec
클래스를 사용하여 @Serializable
데이터 클래스에 대한 코덱을 만들고 운전자 가 MongoDB 에 저장하는 내용을 사용자 지정할 수 있습니다.
BsonConfiguration
클래스를 사용하여 기본값을 인코딩할지, null을 인코딩할지 또는 클래스 판별자를 정의할지 여부를 포함할 수 있는 구성을 정의합니다.
사용자 지정 코덱을 만들려면 프로젝트 에 bson-kotlinx
종속성이 있어야 합니다. 설치 지침은 이 가이드 의 프로젝트에 직렬화 종속성 추가 섹션을 참조하세요.
KotlinSerializerCodec.create() 메서드 를 사용하여 코덱을 정의할 수 있습니다. 메서드를 사용한 다음 레지스트리에 코덱을 추가할 수 있습니다.
사용자 지정 코덱 예시
다음 예시 에서는 KotlinSerializerCodec.create()
메서드를 사용하여 코덱을 만든 다음 기본값을 인코딩 하지 않도록 구성하는 방법을 보여 줍니다.
val myCustomCodec = KotlinSerializerCodec.create<PaintOrder>( bsonConfiguration = BsonConfiguration(encodeDefaults = false) ) val registry = CodecRegistries.fromRegistries( CodecRegistries.fromCodecs(myCustomCodec), collection.codecRegistry )
이 섹션에 언급된 메서드 및 클래스에 학습 보려면 다음 API 설명서를 참조하세요.
다형성 직렬화
코틀린 동기 (Kotlin Sync) 운전자 는 기본적으로 다형성 클래스의 직렬화 및 역직렬화를 지원합니다. 봉인된 인터페이스와 해당 인터페이스를 상속하는 데이터 클래스를 @Serializable
주석으로 표시하면 운전자 는 KSerializer
구현 을 사용하여 BSON 과의 유형 변환을 처리하다 합니다.
다형성 데이터 클래스의 인스턴스 를 MongoDB 에 삽입하면 운전자 는 판별자 필드 인 _t
필드 를 추가합니다. 이 필드 의 값은 데이터 클래스 이름입니다.
다형성 데이터 클래스 예시
다음 예시 에서는 인터페이스와 해당 인터페이스를 상속하는 두 개의 데이터 클래스를 만듭니다. 데이터 클래스에서 id
필드 는 데이터 클래스 에 주석 달기 섹션에 설명된 주석으로 표시됩니다.
sealed interface Person { val name: String } data class Student( val id: ObjectId, override val name: String, val grade: Int, ) : Person data class Teacher( val id: ObjectId, override val name: String, val department: String, ) : Person
그런 다음 평소와 같이 데이터 클래스로 작업을 수행할 수 있습니다. 다음 예시 에서는 Person
인터페이스를 사용하여 컬렉션 을 매개변수화한 다음 다형성 클래스 Teacher
및 Student
를 사용하여 작업을 수행합니다. 문서를 조회 할 때 운전자 는 판별자 값을 기반으로 유형을 자동으로 감지하고 그에 따라 역직렬화합니다.
val collection = database.getCollection<Person>("school") val teacherDoc = Teacher(ObjectId(), "Vivian Lee", "History") val studentDoc = Student(ObjectId(), "Kate Parker", 10) collection.insertOne(teacherDoc) collection.insertOne(studentDoc) println("Retrieving by using data classes") val resultTeacher = collection.withDocumentClass<Teacher>() .find(Filters.exists("department")) .firstOrNull() println(resultTeacher) val resultStudent = collection.withDocumentClass<Student>() .find(Filters.exists("grade")) .firstOrNull() println(resultStudent) println("\nRetrieving by using Person interface") val resultsPerson = collection.withDocumentClass<Person>().find() resultsPerson.forEach { result -> println(result) } println("\nRetrieving as Document type") val resultsDocument = collection.withDocumentClass<Document>().find() resultsDocument.forEach { result -> println(result) }
Retrieving by using data classes Teacher(id=..., name=Vivian Lee, department=History) Student(id=..., name=Kate Parker, grade=10) Retrieving by using Person interface Teacher(id=..., name=Vivian Lee, department=History) Student(id=..., name=Kate Parker, grade=10) Retrieving as Document type Document{{_id=..., _t=Teacher, name=Vivian Lee, department=History}} Document{{_id=..., _t=Student, name=Kate Parker, grade=10}}
날짜 및 시간 직렬화
이 섹션에서는 코틀린 (Kotlin) 직렬화를 사용하여 날짜 및 시간 유형으로 작업하는 방법에 학습 수 있습니다.
kotlinx-datetime 라이브러리
kotlinx-datetime
날짜 및 시간 값이 직렬화되는 방식을 높은 수준으로 제어할 수 있는 코틀린 (Kotlin) 라이브러리입니다. 라이브러리를 사용하려면 프로젝트의 종속성 목록에 kotlinx-datetime
종속성을 추가합니다.
다음 탭에서 선택하여 Gradle 및 Maven 패키지 관리자를 사용하여 프로젝트 에 kotlinx-datetime
종속성을 추가하는 방법을 확인합니다.
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1")
<dependency> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-datetime-jvm</artifactId> <version>0.6.1</version> </dependency>
이 라이브러리에 학습 보려면 kotlinx-datetime 리포지토리 를 Github 참조하세요. 에서 .
날짜 및 시간이 있는 데이터 클래스 예시
라이브러리 종속성을 추가한 후 데이터 클래스 필드 값을 BSON 의 예상 유형에 매핑하는 직렬 변환기를 kotlinx-datetime
라이브러리에서 구현 수 있습니다.
이 예시 에서 운전자 는 다음 동작을 사용하여 Appointment
데이터 클래스의 필드를 직렬화합니다.
name
: 운전자 가 값을 string 로 직렬화합니다.date
: 필드 에@Contextual
주석이 있으므로 운전자 가kotlinx-datetime
직렬 변환기를 사용합니다.LocalDate
값은 BSON 날짜로 직렬화됩니다.time
:@Contextual
주석이 없기 때문에 운전자 가 값을 string 로 직렬화합니다. 이는LocalTime
값에 대한 기본값 직렬화 동작입니다.
data class Appointment( val name: String, val date: LocalDate, val time: LocalTime, )
다음 예시 에서는 Appointment
데이터 클래스의 인스턴스 를 appointments
컬렉션 에 삽입합니다.
val collection = database.getCollection<Appointment>("appointments") val apptDoc = Appointment( "Daria Smith", LocalDate(2024, 10, 15), LocalTime(hour = 11, minute = 30) ) collection.insertOne(apptDoc)
MongoDB 에서 LocalDate
값은 BSON 날짜로 저장되고 time
필드 는 직렬화 기본값 string 로 저장됩니다.
{ "_id": ..., "name": "Daria Smith", "date": { "$date": "2024-10-15T00:00:00.000Z" }, "time": "11:30", }