Java / Spring에서 Scala / Lift를 사용하는 이유는 무엇입니까? [닫은]


151

나는이 질문이 조금 열려 있음을 알고 있지만 Java / Spring의 대안으로 Scala / Lift를 보았으며 Scala / Lift가 어떤 이점을 가지고 있는지 궁금합니다. 내 관점과 경험에서 Java Annotations와 Spring은 실제로 응용 프로그램에 필요한 코딩 양을 최소화합니다. 스칼라 / 리프트가 그 점을 개선합니까?


질문이 너무 낡았습니다. 그러나 이제 질문은 "왜 Scala / Play over XYX를 사용해야합니까?"이며 많은 이유가 있습니다. 나는 Play로 이사했고 결코 뒤돌아 보지 않았다.
Jus12

답변:


113

우리가 스칼라와 자바에서 똑같이 편안하다고 가정하고 스프링이나 리프트와 관련된 것을 제외하고는 (거대한) 언어 차이를 무시하십시오.

Spring and Lift는 성숙도와 목표 측면에서 거의 정반대입니다.

  • 봄은 리프트보다 약 5 살이 깁니다.
  • 리프트는 모 놀리 식이며 웹만 대상으로합니다. Spring은 모듈 식이며 웹 및 "일반"앱을 모두 대상으로합니다.
  • Spring은 다양한 Java EE 기능을 지원합니다. 리프트는 그 물건을 무시합니다

문장에서 Spring은 헤비급이고 Lift는 경량입니다. 충분한 의지와 자원을 사용하면 머리에 그것을 켤 수 있습니다,하지만 당신은 필요 많은 양의를.

두 프레임 워크로 작업 한 후 내 마음에 붙어있는 구체적인 차이점이 있습니다. 이것은 완전한 목록이 아니며, 어쨌든 컴파일 할 수 없습니다. 나에게 가장 흥미로 웠던 것 ...

  1. 철학보기

    Lift는 스 니펫 / 액션 메소드에 일부 뷰 자료를 배치하도록 권장합니다. 스 니펫 코드는 특히 프로그래밍 방식으로 생성 된 양식 요소, <div>s, <p>s 등 으로 뿌려집니다 .

    특히 Scala에는 언어 수준의 XML 모드가 내장되어 있기 때문에 강력하고 유용합니다. 중괄호에 변수 바인딩을 포함하여 Scala 메소드 내에 XML 인라인을 작성할 수 있습니다. 이는 매우 간단한 XML 서비스 또는 서비스 목업에 유쾌 할 수 있습니다. 템플릿이나 많은 수반하는 구성 없이도 하나의 아주 단순한 파일로 HTTP 응답 작업 모음을 모두 제거 할 수 있습니다. 단점은 복잡성입니다. 당신이 얼마나 멀리 가느냐에 따라, 관점과 논리 사이에 퍼지 문제가 퍼지거나 분리되지 않습니다.

    대조적으로, 웹 애플리케이션에 Spring을 정기적으로 사용하면 뷰와 다른 모든 것을 강력하게 분리 할 수 ​​있습니다. Spring이 여러 템플릿 엔진을 지원한다고 생각하지만 심각한 것은 JSP 만 사용했습니다. JSP로 리프트에서 영감을 얻은 "퍼지 MVC"디자인을하는 것은 광기 일 것입니다. 이것은 방금 읽고 이해하는 시간이 압도적 일 수있는 대규모 프로젝트에서 좋은 것입니다.

  2. 객체 관계형 매퍼 선택

    Lift의 내장 ORM은 "매퍼"입니다. "레코드"라고하는 다른 대안이 있지만 여전히 프리 알파로 간주되는 것 같습니다. LiftWeb Book에는 Mapper와 JPA 사용에 대한 섹션이 있습니다.

    리프트의 CRUDify 기능은 멋지고 맵퍼 (JPA는 아님)에서만 작동합니다.

    물론 Spring은 표준 및 / 또는 성숙한 데이터베이스 기술을 광범위하게 지원합니다 . 실 용어는 "지지하다"입니다. 이론적으로 Scala에서 임의의 Java 코드를 호출 할 수 있으므로 Lift와 함께 모든 Java ORM을 사용할 수 있습니다. 그러나 Lift는 실제로 Mapper와 JPA 만 지원합니다. 또한 스칼라에서 사소한 Java 코드 작업은 현재처럼 원활하지 않습니다. Java ORM을 사용하면 Java 및 Scala 콜렉션을 모두 사용하거나 Java 컴포넌트 내외부에서 모든 콜렉션을 변환 할 수 있습니다.

  3. 구성

    Lift 앱은 애플리케이션 전체의 "부팅"클래스를 통해 거의 완전히 구성됩니다. 즉, 구성은 스칼라 코드를 통해 수행됩니다. 이것은 간단한 구성을 가진 프로젝트에 적합하며 구성을 수행하는 사람이 편하게 편집 할 수있는 스칼라입니다.

    스프링은 구성 측면에서 매우 유연합니다. 많은 conf 옵션은 XML 구성 또는 주석을 통해 구동 될 수 있습니다.

  4. 선적 서류 비치

    Lift의 문서는 젊습니다. Spring의 문서는 꽤 성숙하다. 컨테스트가 없습니다.

    Spring의 문서는 이미 잘 정리되어 있고 찾기 쉽기 때문에 Lift에서 찾은 문서를 검토하겠습니다. 기본적으로 Lift 문서에는 LiftWeb Book , API Docs , LiftWeb Google 그룹 및 " 시작하기 "의 4 가지 소스가 있습니다. 멋진 코드 예제 모음도 있지만 "문서"라고 부르지는 않습니다.

    API 문서가 불완전합니다. LiftWeb Book은 나무에 출판되었지만 온라인에서도 무료로 이용할 수 있습니다. 결정적인 교훈적인 스타일이 때때로 나를 화나게했지만 실제로는 유용합니다. 튜토리얼이 길고 계약이 짧습니다. 스프링에는 적절한 매뉴얼이 있으며, 리프트에는 없습니다.

    그러나 Lift에는 좋은 예가 있습니다. 리프트 코드와 예제 코드를 읽고 편하고 이미 스칼라를 잘 알고 있다면 상당히 짧은 순서로 문제를 해결할 수 있습니다.

