1. 개요

이 예제에서는 MicronautSpring Boot를 비교하겠습니다 . Spring Boot는 Spring 애플리케이션을 빠르게 시작하고 실행하는 데 사용되는 인기 있는 Spring 프레임워크의 일부입니다. Micronaut 는 Spring/Spring Boot의 일부 약점을 해결하기 위해 만들어진 JVM 기반 프레임워크입니다.

여러 영역에서 두 프레임워크를 비교할 것입니다. 먼저 새 애플리케이션 생성의 용이성, 언어 지원 및 기타 구성 옵션을 비교합니다. 그런 다음 두 가지 간단한 REST 애플리케이션을 살펴보겠습니다. 마지막으로 코드를 비교하고 성능 차이를 측정합니다.

2. 특징

다음 섹션에서는 두 프레임워크의 여러 기능을 분석합니다.

2.1. 설정

먼저 두 프레임워크에서 새 애플리케이션을 시작하고 실행하는 용이성을 비교할 것입니다.

Micronaut와 Spring Boot는 모두 새 애플리케이션을 만들기 위한 여러 가지 편리한 방법을 제공합니다. 예를 들어 명령줄 인터페이스가 있는 프레임워크를 사용하여 새 애플리케이션을 만들 수 있습니다. 또는 Spring Boot용 Spring Initializr 또는 Launch 라는 Micronaut용 유사 도구를 사용할 수 있습니다 .

IDE 지원 측면에서 Eclipse의 특징인 Eclipse Spring Tools Suite를 포함하여 가장 인기 있는 IDE에 Spring Boot 플러그인을 사용할 수 있습니다 . IntelliJ를 사용하는 경우 Micronaut 플러그인을 사용할 수 있습니다.

2.2. 언어 지원

언어 지원으로 전환하면 Spring Boot와 Micronaut가 거의 동일하다는 것을 알 수 있습니다. 두 프레임워크 모두 Java, Groovy 또는 Kotlin 중에서 선택할 수 있습니다 . Java를 선택하면 두 프레임워크 모두 Java 8, 11 및 17을 지원합니다. 또한 두 프레임워크에서 Gradle 또는 Maven을 사용할 수 있습니다.

2.3. 서블릿 컨테이너

Spring Boot를 사용하면 애플리케이션은 기본적으로 Tomcat을 사용합니다. 그러나 Jetty 또는 Undertow 도 사용하도록 Spring Boot를 구성할 수 있습니다.

Micronaut 애플리케이션은 기본적으로 Netty 기반 HTTP 서버에서 실행됩니다. 그러나 Tomcat, Jetty 또는 Undertow에서 실행되도록 애플리케이션을 전환하도록 선택할 수 있습니다.

2.4. 속성 구성

Spring Boot의 경우 application.properties 또는 application.yml 에서 속성을 정의할 수 있습니다 . application-{env}.properties 규칙을 사용하여 환경마다 다른 속성을 제공할 수 있습니다. 또한 시스템 속성, 환경 변수 또는 JNDI 속성을 사용하여 이러한 애플리케이션 파일 제공 속성을 재정의할 수 있습니다.

Micronaut의 속성 파일에 application.properties , application.ymlapplication.json을 사용할 수 있습니다 . 환경별 특성 파일을 제공하기 위해 동일한 규칙을 사용할 수도 있습니다. 속성을 재정의해야 하는 경우 시스템 속성이나 환경 변수를 사용할 수 있습니다.

2.5. 메시징 지원

Spring Boot에서 메시징을 사용하는 경우 Active MQ , Artemis, Rabbit MQApache Kafka를 사용할 수 있습니다.

Micronaut 측에는 Apache Kafka, Rabbit MQ 및 Nats.io가 옵션으로 있습니다.

2.6. Security

Spring Boot는 기본, 양식 로그인, JWT, SAML 및 LDAP의 다섯 가지 인증 전략을 제공합니다. Micronaut를 사용하는 경우 SAML을 제외한 동일한 옵션이 있습니다.

두 프레임워크 모두 OAuth2 지원을 제공합니다 .

실제로 Security을 적용하는 측면에서 두 프레임워크 모두 어노테이션을 사용하여 메서드를 보호할 수 있습니다.

