Clojure에서 웹 애플리케이션을 어떻게 만드나요? [닫은]


216

나는 이것이 Java로 매일 일하는 대다수의 프로그래머에게 이상한 질문이라고 생각합니다. 난 아니야 Java 프로젝트는 수행했지만 Java 프로젝트는 수행하지 않았기 때문에 Java 언어를 알고 있습니다. Java에서 웹 앱을 처음부터 만들지 않았습니다. 파이썬, 루비와 함께해야한다면, 어디로 가야할지 (Django 또는 Rails) 알고 있지만 Clojure에서 웹 응용 프로그램을 만들고 싶다면 Java 세계에 강요하기 때문에가 아니라 언어와 같은 언어를 사용 해보고 싶은데 어떤 라이브러리와 프레임 워크를 사용해야합니까?


1
Java Native API를 사용할 것인지 Clojure Native API를 사용할 것인지 궁금합니다.
Ande Turner

Ande :이 점에서 Java 세계에 대해 거의 알지 못했기 때문에 확실하지 않습니다 (그러나 이미 일하고있는 언어 인 Java를 사용하고 있습니다).
pupeno

이 질문이 Clojure 웹 프레임 워크 목록과 각각 하나의 답변으로 끝나고 누구나 좋아하는 투표를하면 좋을 것이라고 생각합니다. Meredydd 's는 확실히 Compojure의 답변이라고 생각합니다. Webjure를 위해 하나를 추가하고 비교해 보는 것이 좋습니다.
pupeno

푸 페노! "클로저가있는 웹 애플리케이션"을 검색하기 위해 여기 도착했습니다. 이 페이지는 Google의 첫 번째 결과입니다.
Sebastián Grignoli

답변:


104

지금까지 내가 만난 최고의 Clojure 웹 프레임 워크는 Compojure입니다 : http://github.com/weavejester/compojure/tree/master