두 프레임 워크 모두 매력적입니다. 하나를 선택하고 잘 수행 할 수있는 광범위한 앱이 있습니다.


10
좋은 대답, 내가 동의하지 않는 한 가지 점은 봄은 헤비급입니다. 광범위한 우수한 API가 있으며 좋은 결과를 얻는 데 필요한 특정 구조적 작업 방법을 강요하지만 J2EE와 비교하면 원래보다 훨씬 가벼운 솔루션입니다. 물론 "가벼움"은 보는 사람의 눈에 있으므로 이것은 주관적인 주장입니다. 그때 내 2 센트 만.
Brian

3
좋은 답변, 매우 객관적입니다. 리프트는 너무 똑똑해 보이는 것들을 너무 많이합니다. 페이지 로직을 백엔드로 옮기고 HTML을 스칼라 코드에 혼합하여 페이지 템플릿 내의 제어 태그보다 나쁩니다. 왜 그들이 이것을했는지 모르겠습니다. 아마도 Scala가 XML을 놀랍도록 빠르게 처리해야한다고 생각합니다. "올바른 결정 가이드"는 내가 읽은 최악의 기술 서적입니다.
소여

나는 원하는만큼 리프트에 익숙하지 않습니다. xml 파일에서 설정을 읽는 부트 객체의 래퍼를 만드는 것이 얼마나 어려울까요? 내 첫 인상은 스칼라는 XML을 즉시 처리하므로 예외적으로 어렵지 않다는 것입니다.
Ape-inago

Sawyer, HTML을 스칼라 코드에 혼합 할 수 있다는 사실은 반드시 그렇지 않다고 말합니다. 스마트 한 방식으로 스 니펫을 사용하면 HTML과 스칼라 코드가 분리됩니다. 그러나, 제어 태그를 계속 사용하십시오;)
Alebon

1
@ Dan, Lift가 처음 쓸 때보 다 두 배나 오래된 업데이트가 있습니까?
Pacerier

229

Dan LaRocque의 답변에 강력하게 동의하지 않는다고 말해야합니다.

