본문 바로가기


Java

[Kotlin] 우당탕쿵탕 CentralDogma Client 적용기

사용환경 : temurin 17, Boot 2.7.1, Centraldogma client 0.62.1

 

배포에 쓰이는 값은 아닌데 모든서버에서 공통적으로 사용하는 상수급 변수(?) 가 있다. 거의 변하진 않지만 변하면 모든 곳에서 변경해주어야 하는..? 그게 여러서버에 하드코딩되어 관리하고 있었는데 

시스템이 많아지고 복잡해지면서 공통화를 해야했다. 근데 이게 저장소 하나를 차지하고 있을만한 값은 또 아니라 이러 저러 고민을 하던 도중 Central Dogma 를 사용하게 됐다.

 

잡설 (적용코드만 보시려면 아래로)

솔직히 처음에는 이게뭐지? Spring cloud config 같은건가? 

라는 생각이 들었는데 대충 맞는 거긴했다. 그럼 나는 코프링을 쓰니까 그냥 spring cloud config 쓰면 되지 않나? 했는데 회사에 이미 띄워진 central dogma 서버가 있어서 이걸 사용하기로 했다. spring cloud config 다시 구성하려면 귀찮으닉간..

 

그래서 이제 내가 할일은 client 만 구현하면 됐다. 

오 개쉽겠당 ㅋ 했다 왜냐면 

 

클라이언트문서가 있었기 때문에

 

클라이언트 문서를 참고해서 열심히 작성했는데, 파일변화를 감지하는 watch 를 적용하려고 

Watcher<JsonNode> watcher =
        dogma.fileWatcher("myProj", "myRepo",
                          Query.ofJsonPath("/some_file.json", "$.foo"));

문서에는 이렇게 나와있어서 작성을 해보았더니

그렇다! deprecated 되어있었다.

 

근데 위쪽에 watchFile 이라고 비슷해 보이는데.. 싶은 메소드가 있었다. 

이건 왜 하나만 deprecated 안되어있지?? 

어 그럼 저 메소드를 쓰면 되나? 근데 또 그건 아닌거 같기도하고;

근데 사실 deprecated 됐어도 쓰면 돌아가긴하잖아.ㅎ

 

아무튼 뭐 이러저러 고민이 생겼는데 deprecated 된걸 쓰는건 좀 아닌 거 같기도 해서 예제코드를 찾아봤는데 찾는게 쉽지는 않았다. 어딘가에 있는데 내가 못찾은 걸수도 있지만 공식문서 페이지가 최신화가 되어있으면 좋았으면 하는 아쉬움이 있었다. 물론 api도큐먼트는 최신버전까지 나와 있다.

 

deprecated 위 주석에 나와 있는 힌트를 바탕을 코드분석을 살짝 하면서 코드를 적용했다.

사실 디스코드가 있어서 물어보려고 들어갔었는데 kr 방에 아무대화도 없어서 파워 I 나는 튕겨져나왔다.

 

최신버전의 코드를 직접 확인하면서 이해한 바는 이랬다 CentralDogmaRepository 라는 걸로 Repo 의 정보를 로드(?) 한 뒤 어차피 센트럴 도그마에 쌓이는 커밋이 깃처럼 레포단위기 때문에 그 안에서 필요에 맞는 Request (ex. watch, commit, merge.... etc) 를 파일패스나 여타 파라미터를 통해 획득한 뒤 알맞은 동작을 수행하는 방식인 것 같다. 그리고 내부적으로 Latest 라는 객체를 사용하고 있다.

 

Central dogma 클라이언트 적용 코드

일단 라이브러리 의존성 추가

implementation("com.linecorp.centraldogma:centraldogma-client-armeria:_")

boot-starter 라이브러리를 따로 제공해서 부트 사용시에 컨피그를 쬐끔 더 편하게 해주기는 하는데 해당 라이브러리는 사용하지 않은점 참고!

 

 

솔직히 나도 이게 정확한 코드인지는 잘 모르겠고 의도한대로 돌아가긴한다.

central dogma 는 컨피그에서 빈으로 생성해 두었다. 설정법은 여러가지일테니 편한방법으로 적용하면 될듯

class DogmaExample(
    centralDogma: CentralDogma,
) {
    private final val executor = ScheduledThreadPoolExecutor(1)
    private val repo = centralDogma.forRepo(PROJECT, REPO)

    private final val watcher = repo.watcher(Query.ofJsonPath(FILEPATH))
        .delayOnSuccessMillis(5000)
        .start()

    private var value: JsonNode 

    init {
        value = watcher.awaitInitialValue().value()
    }
    @PostConstruct
    fun update() {
        executor.scheduleAtFixedRate({
          values = watcher.latestValue()
        }, 0, 5, TimeUnit.SECONDS)
    }
}

내가 Query 에 Json 을 넘겨줘서 JsonNode로 오는 거고 다양한 타입을 지원하는 것 같다.

 

코드 설명을 살짝하면 watcher.start() 를 하면 내부적으로 executor 가 돌면서 watch 를 하는 것 같고 그러면서 latest 를 업데이트 해주더라 그래서 실제로 계속 해서 최신값을 서버로 가져오려면 latest 값을 가져오는 코드를 따로 짜줘야한다.
내코드처럼 ScheduledThreadPoolExecutor 를 쓰든지 포문을 돌리든지 등등 많은 방법이 있을 것 같다. 

 

REVISION.INIT/HEAD 관련된 내용은 이해가 안가더라 잘 아시는분 설명좀 부탁드립니다.

그리고 사실 내가 딱 쓰려는 기능정도의 것이라면 S3 를 사용하는 것도 간편할 것 같다는 생각도 들었다. S3 업로드해놓고 주기적으로 서버에서 폴링하는방식?

 

 

 

끝!