본문 바로가기

프로그래밍 고찰/고찰

[고찰] Why Data-Driven?

"데이터는 데이터다" 이는 Clojure 에서 중요한 개념이며, 요즘 유행하는 불변 Record 를 활용한 디자인도 이러한 "데이터" 의 강점을 활용하는 디자인이라고 생각한다.

데이터의 강점을 활용하기 위하여 DSL 을 "데이터" 로 표현하는 방법이 꽤 많이 존재하는데 (Free 모나드도 그러한 특성을 조금 지니는듯..?)

데이터의 장점을 뽑자면 여러가지가 있다,

  • 언어 독립적 (-> 디커플링적인 요소로써 활용이 가능하다)
  • 선언적인 표현이 가능
  • 가공할수있다! (Code as Data / Data as Code 도 Data 의 장점을 프로그래밍 언어에서 십분 활용하는 Feature 라고 생각)

물론 함수가 1급 시민인 FP 에서는 함수자체를 컨트롤할수있는 요소로써 사용할수있지만, "데이터" 그 자체가 가지는 독립성이나 가공용이성은 우월하다.

 

.... 라는 내용들을 Data-Driven Programing (DDD 아님!) 을 공부하다보면 많이 보는데, 사실 저러한 내용만으로 체감하기는 힘들다. 그와중에 Reitit 의 기본 가이드를 보다가 아하! 하게된 요소를 소개하고자 한다.

Clojure 에서 요즘 유행하는 Router 는 Reitit 이다, 예전에는 Compojure 를 많이썻는데, 요즘 Reitit 로 많이 넘어간듯하다 (Luminus 도 기본 라우터를 Reitit 로 변경하였다)

;Compojure
(defroutes app
  (GET "/" [] "<h1>Hello World</h1>")
  (route/not-found "<h1>Page not found</h1>"))
  
;reitit
(def router
  (r/router
    [["/api/ping" ::ping]
     ["/api/orders/:id" ::order]]))

위 예시는 각 라우트 라이브러리의 가장 기본 예시를 가져온것으로 확실한 차이가 있다.

Compojure 는 defroutes (메크로) 에 함수를 이용하고, Reitit는 Clojure 의 자료구조를 이용한다.

  • Compojure : Compojure is a small routing library for Ring that allows web applications to be composed of small
    , independent parts.
  • Reitit : A fast data-driven router for Clojure(Script).

물론 나는 Clojure 개초보 이므로.. 두개의 명확한 장단점을 소개하거나, 구체적인 사용법을 아는것은 아니므로 두개의 설명을 여기서 마치고,

아무튼 Reitit 는 data-driven 이라는것!, 데이터로써 선언적으로 정의하고, 이를 라우터가 알아서 하므로, 우리는 적당한 데이터만 만들면된다!

data-driven -> 데이터 사용 -> (Clojure 의) 데이터구조 사용 -> 가공이 가능 하므로 다음과 같은게 가능하다.

Reitit 의 Basics 에서 발최

Routes are just data!

 

단순히 데이터 자료구조형식만 만들어서 넘겨주면 되는것이므로, 내가 함수든! 뭐든! 직접 데이터를 기술하든! 뭘하던 상관이없다. 난 데이터를 만들어서 주기만 하면된다!

그렇기 때문에 위의 cqrs-routes 함수를 통하여 데이터를 만들어도 된다! 아래 블록의 사용 예시처럼 (생성된 데이터는 주석 참고) 데이터를 만들도록 내가 커스터마이징(가공) 할수있다. 물론 함수도 커스터마이징 할 수 있고, 뭐든지 어찌됫든 커스터마이징 할수야 있겠으나, "데이터" 만큼 가공이 편하고 명확하고 쉬운것은 없다.

 

이게 Just Data! 의 강점이 아닌가 싶다.

728x90