리프트는 모 놀리식이 아닙니다. 개별 요소로 구성됩니다. J / EE 요소를 무시하지 않고 JNDI, JTA, JPA 등을 지원합니다. 이러한 J / EE 요소를 강제로 사용하지 않는다는 사실은 Lift의 모듈 식 설계를 강력하게 나타냅니다.

  • Lift의 견해 철학은 "개발자가 결정하게한다". Lift는 뷰에서 논리 코드를 허용하지 않는 템플릿 메커니즘, 스칼라 코드 및 Scala의 XML 리터럴 실행을 기반으로하는 뷰 메커니즘 및 Scalate 기반 뷰 메커니즘을 제공 합니다. XML 템플릿 메커니즘을 선택하면 비즈니스 로직에 마크 업이 어느 정도 존재하는지 선택합니다. Lift의 XML 템플릿에서 비즈니스 로직을 표현할 수 없으므로 Lift의 뷰 분리는 Spring이 제공하는 것보다 강력합니다.
  • Lift 's Object ↔ 지속성 철학은 "개발자가 결정하게한다". Lift에는 ActiveRecord 스타일 객체 관계형 매퍼 인 Mapper가 있습니다. 소규모 프로젝트를 위해 작업이 완료됩니다. 지원 JPA를 드십시오. Lift에는 관계형 데이터베이스 내외부, NoSQL 저장소 내외부로 객체 셔틀을 지원하는 레코드 추상화 기능이 있습니다 (Lift에는 CouchDB 및 MongoDB에 대한 기본 지원이 포함되지만 어댑터 계층은 수백 줄의 코드이므로 Cassandra 또는 기본적으로 Lift the Web Framework는 객체가 세션에 구체화되는 방법에 의존하지 않습니다. 또한, 세션 및 요청 사이클은 개방되어 트랜잭션 후크를 요청 / 응답 사이클에 삽입하는 것이 간단하다.
  • Lift의 철학은 "서버 팀은 여러 언어가 아닌 한 언어를 알아야합니다"입니다. 이는 구성이 스칼라를 통해 수행됨을 의미합니다. 따라서 유연한 구성 옵션을 만들기 위해 Java 구문의 40 %를 XML 구문으로 구현할 필요가 없었습니다. 이는 컴파일러 구문과 구성 데이터 유형 검사를 통해 런타임시 이상한 XML 구문 분석이나 잘못된 데이터를 얻지 못하도록합니다. 즉, 사용중인 라이브러리를 기반으로 사용중인 주석의 세부 사항을 이해하는 IDE가 필요하지 않습니다.
  • 그렇습니다. Lift의 문서는 장점이 아닙니다.

위에서 말한 것처럼 Lift의 디자인 철학에 대해 이야기하겠습니다.

내가 쓴 웹 프레임 워크 선언을 내가 리프트를 쓰기 시작하기 전에. 내가 아는 다른 웹 프레임 워크의 경우보다 훨씬 큰 수준으로, Lift는 이러한 목표를 충족시킵니다.

핵심은 HTTP 요청 주위에 객체 래퍼를 배치하는 대신 HTTP 요청 / 응답주기를 추상화하는 것입니다. 실제로는 사용자가 수행 할 수있는 모든 작업 (양식 요소 제출, Ajax 수행 등)은 브라우저의 GUID와 서버의 기능으로 표시됩니다. GUID가 HTTP 요청의 일부로 제공되면 제공된 매개 변수와 함께 함수가 적용 (호출)됩니다. GUID는 예측하기 어렵고 세션에 따라 다르기 때문에 Spring을 포함한 대부분의 다른 웹 프레임 워크보다 Lift를 사용하면 재생 공격 및 많은 매개 변수 변조 공격이 훨씬 더 어렵습니다. 또한 개발자는 HTTP 요청 패킹 및 압축 풀기보다는 사용자 액션 및 사용자 액션과 관련된 비즈니스 로직에 초점을 맞추기 때문에 생산성이 향상됩니다.

