kaml을 쓰거나 YAML을 JSON으로 바꾼 뒤 kotlinx.serialization으로 읽는 식으로 YAML 설정을 다루는 Kotlin 서비스는 파일의 매핑마다 data class가 필요합니다. 이 변환기는 yaml 라이브러리(YAML 1.2 코어 스키마)로 YAML을 읽고 앵커와 병합 키를 펼친 뒤, 매핑마다 val 속성, 후행 쉼표, 필요한 import를 갖춘 data class 하나를 씁니다.
먼저 같은 위치의 값을 하나로 합칩니다. 매핑 목록은 모든 항목의 속성을 합친 항목 클래스 하나가 되고, 일부 항목에 없는 키는 = null 기본값이 있는 널 허용 속성이 되며, 정수와 소수가 섞인 숫자 목록은 List<Double>이 됩니다. 옵션으로 루트 클래스 이름(기본 Payload), 선택적 package 줄, @Serializable과 @SerialName을 낼지 정합니다.
API 응답, 앵커와 병합 키, 엣지 케이스 세 가지 예제가 들어 있고, 입력하는 동안 Kotlin 코드가 바로 갱신됩니다. 파싱은 브라우저 탭 안에서만 일어나 밖으로 나가는 것이 없으며, 입력은 20MiB까지 받습니다.
사용 방법
YAML 붙여 넣기 또는 예제 고르기
문서를 붙여 넣거나
.yaml파일을 편집기에 끌어다 놓고, 예제 칩을 고를 수도 있습니다. 루트는 매핑이든 목록이든 되고, 스칼라 하나는 만들 클래스가 없어 오류가 납니다.루트 클래스 이름과 패키지 정하기
루트 타입 이름은 PascalCase로 바뀌어 중첩 클래스의 접두어가 됩니다(
PayloadLimits). 패키지를 쓰면 맨 위에package줄이 들어가고, 내려받는 파일 이름은Payload.kt처럼 루트 클래스를 따릅니다.kotlinx.serialization 사용 여부
kotlinx.serialization 어노테이션 스위치를 켜면 클래스에
@Serializable, 이름이 바뀐 속성에@SerialName이 붙습니다. 끄면 평범한 data class가 되고, 알 수 없는 값은Any로 적힙니다.문서와 병합 키 고르기
문서가 여러 개일 때 자동은 목록을 만들고, 항상 배열은 하나여도 그렇게 하며, 첫 문서만은 첫 문서만 남깁니다. 병합 키(<<) 펼치기는 물려받은 키를 실제 속성으로 만듭니다.
클래스 확인 후 복사
루트 클래스가 먼저 나오고 중첩 클래스가 만난 순서대로 이어집니다. 널 허용 속성과
JsonElement타입을 확인한 뒤 코드를 복사하거나.kt파일로 내려받습니다.
작동 원리
YAML 값과 Kotlin 타입
타입은 파싱된 값에서 정해집니다. YAML 1.2에서는 true와 false만 불리언이라 debug: no는 String입니다. 날짜는 문자열이고, 모든 정수는 Long, 모든 소수는 Double입니다. 목록은 원소 타입으로 List<T>가 되고, [1, two]처럼 서로 다른 타입이 섞인 위치는 JsonElement입니다(어노테이션을 끄면 Any).
null은 타입에 ?로 더해지고, 널 허용이거나 일부 매핑에 없는 속성에는 = null이 붙어 성긴 데이터로도 클래스를 만들 수 있습니다. 늘 null뿐인 위치는 JsonElement? = null이 되므로 실제 타입으로 바꿔 주세요.
| YAML | Kotlin | 비고 |
|---|---|---|
| name: api | String | |
| port: 8080 | Long | 2^53까지의 정수는 모두 Long |
| cpu: 0.5 | Double | |
| debug: no | String | 불리언은 YAML 1.1에서만 |
| enabled: true | Boolean | |
| when: 2026-10-01 | String | 코어 스키마에는 타임스탬프 타입이 없음 |
| region: ~ (단독) | JsonElement? = null | 어노테이션을 끄면 Any? |
| tags: [web, edge] | List<String> | |
| mixed: [1, two] | List<JsonElement> | 어노테이션을 끄면 List<Any> |
| limits: {cpu: 0.5} | data class PayloadLimits | 경로에서 이름을 만듦 |
| id: 9007199254740993 | String | 2^53을 넘으면 정확한 텍스트로 유지하고 알림 표시 |
이름과 어노테이션
키는 camelCase 속성 이름이 되어 max-conn은 maxConn입니다. Kotlin 하드 키워드에는 밑줄이 붙어 class는 class_가 됩니다. 이름이 키와 다르고 어노테이션이 켜져 있으면 @SerialName("max-conn")이 원래 키를 지키고, 꺼져 있으면 원래 키를 기억하는 곳이 없으므로 직접 매핑해야 합니다.
import는 코드가 쓰는 것에 맞춰 생성됩니다. kotlinx.serialization의 Serializable, SerialName, JsonElement입니다. 루트 목록은 typealias Payload = List<PayloadItem>이 되고, 빈 매핑은 매개변수 없는 클래스가 됩니다.
숫자 1.0, 병합 키, 문서
생성기는 YAML 표기가 아니라 평범한 숫자를 받으므로 ratio: 1.0 하나만 있으면 숫자 1이고 Long입니다. 같은 위치에 다른 소수가 더해지면(목록 [1.0, 2.5]나 1.0과 2.5를 가진 두 레코드) 타입은 Double이 됩니다.
병합 키는 기본으로 펼쳐지므로 <<: *defaults와 자기 키를 함께 쓴 매핑은 그 모두를 속성으로 갖고, 스위치를 끄면 <<에서 만든 속성이 중첩 클래스와 함께 나타납니다. 여러 문서는 목록으로 읽혀 typealias가 되고, 모든 문서에 없는 키는 널 허용이 됩니다.
실제 예시
service: api
port: 8080
debug: no
tags: [web, edge]
limits:
cpu: 0.5
region: ~import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement
@Serializable
data class Payload(
val service: String,
val port: Long,
val debug: String,
val tags: List<String>,
val limits: PayloadLimits,
)
@Serializable
data class PayloadLimits(
val cpu: Double,
val region: JsonElement? = null,
)debug: no는 YAML 1.2에서 String이고 port는 Long이며, null인 region은 기본값이 있는 널 허용 JsonElement가 됩니다.
max-conn: 5
class: x
list: [1, 2.5]
mixed: [1, two]import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement
@Serializable
data class Payload(
@SerialName("max-conn") val maxConn: Long,
@SerialName("class") val class_: String,
val list: List<Double>,
val mixed: List<JsonElement>,
)키워드 class는 @SerialName이 붙은 class_가 되고, 1과 2.5가 함께 있으면 List<Double>이며, mixed처럼 관계없는 타입은 List<JsonElement>로 돌아갑니다.
max-conn: 5
class: x
mixed: [1, two]package com.example
data class Payload(
val maxConn: Long,
val class_: String,
val mixed: List<Any>,
)패키지를 com.example로 정하고 kotlinx.serialization 어노테이션 스위치를 끈 경우입니다. import는 없지만 이름이 바뀐 속성이 max-conn과 class를 더는 기억하지 못합니다.
id: 1
name: a
---
id: 2import kotlinx.serialization.Serializable
typealias Payload = List<PayloadItem>
@Serializable
data class PayloadItem(
val id: Long,
val name: String? = null,
)자동 모드는 문서 둘을 목록으로 만듭니다. name은 한쪽에만 있어 기본값이 null인 널 허용 속성입니다.
ratio: 1.0
vals: [1.0, 2.5]
name: yesimport kotlinx.serialization.Serializable
@Serializable
data class Payload(
val ratio: Long,
val vals: List<Double>,
val name: String,
)ratio는 숫자 1이라 Long이고, vals에는 진짜 소수가 있어 List<Double>이며, yes는 텍스트입니다.
id: 9007199254740993
small: 5000000000import kotlinx.serialization.Serializable
@Serializable
data class Payload(
val id: String,
val small: Long,
)5000000000은 32비트를 넘지만 안전한 Long입니다. 더 큰 id는 숫자로 정확히 담을 수 없어 String이 되고, 텍스트로 유지했다는 알림이 나옵니다.
자주 하는 실수
1.0 하나는 Long 속성이 됨
생성기가 보는 것은 숫자 1이라서
ratio: 1.0은Long이 되고, 나중에 실제 1.5를 디코딩하면 실패합니다. 샘플에 소수 값을 넣거나 타입을 직접Double로 고치세요.어노테이션을 끄면 원래 키를 잃음
kotlinx.serialization 어노테이션을 끄면
@SerialName이 사라져max-conn이 키와 연결되지 않는maxConn속성이 됩니다. 어노테이션을 켜 두거나 직접 매핑을 추가하세요.JsonElement는 kotlinx.serialization에만 있음
알 수 없거나 섞인 값은
JsonElement로 적히며kotlinx-serialization-json의존성이 필요합니다. 쓰는 YAML 라이브러리가Any?를 준다면 어노테이션을 끄세요.선택 여부는 여러 매핑을 보고 추정
일부 매핑에 키가 없거나 null인 속성은
val name: Type? = null이 되어 키가 없어도 디코딩되며, 속성 순서는 YAML 그대로입니다. 샘플 레코드가 하나면 모든 키가 필수라서 키가 빠지면 디코더가 예외를 던지므로, 레코드를 여러 개 붙여 넣으세요.로더도 같은 YAML 규칙이어야 함
여기서
yes는String이고0123은 숫자 123입니다. YAML 1.1 로더는 이를true와 8진수 83으로 읽으므로, 디코딩에 쓰는 라이브러리가 같은 규칙인지 확인하거나 값을 따옴표로 감싸세요.날짜는 문자열
YAML 날짜는
String속성입니다. 날짜 타입이 필요하면 코드에서kotlinx-datetime이나java.time으로 파싱하세요.
자주 묻는 질문
최상위가 목록인 YAML도 되나요?
네. 루트 목록은 typealias Payload = List<PayloadItem>과 항목 클래스가 됩니다. 문서가 여러 개인 파일도 자동 모드에서는 이런 목록이 됩니다.
yes가 왜 String인가요?
YAML 1.2 코어 스키마에서는 true와 false만 불리언이라 yes, no, on, off는 일반 문자열이고 String 속성이 됩니다.
null은 어떻게 타입이 정해지나요?
다른 값과 함께 나오는 null은 타입을 널 허용(String?)으로 만듭니다. 늘 null뿐인 위치는 JsonElement? = null이 되고, 널 허용이거나 일부 매핑에 없는 속성은 기본값 = null을 갖습니다.
kotlinx.serialization 스위치는 무엇을 바꾸나요?
켜면 클래스에 @Serializable, 이름이 바뀐 키에 @SerialName이 붙고 알 수 없는 값은 JsonElement입니다. 끄면 알 수 없는 값이 Any인 평범한 data class가 되고 import가 없습니다.
병합 키도 펼치나요?
기본값은 펼침이라 <<: *anchor로 물려받은 키가 클래스의 속성이 됩니다. 병합 키 펼치기를 끄면 <<에서 만든 속성이 대신 나옵니다.
정수는 모두 Long인가요?
네, 2^53까지의 정수는 Long입니다. 더 큰 정수는 정확한 텍스트로 유지해 String이 되고 결과 아래에 알림이 나옵니다.
YAML이 업로드되나요?
아니요. 파싱과 코드 생성은 브라우저 탭 안에서 실행되며 서버로 전송되지 않습니다. 입력은 20MiB까지입니다.
마지막 업데이트:
