최근에 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이 아닙니다. Rubyconfig, HCL과 같이 config 내부에서 로직을 담을 수 있기 때문에 조건에 따른 또는 반복적인 Config 선언 등 확장성이 좋습니다.
예를들어 config 내부에서 if와 같은 Expressions을 사용할 수 있습니다.
name = "Swallow"
job {
title = "Sr. Nest Maker"
company = "Nests R Us"
yearsOfExperience = if (2 + 2 == 5) 1 else 2
}
Type Constraints
Config 내에서 각 설정에 대한 type을 명시하여 유효성을 검사할 수도 있습니다.
class Bird {
name: String(length >= 3) // 괄호 내부의 데이터는 Type validation의 조건
parent: String(this != name)
}
pigeon: Bird = new {
name = "Pigeon" // String이고 3 이상이기 때문에 통과함
parent = "Pigeon Sr."
}
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이 가지는 장점들이 더 부각되지 않을까 싶습니다.
레퍼런스도 잘 되어 있어서 관심 있으시다면 한번쯤은 경험해보시는 것을 추천합니다 😀