2.7. 관리 및 모니터링

두 프레임워크 모두 애플리케이션에서 다양한 메트릭과 통계를 모니터링할 수 있는 기능을 제공합니다. 두 프레임워크 모두에서 사용자 지정 Endpoints을 정의할 수 있습니다. 또한 두 프레임워크 모두에서 Endpoints Security을 구성할 수 있습니다.

그러나 Spring Boot 액추에이터는 Micronaut보다 몇 가지 더 많은 기본 제공 엔드포인트를 제공합니다.

2.8. 템플릿 언어

프런트 엔드를 렌더링하기 위해 제공된 템플릿 언어를 사용하여 두 프레임워크로 완전한 전체 스택 애플리케이션을 만들 수 있습니다.

Spring Boot의 경우 Thymeleaf , Apache Freemarker , Mustache 및 Groovy를 선택합니다 . 권장되지는 않지만 JSP를 사용할 수도 있습니다.

Micronaut에는 Thymeleaf, Handlebars, Apache Velocity, Apache Freemarker, Rocker, Soy/Closure 및 Pebbles와 같은 몇 가지 추가 옵션이 있습니다.

2.9. 클라우드 지원

Spring Boot 애플리케이션은 많은 클라우드 관련 기능을 위해 타사 라이브러리에 의존합니다 .

Micronaut는 기본적으로 클라우드 마이크로서비스용으로 설계되었습니다. Micronaut가 기본적으로 처리할 클라우드 개념에는 분산 구성, 서비스 검색, 클라이언트 측 로드 밸런싱, 분산 추적 및 서버리스 기능이 포함됩니다.

3. 코드

이제 두 프레임워크의 몇 가지 기본 기능을 비교했으므로 두 애플리케이션을 만들고 비교해 보겠습니다. 단순함을 유지하기 위해 기본 산술 문제를 해결하는 간단한 REST API를 생성합니다. 우리의 서비스 계층은 실제로 우리를 위해 수학을 수행하는 클래스로 구성됩니다. 컨트롤러 클래스에는 더하기, 빼기, 곱하기 및 나누기를 위한 Endpoints이 포함됩니다.

코드를 자세히 살펴보기 전에 Spring Boot와 Micronaut의 중요한 차이점을 살펴보겠습니다. 두 프레임워크는 의존성 주입을 제공하지만 다르게 작동합니다. Spring Boot 애플리케이션은 리플렉션 및 프록시를 사용하여 런타임에 의존성 주입을 처리합니다. 반대로 Micronaut 애플리케이션은 컴파일될 때 의존성 주입 데이터를 빌드합니다.

3.1. 스프링 부트 애플리케이션

먼저 Spring Boot 애플리케이션에서 ArithmeticService 라는 클래스를 정의해 보겠습니다 .

@Service
public class ArithmeticService {
    public float add(float number1, float number2) {
        return number1 + number2;
    }
    
    public float subtract(float number1, float number2) {
        return number1 - number2;
    }
    
    public float multiply(float number1, float number2) {
        return number1 * number2;
    }
    
    public float divide(float number1, float number2) {
        if (number2 == 0) {
            throw new IllegalArgumentException("'number2' cannot be zero");
        }
        return number1 / number2;
    }
}

다음으로 REST 컨트롤러를 생성해 보겠습니다.

@RestController
@RequestMapping("/math")
public class ArithmeticController {
    @Autowired
    private ArithmeticService arithmeticService;
    
    @GetMapping("/sum/{number1}/{number2}")
    public float getSum(@PathVariable("number1") float number1, @PathVariable("number2") float number2) {
    	return arithmeticService.add(number1, number2);
    }
    
    @GetMapping("/subtract/{number1}/{number2}")
    public float getDifference(@PathVariable("number1") float number1, @PathVariable("number2") float number2) {
    	return arithmeticService.subtract(number1, number2);
    }
    
    @GetMapping("/multiply/{number1}/{number2}")
    public float getMultiplication(@PathVariable("number1") float number1, @PathVariable("number2") float number2) {
    	return arithmeticService.multiply(number1, number2);
    }
    
