"데이터는 데이터다" 이는 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 의) 데이터구조 사용 -> 가공이 가능 하므로 다음과 같은게 가능하다.
Routes are just data!
단순히 데이터 자료구조형식만 만들어서 넘겨주면 되는것이므로, 내가 함수든! 뭐든! 직접 데이터를 기술하든! 뭘하던 상관이없다. 난 데이터를 만들어서 주기만 하면된다!
그렇기 때문에 위의 cqrs-routes 함수를 통하여 데이터를 만들어도 된다! 아래 블록의 사용 예시처럼 (생성된 데이터는 주석 참고) 데이터를 만들도록 내가 커스터마이징(가공) 할수있다. 물론 함수도 커스터마이징 할 수 있고, 뭐든지 어찌됫든 커스터마이징 할수야 있겠으나, "데이터" 만큼 가공이 편하고 명확하고 쉬운것은 없다.
이게 Just Data! 의 강점이 아닌가 싶다.
'프로그래밍 고찰 > 고찰' 카테고리의 다른 글
[책 리뷰] 유연한 소프트웨어를 만드는 설계 원칙 오버뷰 (0) | 2022.03.30 |
---|---|
[고찰] 나는 왜 Interal DSL를 이해하기 그토록 어려웠는가? [Feat. 마틴 파울러] (0) | 2021.08.21 |
[고찰] 힙스터 개발자 회고 (3) | 2021.05.25 |
[고찰] 확장 가능한 언어 (Extensible Programming Language) feat 모나드/메크로 (0) | 2021.05.04 |
[고찰] 함수형 미신 (5) | 2021.03.28 |