작지만 강력하며 아름답고 우아한 구문이 있습니다. (이것은 후드 아래에서 Jetty를 사용하지만 원하지 않는 한 서블릿 API를 숨 깁니다. 해당 URL의 README를 확인한 다음 스냅 샷을 다운로드하고 재생을 시작하십시오.


16
Richard의 의견은이 답변을위한 것이 었습니까? 이해가되지 않습니다.
John Cromartie

26
@Richard 당신의 주장은 꽤 바보입니다. 예, Java 라이브러리를 사용하기로 결정하면 많은 경우에 기능을 포기하게됩니다. 그러나이 라이브러리의 요점은 다시는 할 필요가 없다는 것 입니다. 예를 들어, Ring은 서블릿을 둘러싼 Clojury 래퍼이므로 서블릿을 직접 사용할 필요가 없습니다. Clojure에서 완벽하게 사용할 수있는 Java 도구를 사용하기 편하게 만드는 대신 웹 개발 휠을 처음부터 다시 개발하도록 제안 하시겠습니까? 그 논리는 어디에 있습니까? 또한 이러한 라이브러리를 사용 하는 옵션 이 나쁜 이유는 무엇입니까? ...
Rayne

15
@Richard 당신의 모든 주장은 비 기능적 비 클로저 코드는 본질적으로 너무 나빠서 라이브러리 아래에 숨겨진 코드의 존재조차도 오염이라는 것을 의미합니다. 나는이 추론을 이해하지 못한다. 많은 Java 라이브러리는 유용하고 강력한 코드입니다. Clojure에서 우아하고 기능적으로 사용할 수있는 자체 래퍼 라이브러리를 제공 할 수있는 이유는 무엇입니까?
Rayne

10
@Richard, 순수 클로저 http 서버를 자유롭게 만드십시오.
gtrak

5
Lisp / Clojure 용어에서 함수에는 부작용이 없습니다. ( gigamonkeys.com/book/… 참조 ). 그러나 Lisp의 땅 ( landoflisp.com/trade_func.png ) 에서 지적했듯이 데이터베이스 레코드 작성, 파일 다운로드, 게시 등의 작업을 실제로 수행하는 데 부작용이 필요하기 때문에 순수한 기능의 프로그램은 일반적으로별로 유용하지 않습니다. REST 서버, 이미지 생성 등 ...
lfalin

179

Compojure는 더 이상 웹 응용 프로그램 개발을위한 완벽한 프레임 워크가 아닙니다. 0.4 릴리스 이후, compojure는 여러 프로젝트로 분리되었습니다.

은 HTTP 요청 및 응답 프로세스를 추상화하여 기초를 제공합니다. 링은 들어오는 요청을 구문 분석하고 요청의 모든 부분 (예 : uri, server-name 및 request-method)을 포함하는 맵을 생성합니다. 그런 다음 응용 프로그램은 요청을 처리하고 요청에 따라 응답을 생성합니다. 응답은 상태, 헤더 및 본문 키를 포함하는 맵으로 표시됩니다. 따라서 간단한 응용 프로그램은 다음과 같습니다.

(def app [req]
  (if (= "/home" (:uri req))
    {:status 200
     :body "<h3>Welcome Home</h3>"}
    {:status 200 
     :body "<a href='/home'>Go Home!</a>"}))

링의 또 다른 부분은 미들웨어의 개념입니다. 처리기와 수신 요청 및 / 또는 발신 응답 사이에있는 코드입니다. 내장 된 미들웨어에는 세션 및 스택 추적이 포함됩니다. 세션 미들웨어는 요청을하는 사용자에 대한 모든 세션 정보를 포함하는 : session 키를 요청 맵에 추가합니다. : session 키가 응답 맵에 있으면 현재 사용자가 다음에 요청한 내용에 대해 저장됩니다. 스택 추적 미들웨어는 요청을 처리하는 동안 발생하는 예외를 캡처하고 예외가 발생하면 응답으로 다시 전송되는 스택 추적을 생성합니다.

링으로 직접 작업하는 것은 번거로울 수 있으므로 Compojure 는 링 위에 세부 사항을 추상화하여 만들어졌습니다. 이제 응용 프로그램을 라우팅 측면에서 표현할 수 있으므로 다음과 같이 할 수 있습니다.

(defroutes my-routes
  (GET "/" [] "<h1>Hello all!</h1>")
  (GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))

Compojure는 여전히 요청 / 응답 맵을 사용하고 있으므로 필요한 경우 언제든지 액세스 할 수 있습니다.

(defroutes my-routes
  (GET "*" {uri :uri} 
           {:staus 200 :body (str "The uri of the current page is: " uri)}))

이 경우 {uri : uri} 부분은 요청 맵의 : uri 키에 액세스하여 uri를 해당 값으로 설정합니다.

마지막 구성 요소는 Hiccup 이며 HTML을 더 쉽게 생성 할 수 있습니다. 다양한 html 태그는 벡터로 표시되며 첫 번째 요소는 태그 이름을 나타내고 나머지는 태그의 본문입니다. "<h2>A header</h2>"됩니다 [:h2 "A Header"]. 태그의 속성은 선택적 맵에 있습니다. "<a href='/login'>Log In Page</a>"됩니다 [:a {:href "/login"} "Log In Page"]. 다음은 템플릿을 사용하여 html을 생성하는 작은 예입니다.

(defn layout [title & body]
  (html
    [:head [:title title]]
    [:body [:h1.header title] body])) 

(defn say-hello [name]
  (layout "Welcome Page" [:h3 (str "Hello " name)]))

(defn hiccup-routes
  (GET "/user/:name" [name] (say-hello name)))

다음은 compojure의 저자가 현재 작성하고있는 일부 문서의 초안에 대한 링크입니다. Compojure Doc


48

새로운 Clojure 웹 프레임 워크 인 "Noir"( http://www.webnoir.org/ ) 도 있습니다 (따라서 새로운 문서는 아직 없습니다). Django / Rails에서 온, 나는 간단하고 간단한 구문을 파고 꽤 마른입니다.


Webnoir는 실제로 정말 유용합니다! 시작하기가 매우 쉽습니다. 실제로 PHP를 개발하는 것처럼 약간 개발할 수 있습니다. 서버를 시작하고 (이번에는 leiningen으로) 파일을 편집하고 브라우저를 다시로드하여 얻은 것을 확인하십시오.
claj

@elithrar가 답변 한 이후, Noir는 이제 문서를 사용할 수 있습니다. webnoir.org/docs
Alistair Collins

18
기록상, 그것은 느와르가 더 이상 사용되지 않고 더 이상 유지되지 않는 것 같습니다 ....
SolarBear


20

현재 사용중인 웹 라이브러리는 이제 yada 입니다.

방금 시작한 경우 소개 서버는 Compojure입니다. apacheClojure 세계의 웹 서버 라고 생각합니다 (이 경우 yada / aleph는 nginx입니다). Luminus템플릿으로 사용할 수 있습니다 . 와 같은 변형이 있습니다 compojure-api.

나는 ou를 시도했고 Pedestal전 세계적으로 그것에 만족했다. 나는 그것을 마스터한다고 주장하지는 않지만 즐거운 구문을 가지고 있으며 매우 응집력이 있으며 훌륭한 성능을 가진 것처럼 보입니다. 또한 CognitectRich Hickey가 근무하는 Clojure / Datomic 회사의 지원을받습니다 .

내가 찾은 Aleph재미있는 추상화를 제공하고, 내장 된 배압 흥미로운 보인다. 나는 아직 그것을 가지고 놀지 않았지만 분명히 내 목록에 있습니다.

다양한 웹 서버로 비트를 재생 한 후 빠른 Pro / Cons 목록이 있습니다.

짧은 대답 : 빨리 시작하기 위해 Luminus 를 살펴보고 , 요구 사항이 진화함에 따라 다른 것으로 넘어갈 수 있습니다 (Yada).

Compojure

  • 찬성 (1) :

    • 쉽고 많은 템플릿 / 예 (예 : Luminous)
  • 단점 (2) :

    • 성능이 좋지 않음 (요청 당 스레드), 레일보다 약간 더 나은 성능을 기대
    • 간단하지는 않지만 미들웨어 모델에는 불편 함이 있습니다.

받침대

  • 찬성 (3) :

    • 인터셉터 모델, 경로의 서브 세트에 인터셉터를 추가하는 유쾌한 구문
    • 퍼포먼스 라우터
    • 아무 것도 묻지 않고 상자에서 투명하게 json / transit / multipart 형식을 지원합니다. 아주 멋지다!
  • 단점 (4) :

    • websocket을 지원하지 않지만 (아직) core.async 채널을 반환하면 좋을 것입니다.
    • Stuart Sierra의 구성 요소에 넣으면 조금 느리게 다시로드됩니다 (리로드 인터셉터를 사용해야한다고 생각합니다)
    • 비동기 인터셉터에 대한 테스트 기능이 없음
    • 바이 인 필요 (?)

알레프

프로 (3) :

  • 수행자
  • 배압
  • 매니 폴드 스트림을 리턴 할 때 웹 소켓 / SSE 지원

단점 (1) :

  • 저수준, 스스로 스타일을 만드십시오 (즉, 처리기가 무언가를 할 수있는 방법을 제공합니다. 라우터가없고 아무것도 없습니다). 실제로 단점은 아닙니다.

야다

프로 (3) :

  • 알레프에 내장
  • 콘텐츠 협상
  • 스와 거 통합
  • bidi는 꽤 괜찮습니다 (페데스탈 라우터 구문이 더 좋지만)

단점 (1) :

  • 문서화 (nginx-clojure만큼 나쁘지는 않지만 빠르게 향상 됨).

HttpKit

프로 (2) :

  • Clojure로 작성되었습니다! (그리고 자바 ...)
  • 성능이 좋아 보입니다 (600K 동시 연결 게시 참조)

단점 (2) :

  • CORS 지원 안함
  • 버그? 또한 최근 커밋이 많지 않습니다.

닌 크스 클로저

참고 : 나는 주로 문서가 없기 때문에 가지고 놀지 않았습니다. 흥미롭고 성능이 뛰어납니다.

찬성 (2) :

  • Nginx (성능, 오프로드 SSL, 작업자 재시작 ...)
  • 이 모델이 다운 타임 제로 업데이트를 허용 할 수 있습니까? 너무 멋져요!

단점 (1) :

  • 문서화 (개선). 또한 그것이 유일한 방법이라면 nginx 구성 파일에 포함 된 문자열로 프로그래밍하고 싶지 않습니다.
  • 아마도 첫 번째 배포 (?)를 약간 복잡하게 만듭니다.

불변

참고 : 나는 그것을 연주하지 않았습니다.

찬성 :

  • 통합 (캐싱, 메시징, 스케줄링, 와일드 플라이 배포)

단점 :

  • http 클라이언트 없음

카타 쿰바

참고 : 문서는 훌륭해 보이지만 함께 연주하지는 않았습니다. 아마 다음에 시도 할 것입니다. 흥미로운 채팅 프로젝트의 예가 있습니다. 프로토콜을 많이 사용하면 초보자 Clojure 개발자로서 처음으로 나를 화나게했습니다.

장점 (6) :

  • 설명서! 모든 funcool 프로젝트와 마찬가지로이 문서는 읽기 매우 즐겁습니다.
  • 받침 대형 라우팅 구문
  • 성능이 좋아야합니다 (Ratpack 상단에서)
  • 배압
  • websockets, sse, cors, 보안, ssl ...
  • 파는 독특한 기능 : 우편

단점 (2) :

  • ct / routes 구문이 얼마나 유쾌하고 링 스펙을 버리는 지에 대해 완전히 확실하지는 않습니다 (비동기 이야기이지만 필자는 받침대가 그것을 고쳤다 고 생각했습니다)
  • 어떻게 스웨거 등을 통합 할 것인지 잘 모르겠습니다.
  • 내가 그것을 시도했을 때, 나는 그것을 즉시 작동시킬 수 없었다

참고 : 원시 성능이 중요한 경우 Clojure 웹 서버벤치 마크를 사용할 수 있습니다.


훌륭한 비교. 그래도 nginx 은유가 어떻게 작동하는지 확실하지 않습니다 :)
matanster

1
@matanster 아파치를 많은 조직의 기본 이동 서버로 본다. 간단하고 많은 사람들에게 효과적입니다. 그러나 nginx보다 오래되었으며 다른 내부 모델을 사용합니다. Yada가 비동기 인 동안 Compojure는 동기식 (변경 될 수 있음)입니다. 내가 언급하지 않은 Yada의 또 다른 이점은 모든 것이 데이터라는 점입니다. 따라서 Compojure와 같은 매크로에 비해 작성 / 변환 / 검사 / 생성하기가 훨씬 쉽습니다.
nha

14

요즘 받침대 는 볼만한 가치가있는 프레임 워크입니다. 그것은 위에 구축되는 서버 측 프레임 워크 이지만 특정 요청을 일시 중지하고 재개 할 수있어 들어오는 요청을 초기 스레드에서 해제합니다 (그렇지 않으면 느린 요청은 실제로 해당 서버 스레드를 차단합니다). 아마도 JavaBean과 같은 것일 수도 있습니다.

다른 멋진 프레임 워크는 hoplon.io 및 David Nolen 's Om입니다 (React 기반).


11

Webjure , Clojure를위한 웹 프로그래밍 프레임 워크.

기능 : 디스패치 서블릿은 Clojure 함수를 호출합니다. 동적 HTML 생성. JDBC를 통한 SQL 쿼리 인터페이스

이 답변은 Webjure 정보의 자리 표시 자로 사용됩니다.


3
나는 이것이 좋은 예라고 확신하지 못한다. 코드베이스가 얕아 보이지만 Java로 작성되어 마크를 놓친 것으로 보입니다. 나는 순수한 클로저 프레임 워크를 기대했을 것이다.
Richard

8

Compojure는 내가 작은 블로그 애플리케이션을 구축하는 데 사용한 것입니다. 루비를위한 최소한의 경량 웹 프레임 워크 인 Sinatra에서 모델링되었습니다. 나는 주로 Sinatra와 같은 라우팅을 사용했습니다. 다음과 같습니다.

(GET "/post/:id/:slug"
  (some-function-that-returns-html :id :slug))

ORM 또는 템플릿 라이브러리는 없지만 벡터를 HTML로 변환하는 함수가 있습니다.



3

면책 조항 : 나는 저자입니다.

luminusweb과 밤나무 템플릿을 결합한 leiningen 템플릿을 구성했습니다. 따라서 프런트 엔드 및 백엔드 용 클로저 코드를 사용하여 클로저 코드를 작성할 수 있습니다.
또한 사용자 관리와 간단한 CRUD 생성 및 몇 가지 작은 기능을 제공합니다. https://github.com/sveri/closp


3

나는 내 두 센트에 던질거야 덕트 에서 또한, @weavejester , Compojure 및 링의 메인테이너.

핵심은 Component 와 Ring 라우터를 한 지붕 아래로 가져 오는 것 입니다. 내가 덕트를 사용하는 이유 :

  • 탁월한 철학적 토대 : 일련의 작은 구성 요소로 앱을 구축하도록 장려하며, 기본 설정을 제공하는 동시에 의견 수를 적게 유지하는 것 사이에 균형이 잘 맞습니다.
  • 안정적인 길 : 나는 스스로 이야기하지만, 수년에 걸쳐 Clojure 커뮤니티가 믿을 수없는 웹 프레임 워크를 제공한다고 느꼈습니다. 부부는 단순히“일을 끝내는 것”(길을 뛰어 넘는 것이 아니라는 것)에 대해 너무 실험적이라고 느꼈습니다 (Om과 클라이언트 측 받침대에 대한 나의 경험). 다른 한편으로, @weavejester가 커뮤니티에서 훌륭하게 탄생 한 Compojure and Ring과 동일한 안정성과 덕트 성능을 측정 한 것처럼 느껴집니다.
  • 그것은의 슈퍼 경량, 내 구성 요소의 방법 중.

주요 특징 :

  • 미니 웹 서버 (또는 HTTP 경로의 작은 횡단면)로 생각할 수있는 작은 구성 요소 인 "종점"으로 경로를 구성합니다.
  • Reloaded Workflow 에 대한 즉각적인 지원 .
  • Ring 및 Compojure와 완벽하게 통합됩니다.
  • 개발 및 생산 구성
  • 예제와 함께 좋은 문서.

참고 : 말할 필요도 없지만 대부분의 Clojurey와 같이 웹 개발 초보자를 위해 Duct는 Clojure 언어에 대한 확실한 이해가 필요합니다. 또한 Component에 대해 먼저 읽어 보는 것이 좋습니다.

또 다른 개인 메모에서, 나는 현재 몇 년 동안 여러 프로덕션 응용 프로그램에서 덕트를 사용 해 왔으며 매우 기쁘게 생각합니다.



2

또 다른 흥미로운 웹 서버는 Http-kit 입니다. 성능이 우수하고 링을 준수하며 WebSocket도 지원합니다. 그것은 주로 clojure로 만들어졌으며 Jetty / Tomcat의 이상한 것들이 부족합니다.

땜질하기 쉽습니다.


2

아마 당신이 찾고있는 것을 재구성하고 om.next.


1

Arachne 은 새로운 웹 프레임 워크입니다. 사이트 설명 인용 :

Arachne은 Clojure를위한 완전한 모듈 식 웹 개발 프레임 워크입니다. 편의성, 단순성 및 견고하고 확장 가능한 디자인을 강조합니다.

Rails와 유사한 "시작하기"경험을 제공한다고 주장 하는 킥 스타터 캠페인 이 있습니다. Cognitect에 의해 개발되었습니다.

여기 Luminus (yogthos)의 저자와 함께 좋은 토론이 있습니다.


1

나는 잠시 동안 프로덕션에서 Liberator를 성공적 으로 사용 했습니다. RESTful 웹 서비스 또는 이와 유사한 것을 구축하는 등 베어 본을 원한다면 훌륭한 프레임 워크입니다. 기본적으로 링 및 컴포지션의 래퍼이며 들어오는 요청의 유효성을 검사 할 때 결정 그래프를 제공합니다. 더 큰 다른 웹 프레임 워크에 비해 매우 빠릅니다. 어딘가에서 빠르게 시작하고 천천히 구축하려면 Liberator가 훌륭한 선택입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.