search:

HOCON 파일, pureconfig, pyhocon

06 Aug 2018

근 5개월 만에 포스팅을 한다. 주로 나중에 참고할 것들을 블로그에 적곤했었는데, 최근에는 정리할 시간도 없고 허접한 내용을 포스팅하기도 그래서 혼자만 참고할 용량으로 비공개된 곳에 간단한 snippet 정도만 올리고 있었다. (이것도 이런 저런 테스트를 많이 해봤는데 현재까지의 결론은 gitlab에 private repository를 하나 만들고 그곳의 이슈에 정리를 하는 게 제일 좋은 듯 하다)

암튼 약간의 저녁있는 삶이 생겨서 간단하게, 편한 톤으로 간만에 포스팅을 해본다

HOCON 파일

HOHON 파일은 Human-Optimized Config Object Notation의 약자로서, Lightbend (예전엔 Typesafe)라는 회사에서 만든 포맷이다. Lightbend는 무려 scala 언어의 창시자인 Martin Odersky 교수님이 만든 회사이다.

처음에 HOCON 파일을 보면 “뭐 이거 덜 정의되다 만 것 같은 포맷이 있지?”라는 생각이 드는데, 사용해보면 사용해볼 수록 JSON이나 yaml보다는 편하다는 것을 느낄 수 있다.

특히 다른 키 값 치환, 쉘 환경 변수 참조, 외부 파일 include 기능들은 JSON 등에서 찾기 어려운 기능이다.

어떻게 생긴 포맷인지는 Lightbend에서도 informar한 정의하고 하는 이 문서를 읽으면 많은 도움이 된다.

pureconfig

pureconfig라는 것은 Stackoverflow의 답변에서 알게되었다.

설정 파일을 class로 매핑해서 object instantiate하는 것은 번거로운 일인데 pureconfig를 이용하면 이를 쉽게할 수 있다.

예를 들어 다음과 같은 migration.conf라는 가상의 설정 파일이 있다고 하자. 각 설정이 의미하는 바는 주석으로 달아 놓았다. (JSON 기본 문법에는 주석이 없어서 JSON으로 설정 파일을 만들면 주석을 parser에 따라 주석을 달기 불가능한 것도 있다)

// sourceDB로부터
sourceDB {
    name = db1
    table = tbl1
    user = username
    pass = password
}

// where 조건을 만족하는 레코드를 찾아서
where = "WHERE salary > 10000"

// 아래의 필드들을
fields = ["field1", "field2", "field3"]

// targetDB로 옮긴다
targetDB {
    name = db2
    table = tbl2
    user = user2
    pass = pass2
}

// migration된 결과를 리포트한다
reportMigrationResult = true

이제 위와 같은 설정을 scala의 객체로 만들어보자. 우선 아래와 같은 case class를 만든다.

case class DB(name: String,
              table: String,
              user: String,
              pass: String)

case class MigrationConfig(sourceDB: DB,
                           where: String,
                           fields: List[String],
                           targetDB: DB,
                           reportMigrationResult: Boolean)

로딩은 아래와 같이 할 수 있다.

val migrationConfig = pureconfig.loadConfigOrThrow[MigrationConfig](ConfigFactory.parseFile(new File(configPath)))

scala로 개발하면서 젤 어려운 게 build 환경 만드는 것이라서, github repository에 예제 code를 올려두었으니 참고 바란다.

pyhocon

시스템을 개발/운영하다보면 scala로 개발한 프로그램을 python이나 shell script로 실행하는 경우가 많은데, 1개의 설정 파일을 여러 개의 언어에서 읽어 사용하기는 쉽지 않다.

HOCON 파일은 pyhoco을 이용하여 python에서 읽을 수 있다. shell script에서는 HOCON을 바로 읽기 어렵기 때문에 key를 입력하면 value를 출력하는 간단한 python script를 만들어서 shell에서 호출하여 사용하면 편하다.

pyhocon은 문서를 보면 쉽게 사용할 수 있으므로 설명은 생략한다.