ajaxButton("Accept", () => {request.accept.save; 
                            SetHtml("acceptrejectspan", <span/>}) ++ 
ajaxButton("Reject", () => {request.reject.save; 
                            SetHtml("acceptrejectspan", <span/>})

그렇게 간단합니다. 함수가 생성 될 때 friendRequest가 범위 내에 있기 때문에 함수가 범위를 닫습니다. 친구 요청의 기본 키를 노출하거나 다른 작업을 수행 할 필요가 없습니다. 버튼의 텍스트 만 정의하면됩니다. 현지화 또는 XHTML 템플릿에서 가져 오거나 현지화 된 템플릿에서 가져올 수 있음) 버튼을 누를 때 실행되는 기능. Lift는 GUID 할당, Ajax 호출 설정 (jQuery 또는 YUI를 통해 설정, 예를 들어 원하는 JavaScript 라이브러리를 추가 할 수 있음), 백오 프로 자동 재시도 수행, Ajax 요청 등을 큐잉하여 연결 부족을 방지합니다.

따라서 Lift와 Spring의 한 가지 큰 차이점은 기능과 관련된 Lift의 GUID 철학은 훨씬 더 나은 보안과 개발자의 생산성 향상이라는 이중 이점이 있다는 것입니다. GUID-> 함수 연결은 매우 내구성이 입증되었습니다 ... 동일한 구성은 일반 양식, 아약스, 혜성, 여러 페이지 마법사 등에서 작동합니다.

다음 핵심 핵심 요소는 가능한 한 오랫동안 높은 수준의 추상화를 유지하는 것입니다. 페이지 생성 측면에서 이는 페이지를 XHTML 요소로 작성하고 응답을 스트리밍하기 직전까지 페이지를 XHTML로 유지하는 것을 의미합니다. 크로스 사이트 스크립팅 오류, 페이지 구성 후 CSS 태그를 헤드로, 스크립트를 페이지 맨 아래로 이동하는 기능, 대상 브라우저를 기반으로 페이지를 다시 작성할 수있는 기능에 대한 이점이 있습니다. 입력측에서 URL을 다시 작성하여 형식이 안전한 방식으로 매개 변수 (쿼리 및 경로 매개 변수 모두)를 추출 할 수 있으며 요청주기 초기에 처리하기 위해 높은 수준의 보안 검사 데이터를 사용할 수 있습니다. 예를 들어, REST 요청의 서비스를 정의하는 방법은 다음과 같습니다.

  serve {
    case "api" :: "user" :: AsUser(user) :: _ XmlGet _ => <b>{user.name}</b>
    case "api" :: "user" :: AsUser(user) :: _ JsonGet _ => JStr(user.name)
  }

Scala의 내장 패턴 일치를 사용하여 수신 요청을 일치시키고 경로의 세 번째 부분을 추출하여 해당 값에 해당하는 사용자를 가져오고 액세스 제어 검사를 적용합니다 (현재 세션 또는 요청에 지정된 액세스 권한이 있습니까) 사용자 기록). 따라서 User 인스턴스가 응용 프로그램 논리에 도달하면 검사됩니다.

이 두 가지 핵심 요소를 통해 Lift는 보안 측면에서 엄청난 이점을 제공합니다. 기능에 방해가되지 않는 Lift의 보안 수준에 대한 아이디어를 제공하기 위해 Yahoo!의 보안을 담당Rasmus Lerdorg 는 FourSquare (리프트 포스터 하위 사이트 중 하나)에 대해 다음과 같이 말합니다.

네 개의 별 @foursquare합니다 - 1 사이트 A의 내가 하나의 보안 문제 (I 찾을 수)하지 않았다에서 좋은 모습을 찍은 반면 - http://twitter.com/rasmus/status/5929904263을

당시 FourSquare는 한 명의 엔지니어 (@harryh가 슈퍼 천재가 아님)를 담당했으며 주된 트래픽은 주간 트래픽 배가에 대처하면서 FourSquare의 PHP 버전을 다시 작성하는 데 주력했습니다.

