Do you need a config? Now, Pkl

Configuration that is Programmable, Scalable, and Safe

최근에 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

  1. rails 등에서 사용되는 config 

  2. hashicorp에서 만든 config