---
title: "클로저 풀스택"
url: "https://notes.junghanacs.com/notes/20250207T123109"
author: "Junghan Kim"
date: "2025-02-07T12:31:00+09:00"
lastmod: "2025-02-07T12:31:00+09:00"
tags: ["bib","clojure"]
description: "클로저 풀스택 개발의 전체 그림을 서버와 UI 도구 관점에서 모아 본 노트이다."
---

> [!abstract] 이 노트에 대하여
> 
> Ring과 Reagent, Malli, Reitit 같은 라이브러리를 중심으로 Clojure 풀스택 개발 지형을 그려 본다. 백엔드와 프론트엔드, 데이터 검증이 한 흐름에서 이어진다.

## BIBLIOGRAPHY

- “Kit-Clj/Kit Lightweight, Modular Framework for Scalable Web Development in Clojure.” 2024. <https://github.com/kit-clj/kit>.
- “Metosin/Malli High-Performance Data-Driven Data Specification Library for Clojure/Script.” 2025. <https://github.com/metosin/malli>.
- “Metosin/Reitit a Fast Data-Driven Routing Library for Clojure/Script.” 2025. <https://github.com/metosin/reitit>.
- “Pitch-Io/Uix: Idiomatic Clojurescript Interface to Modern React.Js.” 2025. <https://github.com/pitch-io/uix>.
- “Reagent-Project/Reagent a Minimalistic Clojurescript Interface to React.Js.” 2025. <https://github.com/reagent-project/reagent>.
- “Ring-Clojure/Ring Clojure Http Server Abstraction.” 2025. <https://github.com/ring-clojure/ring>.

## 관련노트