Lift의 보안 초점의 마지막 부분은 SiteMap입니다. 통합 된 액세스 제어, 사이트 탐색 및 메뉴 시스템입니다. 개발자는 스칼라 코드 (예 : If(User.loggedIn _)또는 If(User.superUser _))를 사용하여 각 페이지에 대한 액세스 제어 규칙을 정의 하며 이러한 액세스 제어 규칙은 페이지 렌더링이 시작되기 전에 적용됩니다. 이는 프로젝트 시작부터 시작되어 액세스 제어 규칙이 나머지 응용 프로그램과 통합되므로 URL이 보안 규칙을 업데이트 할 때 XML로 보안 규칙을 업데이트 할 필요가 없다는 점을 제외하면 Spring Security와 매우 유사합니다. 변경 또는 액세스 제어 변경을 계산하는 방법.

지금까지 Lift의 디자인 철학은 액세스 제어, OWASP 상위 10 가지 보안 취약점에 대한 내성, 훨씬 더 나은 Ajax 지원 및 Spring보다 훨씬 높은 개발자 생산성을 제공합니다.

그러나 Lift는 또한 모든 웹 프레임 워크에 대해 최고의 Comet 지원을 제공합니다. 이것이 Novell이 Pulse 제품 에 전원을 공급하기 위해 Lift를 선택한 이유 이며 Novell이 Lift에 대해 말한 내용은 다음과 같습니다.

Lift는 개발자가 큰 그림에 집중할 수 있도록하는 일종의 웹 프레임 워크입니다. 내장 된 Comet 지원과 같은 강력하고 표현적인 타이핑 및 고급 기능을 통해 배관 대신 혁신에 집중할 수 있습니다. Novell Pulse와 같은 풍부한 실시간 웹 애플리케이션을 구축하려면 표지 아래에 Lift 기능이있는 프레임 워크가 필요합니다.

따라서 Lift는 단순한 또 다른 MVC 프레임 워크가 아닙니다. 아주 잘 발달 된 핵심 설계 원칙을 가지고있는 프레임 워크입니다. 보안 및 개발자 생산성의 이중 이점을 제공하는 프레임 워크입니다. Lift는 계층으로 구축 된 프레임 워크로 개발자에게 필요에 따라 올바른 뷰 선택, 뷰 생성 선택, 지속성 선택 등을 제공합니다.

스칼라와 리프트는 개발자에게 XML의 멜란지, 주석 및 Spring을 구성하는 다른 관용구보다 훨씬 나은 경험을 제공합니다.


2
blog.lostlake.org/index.php?/archives/16-Web-Framework-Manifesto.html의 아카이브 버전에서 확인할 수있다 replay.web.archive.org/20070220231839/http://blog.lostlake.org/...
Alan Hecht

1
당신은 MongoDB의 기본 지원에 저를 데려갔습니다 ... 나는
Eran Medan

8
90 년대 중반부터 웹앱을 작성해 왔습니다. 나는 Perl, Java, Seam, JSP 및 다른 많은 것을 사용했습니다. 내가 스프링을 사용하는 사람은 누구나 구성 및 종속성을 올바르게 설정하는 데 어려움, maven 악몽 등을 불평합니다. 몇 주 전에 프로젝트에서 Lift를 사용하기 시작했으며 절대적으로 놀랐습니다. 그것은 노력없이 거의 일을하는 곳에서 사용한 첫 번째 프레임 워크 (및 언어)입니다. 지금까지 내 앱에 수십 가지 기능을 작성했으며 짜증나는 문서와 스칼라에 대한 제한된 이해조차도 내가 얼마나 빨리 그것을 얻을 수 있는지에 놀랐습니다. 보는 것은 믿는 것입니다.
Tony K.

@TonyK .: Spring은 확실히 무겁지만, Spring으로 리팩토링 / 연장하기가 훨씬 쉽기 때문에 웹앱이 나중에 더 많이 변경되면 갚을 것입니다. IMHO, 그것은 달려 있습니다. 나는 작은 프로젝트에서 Grails와 같은 다른 프레임 워크를 사용했으며 완벽하게 생각합니다.하지만 나중에 많은 것이 바뀌기 때문에 Spring과 함께 갈 것입니다.
Hoàng Long

7
@ HoàngLong 소프트웨어 진화의 어려움에 대한 많은 접근법이 있습니다. 나는 단순히 내 경험을 말하고 있습니다. 자바는 그 시대를 언어로, 프레임 워크와 마찬가지로 보여줍니다. 모든 상용구와 구성 광기없이 더욱 표현력 있고 강력한 것으로 진화 할 시간입니다.
Tony K.