    @GetMapping("/divide/{number1}/{number2}")
    public float getDivision(@PathVariable("number1") float number1, @PathVariable("number2") float number2) {
    	return arithmeticService.divide(number1, number2);
    }
}

컨트롤러에는 네 가지 산술 함수 각각에 대한 엔드포인트가 있습니다.

3.2. 마이크로넛 애플리케이션

이제 Micronaut 애플리케이션의 서비스 계층을 생성해 보겠습니다.

@Singleton 
public class ArithmeticService {
    // implementation identical to the Spring Boot service layer
}

다음으로 Spring Boot 애플리케이션과 동일한 4개의 엔드포인트를 사용하여 REST 컨트롤러를 작성합니다.

@Controller("/math")
public class ArithmeticController {
    @Inject
    private ArithmeticService arithmeticService;
    
    @Get("/sum/{number1}/{number2}")
    public float getSum(float number1, float number2) {
    	return arithmeticService.add(number1, number2);
    }
    
    @Get("/subtract/{number1}/{number2}")
    public float getDifference(float number1, float number2) {
    	return arithmeticService.subtract(number1, number2);
    }
    
    @Get("/multiply/{number1}/{number2}")
    public float getMultiplication(float number1, float number2) {
    	return arithmeticService.multiply(number1, number2);
    }
    
    @Get("/divide/{number1}/{number2}")
    public float getDivision(float number1, float number2) {
    	return arithmeticService.divide(number1, number2);
    }
}

매우 간단한 예제 응용 프로그램 간에 많은 유사점을 볼 수 있습니다. 차이점의 관점에서 Micronaut는 삽입을 위해 Java의 어노테이션을 활용하는 반면 Spring Boot는 고유한 어노테이션을 가지고 있음을 알 수 있습니다. 또한 Micronaut REST Endpoints에는 메서드에 전달된 경로 변수에 대한 특별한 어노테이션이 필요하지 않습니다.

3.3. 기본 성능 비교

Micronaut는 빠른 시작 시간을 광고하므로 두 애플리케이션을 비교해 보겠습니다.

먼저 Spring Boot 애플리케이션을 실행하고 소요 시간을 확인합니다.

[main] INFO  c.b.m.v.s.CompareApplication - Started CompareApplication in 3.179 seconds (JVM running for 4.164)

다음으로 Micronaut 애플리케이션이 얼마나 빨리 시작되는지 살펴보겠습니다.

21:22:49.267 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 1278ms. Server Running: http://localhost:57535

Spring Boot 애플리케이션이 3초 남짓, Micronaut에서는 1초 남짓만에 시작되는 것을 볼 수 있습니다.

이제 시작 시간을 살펴보았으므로 API를 약간 실행한 다음 몇 가지 기본 메모리 통계를 확인하겠습니다. 애플리케이션을 시작할 때 기본 메모리 설정을 사용합니다.

Spring Boot 애플리케이션부터 시작하겠습니다. 먼저 4개의 산술 Endpoints을 각각 호출한 다음 메모리 Endpoints을 가져옵니다.

Initial: 0.25 GB 
Used: 0.02 GB 
Max: 4.00 GB 
Committed: 0.06 GB 

다음으로 Micronaut 애플리케이션을 사용하여 동일한 연습을 실행해 보겠습니다.

Initial: 0.25 GB 
Used: 0.01 GB 
Max: 4.00 GB 
Committed: 0.03 GB

이 제한된 예에서 두 애플리케이션 모두 메모리를 거의 사용하지 않지만 Micronaut는 Spring Boot 애플리케이션의 절반 정도를 사용합니다.

4. 결론

이 기사에서는 Spring Boot와 Micronaut를 비교했습니다. 먼저 두 프레임워크가 무엇인지에 대한 개요부터 시작했습니다. 그런 다음 몇 가지 기능을 살펴보고 옵션을 비교했습니다. 마지막으로 두 개의 간단한 예제 애플리케이션을 서로 비교했습니다. 우리는 두 애플리케이션의 코드를 살펴본 다음 시작 및 메모리 성능을 살펴보았습니다.

항상 그렇듯이 예제 코드는 Spring BootMicronaut 애플리케이션 모두에 대해 GitHub에서 사용할 수 있습니다.

res – REST with Spring (eBook) (everywhere)