최상의 자바 및 JVM 언어 프레임워크
컨텐츠 정보
- 조회 731
본문
자바 생태계는 스칼라, 코틀린과 같은 현대 언어를 위해 만들어진 프레임워크를 포함해 여러 뛰어난 백엔드 프레임워크를 지원한다. 풍성한 백엔드 프레임워크로 시선을 돌려, 가장 먼저 자바와 JVM 언어용으로 만들어진 프레임워크부터 살펴보자. 가장 안전하고 강력하고 방대한 소프트웨어 개발 생태계인 자바 가상머신에서 정적 사이트 생성(SSG)과 API 개발 및 작업에 사용할 수 있는 옵션에 대해 알아보자.
자바를 위한 최선의 프레임워크
자바는 프로그래밍 세계에서 가장 경이로운 7가지 중 하나로 통한다. 최근 몇 년 동안 함수 요소와 리액티브 요소를 모두 수용함으로써 혁신과 안정성 사이에서 적절한 균형을 이룬 자바는 방대하고 활발한 생태계와 최고 수준의 보안, 성능, 동시성을 자랑한다. 자바에 대한 가장 일반적인 비판은 더 새로운 언어와 비교할 때 구문이 투박하다는 정도다. 경쟁 언어로는 필자가 최근에 다룬 코틀린과 같은 JVM 언어가 있다.
자바용 백엔드 프레임워크를 평가할 때는 의사 결정의 기준을 프로젝트에 무엇이 필요한지에 둬야 한다. 이 기사에 포함된 모든 프레임워크에는 각자 강점이 있고, 특히 스프링과 같은 일부 프레임워크는 다양한 방면에서 강력한 기능을 제공한다. 각각의 기능을 비교해 보면 선택 범위를 좁히는 데 도움이 될 것이다.
자바 개발자라면 적어도 코틀린, 스칼라와 같은 다른 JVM 언어 정도는 살펴보는 것이 좋다. 그러나 자바는 많은 개발자들에게 친숙한 선택이며 필요한 모든 기능을 충분히 수행할 수 있다.
다음은 핵심 기능을 기준으로 자바와 JVM 언어를 위한 주요 백엔드 프레임워크를 비교한 표다(가장 높은 등급은 3).
| 프레임워크 | API | 실시간 | SSG | 특징 |
| 스프링 | 3 | 2 | 2 | 엔터프라이즈 다양성 |
| 마이크로넛 | 3 | 2 | 1 | 클라우드 네이티브, 마이크로서비스 |
| 쿼커스 | 3 | 2 | 1 | 클라우드 네이티브, 개발자 경험 |
| J힙스터 | 3 | 2 | 1 | 풀스택 SSG |
| 케이터/코틀린 | 3 | 2 | 2 | 코틀린 중심, 유연성 |
| 플레이/스칼라 | 3 | 3 | 2 | 리액티브, 스칼라, 고성능 |
| Vert.x | 3 | 3 | 1 | 리액티브, 이벤트 드리븐 |
물론 필자의 지극히 주관적인 평가다. API 지원 부문에서는 모든 프레임워크에 최고 점수를 줬다. 엔드포인트를 구축하려는 경우 이 목록에 포함된 아무 프레임워크나 사용해도 충분하다. 결국 개발자 경험(DX), 기존 기술 투자와 같은 다른 요소를 기반으로 어느 스타일이 내 목표에 맞는지에 대한 질문만 남게 된다.
더 자세히 살펴보자.
스프링 프레임워크
스프링은 자바를 위한 궁극적인 백엔드 프레임워크다. 현재 개발자들이 당연시하는 제어 반전과 종속성 주입 개념을 도입한 것도 스프링이다. 현대 스프링은 특히 스프링 부트로 단순화 측면에서 비약적으로 발전했다. 웹 개발의 경우 스프링 MVC와 REST를 함께 사용하면 원하는 거의 대부분의 작업을 처리할 수 있다. 익스프레스와 같은 자바스크립트 프레임워크와 비교할 때 스프링의 큰 특성은 형식성이다. 강점은 엔터프라이즈 개발에 있다.
이 예제는 스프링의 종속성 주입 메커니즘을 사용해 서비스를 주입한다. 서비스는 /hello 경로에 대한 데이터를 제공한 다음 응답을 위한 작업을 수행한다.
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class GreetingController { @Autowired private GreetingService greetingService; @GetMapping("/hello") public String hello() { String greeting = greetingService.getGreeting(); return greeting.toUpperCase(); }}마이크로넛(Micronaut)
마이크로넛은 비교적 새로운 자바 프레임워크로, 가벼운 마이크로서비스 API에 초점을 둔다. 성능이 뛰어난 논블로킹 API 프레임워크를 찾는 자바 기반 개발자에게 적합한 선택이다.
경로를 보면 스프링과 매우 비슷하지만 특기는 다르다. 이 예제는 빠른 시작을 위한 마이크로넛의 사전(AOT) 컴파일을 보여준다.
import io.micronaut.http.MediaType;import io.micronaut.http.annotation.Controller;import io.micronaut.http.annotation.Get;import io.micronaut.http.annotation.Produces;@Controller("/hello")public class HelloController { @Get(produces = MediaType.TEXT_PLAIN) public String index() { return "Hello, InfoWorld from Micronaut!"; }}쿼커스(Quarkus)
쿼커스는 마이크로넛과 마찬가지로 클라우드 네이티브 개발에 중점을 둔다. 쿼커스는 devmode와 컨테이너 인식 패키징을 위한 강력한 명령줄 인터페이스(CLI) 지원을 갖춘, 엄격한(opinionated) 스타일의 프레임워크다. 쿼커스의 장점 중 하나는 명령줄 환경의 간소화와 강화다. 예제에서는 이를 사용하여 새 애플리케이션을 만들어 핫스왑 devmode로 실행한다.
# New Quarkus project with the RESTEasy extensionmvn io.quarkus.platform:quarkus-maven-plugin:2.16.0.Final:create -DprojectGroupId=org.acme -DprojectArtifactId=my-quarkus-app -Dextensions="resteasy"cd my-quarkus-app# Run the application in dev mode./mvnw compile quarkus:dev--Tests pausedPress [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>
J힙스터(JHipster)
J힙스터는 이 목록에서 가장 광범위하고 원대한 목표를 가진 프레임워크라고 할 수 있다. SQL과 노SQL 백엔드 데이터스토어를 모두 포함하는 폭넓은 유연성을 자바와 JVM 생태계 내에서 제공한다.
다음에서 J힙스터 생성기 마법사가 광범위한 기술을 하나의 응집력 있는 프레임워크로 매끄럽게 결합하는 것을 볼 수 있다.
✔ What is the base name of your application? jhip✔ Which *type* of application would you like to create? Monolithic application (recommended for simple projects)✔ What is your default Java package name? com.infoworld✔ Would you like to use Maven or Gradle for building the backend? Gradle✔ Do you want to make it reactive with Spring WebFlux? no✔ Which *type* of authentication would you like to use? JWT authentication (stateless, with a token)✔ Besides JUnit, which testing frameworks would you like to use? ✔ Which *type* of database would you like to use? MongoDB✔ Which cache do you want to use? (Spring cache abstraction) Ehcache (local cache, for a single node)✔ Which other technologies would you like to use? Elasticsearch as search engine✔ Do you want to enable Gradle Enterprise integration? no? Which *framework* would you like to use for the client? Angular❯ React Vue No client
JVM 언어를 위한 최상의 프레임워크
JVM은 자바뿐만 아니라 사실상 모든 언어와 목적에 맞는, 안정적이고 성능이 뛰어나며 안전한 플랫폼을 제공한다. 프로그래밍 세계도 이 기회에 대응해 JVM을 위한 많은 뛰어난 프레임워크와 언어를 만들어냈다. 그 중에서 가장 우수한 몇 가지를 소개한다.
코틀린/케이터
시야를 넓히고자 하는 자바 개발자에게 코틀린은 확실한 선택이다. 코틀린은 자바의 구조적인 견고함을 대부분 그대로 유지하면서 여러 거친 면을 매끄럽게 다듬었다. JVM을 포함한 여러 런타임을 지원한다.
코틀린은 스프링과도 잘 어울리지만 네이티브 프레임워크는 루비 온 레일즈(Ruby on Rails)와 비슷한 개발자 경험을 제공하는 케이터다. 케이터의 구성과 설정은 유연한 편이나 더 직접적인 구성을 요구하기도 한다. 다음 예제는 템플릿을 위한 코틀린의 HTML DSL을 보여준다.
다른 것 없이 코틀린 자체만으로 HTML을 생성할 수 있다.
routing { get("/") { call.respondHtml { head { title("Quotes") } body { h1 { +"Quotes to Live By" } ul { listOf( "This Mind is the matrix of all matter." to "Max Planck", "All religions, arts and sciences are branches of the same tree." to "Albert Einstein", "The mind is everything. What you think you become." to "Buddha" ).forEach { (quote, author) -> li { p { +quote } p { +"― $author" } } } }스칼라/플레이
스칼라는 고성능 함수형 프로그래밍 스타일로 가장 잘 알려진 JVM 언어다. 스칼라는 논블로킹 비동기 작업에 뛰어나다. 명령형이나 객체 지향 프로그래밍을 주로 해왔다면 적응이 필요할 수 있다. 또한 스칼라는 불변성을 강조한다.
스칼라/플레이 스택은 높은 처리량의 리액티브 스타일 마이크로서비스와 미들웨어로 가장 잘 알려져 있다. 플레이는 스칼라의 함수형 프로그래밍 엔진 위에 덧입힌 HTTP 의미론 계층이라고 할 수 있다. 플레이는 리액티브 이벤트 스트림을 연결하는 작업 모드를 가급적 유지할 수 있게 해준다. 스칼라 빌드 툴과 결합된 플레이는 견고한 백엔드를 개발하기 위한 잘 통합된 지능형 플랫폼으로, 특히 실시간 시스템에 적합하다.
여기서는 스칼라와 플레이로 간단한 “Hello, World” 엔드포인트를 정의한다.
import play.api.mvc._ import javax.inject._ @Singleton class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc) { def index = Action { Ok("Hello, InfoWorld!") } }Vert.x
JVM 생태계 최초의 리액티브 프로젝트 중 하나인 Vert.x는 탁월한 다중 언어 프로젝트다. 이 글을 쓰는 현재 Vert.x는 자바, 자바스크립트, 루비, 그루비, 스칼라, 코틀린, PHP를 포함해 JVM에서 실행되는 최소 8개의 언어를 지원한다. 가장 인기 있는 언어는 자바와 코틀린이다.
Vert.x의 현재 버전은 4.5.13이며 Vert.x 5.0.0이 후보 릴리스 단계에 있어 곧 나올 예정이다. Vert.x는 이클립스 재단 프로젝트로, 오픈소스 원칙에 따르며 활발한 대규모 커뮤니티가 형성돼 있다. Vert.x를 자바의 JMS와 같은 다중 언어 이벤트 버스로 사용할 수도 있다.
Vert.x는 다른 요소 없이 바로 멀티코어 서버로 확장 가능한 완전한 다중 프로세스 이벤트 기반 엔진이다(이를 멀티 리액터 아키텍처라고 함). 기본적으로 고처리량 리액티브 스타일의 파이프라인을 구축하는 데 필요한 모든 기본 요소를 제공하며, 그 위에 애플리케이션 서버의 의미 체계 계층이 올라가는 형태다.
다음은 Vert.x를 자바와 함께 사용해 엔드포인트를 제공하는 간단한 예제다.
@Overridepublic void start(Promise startPromise) throws Exception { vertx.createHttpServer().requestHandler(req -> { req.response() .putHeader("content-type", "text/plain") .end("Hello from Vert.x!"); }).listen(8888).onComplete(http -> { if (http.succeeded()) { startPromise.complete(); System.out.println("HTTP server started on port 8888"); } else { startPromise.fail(http.cause()); } }); }}요청과 서버 시작을 위해 함수형 핸들러를 사용했음을 볼 수 있다. Vert.x의 기본적인 스타일은 연결된 함수형 이벤트 핸들러를 사용하는 것이다. 또한 리액티브 구성, 역압, 오류 처리와 같은 다양한 고급 리액티브 기능을 폭넓게 구현하는 데 사용할 수 있다.
결론
자바 플랫폼이 오랜 기간 동안 안정성을 유지해왔음을 감안하면 자바 및 관련 언어들이 이렇게 많은 고품질 프레임워크를 만들어냈다는 것은 놀라운 일이 아니다. 이미 자바를 알고 즐겨 사용하는 개발자라면 JVM 생태계의 다른 언어와 프레임워크를 탐험해보는 것도 좋을 것이다. 다양한 JVM 언어와 프레임워크의 강점을 알면 그만큼 선택의 폭이 넓어진다. 자바를 처음 접하는 개발자도 강력하고 다채로운 옵션 중에서 원하는 것을 선택할 수 있다.
dl-itworldkorea@foundryco.com
관련자료
-
링크
-
이전
-
다음