-   [#클로저](https://notes.junghanacs.com/meta/20230729T052700)
-   [#Reagent: #인터페이스 #클로저스크립트 #리엑트](https://notes.junghanacs.com/notes/20230925T153600)

## 히스토리

-   [2025-02-07 Fri 12:31] 알려준 정보를 바탕으로 전체 그림을 그려본다면?!

## 관련 리포지토리

[2025-02-07 Fri 12:32]

### pitch-io/uix: Idiomatic ClojureScript interface to modern React.js

([“Pitch-Io/Uix: Idiomatic Clojurescript Interface to Modern React.Js” 2025](https://notes.junghanacs.com/notes/20250207T123109#citeproc_bib_item_4))

### ring-clojure/ring Clojure HTTP server abstraction

([“Ring-Clojure/Ring Clojure Http Server Abstraction” 2025](https://notes.junghanacs.com/notes/20250207T123109#citeproc_bib_item_6))

-   Clojure HTTP server abstraction

### reagent-project/reagent A minimalistic ClojureScript interface to React.js

([“Reagent-Project/Reagent a Minimalistic Clojurescript Interface to React.Js” 2025](https://notes.junghanacs.com/notes/20250207T123109#citeproc_bib_item_5))

-   A minimalistic ClojureScript interface to React.js

### metosin/malli High-performance data-driven data specification library for Clojure/Script

([“Metosin/Malli High-Performance Data-Driven Data Specification Library for Clojure/Script” 2025](https://notes.junghanacs.com/notes/20250207T123109#citeproc_bib_item_2))

-   High-performance data-driven data specification library for Clojure/Script.

### metosin/reitit A fast data-driven routing library for Clojure/Script

([“Metosin/Reitit a Fast Data-Driven Routing Library for Clojure/Script” 2025](https://notes.junghanacs.com/notes/20250207T123109#citeproc_bib_item_3))

-   A fast data-driven routing library for Clojure/Script

## [2025-02-07 W05](https://notes.junghanacs.com/journal/20250203T000000)

@user 다음의 정보를 바탕으로 클로저 풀스택을 어떻게 구성할 수 있을까?

클로저 개발 시 프레임워크는 따로 쓰지 않고 사용중인 라이브러리를 말씀드리면

-   ring (server)
-   reitit (router)
-   malli (data schema)
-   uix + reagent (react 인터롭 + 프론트)

@assistant 클로저 풀스택 구성은 다음과 같이 할 수 있습니다:

백엔드:

-   Ring을 사용하여 HTTP 서버 구축
-   Reitit으로 라우팅 처리
-   Malli로 데이터 스키마 정의 및 검증

프론트엔드:

-   UIx와 Reagent를 활용하여 React 기반 UI 구현
-   ClojureScript로 컴파일하여 브라우저에서 실행

이 구성은 프레임워크 없이 필요한 라이브러리만 조합하여 유연하고 가벼운 풀스택 애플리케이션을 만들 수 있게 해줍니다. 백엔드와 프론트엔드 모두 클로저를 사용하므로 코드 재사용성이 높고 개발 효율성도 좋습니다.

Citations: [1] <https://green-labs.github.io/start-your-clojure-project-now-2/> [8] <https://green-labs.github.io/start-your-clojure-project-now-1/>

@user 혹시 유사한 구성을 가진 코드 베이스를 찾아봐줄래?

@assistant 네, 유사한 구성을 가진 코드 베이스를 찾아보았습니다. 주어진 검색 결과 중 [2]번 링크의 GitHub 저장소가 가장 유사한 구성을 보여줍니다:

<https://github.com/metosin/reitit/blob/master/examples/ring-malli-swagger/src/example/server.clj>

이 예제는 다음과 같은 유사점을 가집니다:

1.  Ring을 사용한 HTTP 서버 구축
2.  Reitit을 이용한 라우팅
3.  Malli를 사용한 데이터 스키마 정의
4.  Swagger UI 통합

이 예제는 당신이 언급한 라이브러리들(ring, reitit, malli)을 모두 사용하고 있으며, 풀스택 애플리케이션의 백엔드 부분을 구현하고 있습니다. 프론트엔드 부분(UIx + reagent)은 포함되어 있지 않지만, 백엔드 구조는 매우 유사합니다.

Citations: [1] <https://www.gdsanadevlog.com/planguages/swift/aboutswift/about-swift-%ED%81%B4%EB%A1%9C%EC%A0%80-closure/> [2] <https://github.com/metosin/reitit/blob/master/examples/ring-malli-swagger/src/example/server.clj> [3] <https://geundung.dev/125> [4] <https://github.com/metosin/reitit/blob/master/doc/ring/default_middleware.md> [5] <https://green-labs.github.io/is-clojure-hard-to-read/> [6] <https://www.youtube.com/watch?v=SMd-a8yJ13U> [7] <https://green-labs.github.io/start-your-clojure-project-now-2/> [8] <https://front-to-fullstack.tistory.com> [10] <https://www.youtube.com/watch?v=4hhlfq3Uy6U>

@user 위에서 다음 부분은 어떤 이야기지? reagent로 react를 어떻게 한다는 말인지?

uix + reagent (react 인터롭 + 프론트)

@assistant 이 부분은 ClojureScript에서 React를 사용하는 방법에 대해 설명하고 있습니다:

1.  Reagent: ClojureScript에서 React를 더 쉽게 사용할 수 있게 해주는 라이브러리입니다. Reagent는 React 컴포넌트를 ClojureScript 스타일로 작성할 수 있게 해줍니다.

2.  UIx: React 컴포넌트를 ClojureScript에서 직접 사용할 수 있게 해주는 라이브러리입니다. 이를 통해 기존 React 라이브러리나 컴포넌트를 ClojureScript 프로젝트에서 쉽게 활용할 수 있습니다.

3.  React 인터롭: UIx를 통해 React와 ClojureScript 간의 상호운용성(interoperability)을 제공합니다.

4.  프론트: 이 조합으로 프론트엔드 개발을 ClojureScript로 할 수 있다는 의미입니다.

즉, UIx와 Reagent를 함께 사용하면 ClojureScript로 React 기반의 프론트엔드를 개발할 수 있으며, 기존 React 생태계의 이점도 활용할 수 있습니다.

Citations: [1] <https://ko.legacy.reactjs.org/docs/conditional-rendering.html> [2] <https://www.learn-clojurescript.com/section-5/lesson-28-using-react-via-reagent/> [3] <https://reagent-project.github.io> [4] <https://github.com/reagent-project/reagent/blob/master/doc/InteropWithReact.md> [5] <https://ko.legacy.reactjs.org/docs/reconciliation.html> [6] <https://groups.google.com/g/clojure-kr/c/rgTZyOdiZTA> [7] <https://groups.google.com/g/clojure-kr/c/Psl4U1LTE4A>

@user 왜 UIx와 Reagent가 둘다 필요한거야? 같은 목적의 라이브러리가 아닌가 싶어서

@assistant UIx와 Reagent는 비슷한 목적을 가지고 있지만 약간 다른 역할을 합니다:

1.  Reagent: ClojureScript에서 React를 더 쉽게 사용할 수 있게 해주는 라이브러리입니다. Clojure 스타일로 React 컴포넌트를 작성할 수 있게 해줍니다.

2.  UIx: React 컴포넌트를 ClojureScript에서 직접 사용할 수 있게 해주는 라이브러리입니다. 기존 React 라이브러리나 컴포넌트를 ClojureScript 프로젝트에서 쉽게 활용할 수 있게 해줍니다.

두 라이브러리를 함께 사용하면 Clojure 스타일의 개발과 기존 React 생태계의 이점을 동시에 활용할 수 있습니다. Reagent로 ClojureScript 스타일의 컴포넌트를 작성하면서, UIx를 통해 필요한 React 컴포넌트를 직접 가져와 사용할 수 있습니다.

Citations: [1] <https://inis.iaea.org/records/k9ky6-t2760/files/29052730.pdf?download=1> [2] <https://patents.google.com/patent/KR20160083849A/en> [3] <https://inis.iaea.org/records/cjq5e-08009/files/30045457.pdf?download=1> [4] <https://ksgd.org/file/forum/vol03.pdf> [5] <https://www.ust.ac.kr/prog/ustProfsr/campus/sub49_04/view.do;jsessionid=D65616DC42A954BD62299F1792C5FF6C> [6] <https://patents.google.com/patent/KR20220149716A/en> [7] <https://koreascience.kr/article/JAKO199713464517290.pdf> [8] <https://djtp.or.kr/attachFiles/board/0101/23fc6859b29de942f02dbfd01e9ffde7.pdf> [9] <https://app.jove.com/t/58079/dynamic-proteomic-and-mirna-analysis-of-polysomes-from-isolated-mouse-heart-after-langendorff-perfusion?language=Korean> [10] <https://blog.naver.com/PostView.nhn?blogId=chembychem&logNo=222142421493>

@user 다음에서 말하는 클로저 라이브러리의 깃허브 주소를 알려줄래?

-   Ring을 사용하여 HTTP 서버 구축
-   Reitit으로 라우팅 처리
-   Malli로 데이터 스키마 정의 및 검증

@assistant 각 라이브러리의 GitHub 주소는 다음과 같습니다:

1.  Ring (HTTP 서버): <https://github.com/ring-clojure/ring>

2.  Reitit (라우팅): <https://github.com/metosin/reitit>

3.  Malli (데이터 스키마): <https://github.com/metosin/malli>

이 링크들을 통해 각 라이브러리의 공식 문서와 예제 코드를 확인할 수 있습니다.

@user 위에서 말한 풀스택을 kit-clj/kit 활용할 수 있는가?

@assistant 네, kit-clj/kit을 활용하여 위에서 언급한 풀스택을 구성할 수 있습니다. kit-clj는 Clojure 프로젝트 템플릿으로, Ring, Reitit, Malli 등을 포함한 다양한 라이브러리를 쉽게 통합할 수 있도록 설계되었습니다. kit-clj를 사용하면 초기 설정 시간을 크게 단축할 수 있으며, 위에서 설명한 풀스택 구조를 빠르게 구축할 수 있습니다.

Citations: [1] <https://github.com/kit-clj/kit> [2] <https://github.com/kit-clj/kit-template> [3] <https://github.com/kit-clj/kit-docs> [4] <https://github.com/kit-clj/kit-clj.github.io> [5] <https://github.com/kit-clj/kit-clj.github.io/blob/master/content/docs/tutorials/basic-tutorial.md> [6] <https://github.com/kit-clj/kit-clj.github.io/blob/master/content/docs/tutorials/advanced-tutorial.md> [7] <https://github.com/kit-clj/kit-clj.github.io/blob/master/content/docs/tutorials/deployment.md> [8] <https://github.com/kit-clj/kit-clj.github.io/blob/master/content/docs/tutorials/testing.md> [9] <https://github.com/kit-clj/kit-clj.github.io/blob/master/content/docs/tutorials/clojurescript.md> [10] <https://github.com/kit-clj/kit-clj.github.io/blob/master/content/docs/tutorials/clojurescript-advanced.md>

@user UIx와 Reagent는 kit에서 통합할 수 있는가?

@user

## kit-clj/kit Lightweight, modular framework for scalable web development in Clojure :2024

([“Kit-Clj/Kit Lightweight, Modular Framework for Scalable Web Development in Clojure” 2024](https://notes.junghanacs.com/notes/20250207T123109#citeproc_bib_item_1))

-   Lightweight, modular framework for scalable web development in Clojure

## 정리\*

-   React Native + ClojureScript 모바일 앱 → Clojure 기반 REST/GraphQL 백엔드가 아주 좋은 궁합.
-   (Ring, Compojure/Reitit, Lacinia, next.jdbc 등으로 빠르고 견고하게 구현!)
-   인증/실시간도 Clojure로 모두 가능.
-   개발-배포까지 JVM 생태계 활용, Docker 등 현대적 방식을 그대로 쓸 수 있음.

---

**llm: Perplexity, GPT-4 turbo (2024-06)**

--- Perplexity로부터의 답변: pplx.ai/share