11

플레이 프레임 워크를 확인하는 것이 좋습니다. 매우 흥미로운 아이디어가 있으며 Java 및 Scala의 개발을 지원합니다.


2
Play를 확인했습니다. 나는 그것을 추천하기 위해 내장 클래스를 다시로드하는 것 외에는 아무것도 보지 못했고 무료 Scala JRebel 라이센스로 Lift를 사용하여 얻을 수 있습니다.
Tony K.

10

재미로. 그리고 새로운 프로그래밍 방식을 배우기 위해.


10

Spring MVC의 열렬한 팬이 아닌 최근 웹 프로젝트에 Lift를 사용하는 것을 강력히 조사했습니다. 최신 버전을 사용하지는 않았지만 이전 버전의 Spring MVC를 사용하면 웹 응용 프로그램을 실행하기 위해 많은 노력을 기울였습니다. Lift가 세션에 매우 의존적이며 올바르게 작동하려면 '고정 세션'이 필요할 때까지 Lift에서 거의 판매되었습니다. http://exploring.liftweb.net/master/index-9.html#sec:Session-Management 에서 발췌

표준 세션 복제 기술이있을 때까지“고정 세션”을 사용하여 응용 프로그램을 클러스터링 할 수 있습니다. 이는 HTTP 세션과 관련된 모든 요청이 동일한 클러스터 노드에서 처리되어야한다는 것을 의미합니다.

따라서 세션이 필요하면 사용자는 해당 노드에 고정되어야합니다. 이를 통해 지능적인로드 밸런싱이 필요하고 스케일링에 영향을 미치므로 Lift가 솔루션으로 사용할 수 없었습니다. 나는 http://www.playframework.org/ 를 선택 하게되었고 매우 기뻤습니다. 놀이는 지금까지 안정적이고 신뢰할 수 있으며 작업하기가 매우 쉽습니다.


7

나는 하지 않았다 이 개인적인 경험에서되지 않도록, 자바 배경에서 리프트와 스칼라에 와서, 그러나 나는 많은 리프트 개발자가 스칼라는 자바보다 훨씬 더 간결하고 효율적인 언어로 찾을 것을 알고있다.


3

지식을 넓히는 것은 항상 가치있는 노력입니다.) 방금 Scala를 배우기 시작했습니다. 일반 Java를 작성하는 방법에 영향을 미쳤으며 지금까지 매우 유익하다고 말할 수 있습니다.


3

나는 당신의 세계를 루프에 완전히 던지는 것을 싫어합니다. 그러나 하나의 응용 프로그램에서 Scala, Java, Lift, Spring을 사용할 수 있으며 문제가되지 않습니다.


0

겸손한 의견으로는 상상력이 중요합니다.

앱을 작성한다고 가정 해 봅시다. 괜찮은 개발자라면 이미 앱이 마음에 들어 있어야합니다. 다음 단계는 코드를 통해 어떻게 작동하는지 알아내는 것입니다. 그렇게하려면 상상 된 앱을 실제 앱으로 변환하는 함수를 통해 전달해야합니다. 그 기능은 프로그래밍 언어입니다. 그래서

Real app = programming language (imagined app)

언어 선택이 중요합니다. 프레임 워크도 마찬가지입니다. 선택해야 할 것에 대해 조언 해 줄 똑똑한 사람들이 많이 있지만 궁극적으로 상상력을 가장 잘 표현하는 언어 / 프레임 워크는 선택해야합니다. 따라서 두 가지 모두로 프로토 타입을 만들고 선택하십시오.

나는 스칼라와 리프트를 천천히 배우고 사랑하고 있습니다.


0

그러나 주요 문제는 스프링과 리프트를 비교할 수 없다는 것입니다. Lift는 기본적으로 UI 프레임 워크로 사용되며 Spring은 DI 프레임 워크로 사용됩니다.
백엔드가 많은 웹 앱을 개발하는 경우 리프트를 사용할 수 있어야합니다.
그러나 일부 시리즈 백엔드가 있고 개발 해야하는 웹 앱을 개발하려면 스프링으로 가야합니다.

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