Do you need a config? Now, Pkl
최근에 Apple이 내부에서 사용하던 Configuration language를 오픈소스로 공개헀습니다. 바로 Pkl(피클)인데요, 과연 Pkl은 JSON과 YAML과 함께 Config계의 대표 주자가 될 수 있을까요?
오늘은 Pkl에 대해 알아봅니다.
name = "Swallow"
job {
title = "Sr. Nest Maker"
company = "Nests R Us"
yearsOfExperience = 2
}
Style
기본적으로 YAML 포맷을 많이 닮았습니다. 차이가 있다면 그룹 단위로 묶일 때 JSON 과 같이 중괄호로 묶어서 조금 더 경계가 명확하게 보일 수 있어서 좋네요.
Pkl / Json / Yaml
Dynamic Config
Pkl은 JSON, YAML과 같은 Static Config Format이 아닙니다. Rubyconfig1, HCL2과 같이 config 내부에서 로직을 담을 수 있기 때문에 조건에 따른 또는 반복적인 Config 선언 등 확장성이 좋습니다.
예를들어 config 내부에서 if와 같은 Expressions을 사용할 수 있습니다.
name = "Swallow"
job {
title = "Sr. Nest Maker"
company = "Nests R Us"
yearsOfExperience = if (2 + 2 == 5) 1 else 2
}
Built-in Validation
Config 내에서 각 설정에 대한 type을 명시하여 유효성을 검사할 수도 있습니다.
class Bird {
name: String(length >= 3) // 괄호 내부의 데이터는 Type validation의 조건
parent: String(this != name)
}
pigeon: Bird = new {
name = "Pigeon" // String이고 3 이상이기 때문에 통과함
parent = "Pigeon Sr."
}
이외에도 여러가지 형태의 validation 문법을 지원합니다.
module Person
name: String(!isEmpty)
age: Int(isBetween(0, 130))
zipCode: String(matches(Regex("\\d{5}")))
Binding Other Langs
사실 위 내용까지면 Ruby나 Kotlin DSL과 크게 다르지 않습니다. 다만 Pkl은 별도의 언어고 다른 언어로의 변환을 지원하기 때문에 특정 언어에 종속되지 않고 범용적으로 사용할 수 있다는 장점이 있습니다.
// Example of Golang
// https://github.com/apple/pkl-go
package application
type Application struct {
Hostname string `pkl:"hostname"`
Port uint16 `pkl:"port"`
Environment environment.Environment `pkl:"environment"`
Database *Database `pkl:"database"`
}
아직 Swift, Go, Java, Kotlin만 지원하지만 점차 확대되면 언어에 크게 상관 없이 동적인 Config를 공유하게 될 것 같습니다.
Pkl CLI
Installation
OS 별 설치는 Installation 문서를 참고하시기 바랍니다.
Usage
Pkl은 CLI 도구로도 제공됩니다. CLI 이용하면 pkl 파일을 쉽게 생성할 수 있고 대화형 쉘을 제공하기 때문에 REPL 루프가 포함됩니다.
# Render pkl module
pkl eval
# Start a REPL session
pkl repl
Conclusion
처음에는 JSON, YAML 같은 Static Config 생각하고 호기심에 접했지만 실제론 Rubyconfig와 같이 language라서 더 좋은 인상을 남긴 것 같습니다. 실제로 사용해볼 기회가 얼마나 있을지는 모르겠지만, k8s 등으로 많은 configration이 생기고 복잡성이 증가함에 따라 Pkl이 가지는 장점들이 더 부각되지 않을까 싶습니다.
레퍼런스도 잘 되어 있어서 관심 있으시다면 한번쯤은 경험해보시는 것을 추천합니다 :D