1. 마이크로넛이란?
Micronaut 는 경량의 모듈식 애플리케이션을 구축하기 위한 JVM 기반 프레임워크입니다. Grails를 만든 회사인 OCI에서 개발한 Micronaut는 마이크로서비스를 빠르고 쉽게 만들 수 있도록 설계된 최신 프레임워크입니다 .
Micronaut에는 Spring과 같은 기존 프레임워크와 유사한 일부 기능이 포함되어 있지만 이를 차별화하는 몇 가지 새로운 기능도 있습니다. 또한 Java, Groovy 및 Kotlin을 지원하므로 애플리케이션을 만드는 다양한 방법을 제공합니다.
2. 주요 기능
Micronaut의 가장 흥미로운 기능 중 하나는 컴파일 시간 의존성 주입 메커니즘입니다. 대부분의 프레임워크는 리플렉션과 프록시를 사용하여 런타임에 의존성 주입을 수행합니다. 그러나 Micronaut는 컴파일 시간에 의존성 주입 데이터를 빌드합니다. 그 결과 애플리케이션 시작 속도가 빨라지고 메모리 사용량이 줄어듭니다.
또 다른 기능은 클라이언트와 서버 모두에 대한 반응형 프로그래밍에 대한 최고 수준의 지원입니다. RxJava와 Project Reactor가 모두 지원되므로 특정 반응 구현의 선택은 개발자에게 맡겨집니다.
Micronaut는 또한 클라우드 네이티브 애플리케이션 개발을 위한 탁월한 프레임워크로 만드는 몇 가지 기능을 갖추고 있습니다. Eureka 및 Consul과 같은 여러 서비스 검색 도구를 지원하고 Zipkin 및 Jaeger와 같은 다양한 분산 추적 시스템과도 작동합니다.
또한 AWS Lambda 함수 생성을 지원하므로 서버리스 애플리케이션을 쉽게 생성할 수 있습니다.
3. 시작하기
시작하는 가장 쉬운 방법은 SDKMAN을 사용하는 것입니다 .
> sdk install micronaut 1.0.0.RC2
이렇게 하면 Micronaut 애플리케이션을 빌드, 테스트 및 배포하는 데 필요한 모든 바이너리 파일이 설치됩니다. 또한 Micronaut CLI 도구를 제공하여 새 프로젝트를 쉽게 시작할 수 있습니다.
바이너리 아티팩트는 Sonatype 및 GitHub 에서도 사용할 수 있습니다 .
다음 섹션에서는 프레임워크의 일부 기능을 살펴보겠습니다.
4. 의존성 주입
앞에서 언급했듯이 Micronaut는 대부분의 IoC 컨테이너와 다른 컴파일 시간에 의존성 주입을 처리합니다.
그러나 여전히 JSR-330 어노테이션을 완벽하게 지원하므로 Bean 작업은 다른 IoC 프레임워크와 유사합니다.
코드에 빈을 자동으로 연결하려면 @Inject를 사용합니다.
@Inject
private EmployeeService service;
@Inject 어노테이션 은 @Autowired 와 동일하게 작동하며 필드, 메소드, 생성자 및 매개변수에 사용할 수 있습니다.
기본적으로 모든 빈은 프로토타입으로 범위가 지정됩니다. @Singleton을 사용하여 싱글톤 빈을 빠르게 생성할 수 있습니다 . 여러 클래스가 동일한 빈 인터페이스를 구현하는 경우 @Primary를 사용하여 충돌을 해결할 수 있습니다.
@Primary
@Singleton
public class BlueCar implements Car {}
@Requires 어노테이션 은 bean이 선택적일 때 또는 특정 조건이 충족될 때만 자동 연결을 수행하는 데 사용할 수 있습니다.
이와 관련하여 Spring Boot @Conditional 어노테이션과 매우 유사하게 작동합니다.
@Singleton
@Requires(beans = DataSource.class)
@Requires(property = "enabled")
@Requires(missingBeans = EmployeeService)
@Requires(sdk = Sdk.JAVA, value = "1.8")
public class JdbcEmployeeService implements EmployeeService {}
5. HTTP 서버 구축
이제 간단한 HTTP 서버 애플리케이션을 만드는 방법을 살펴보겠습니다. 시작하려면 SDKMAN을 사용하여 프로젝트를 생성합니다.
> mn create-app hello-world-server -build maven
그러면 hello-world-server라는 디렉토리에 Maven을 사용하여 새 Java 프로젝트가 생성됩니다 . 이 디렉토리 안에는 주요 애플리케이션 소스 코드, Maven POM 파일 및 기타 프로젝트 지원 파일이 있습니다.
매우 간단한 기본 애플리케이션:
public class ServerApplication {
public static void main(String[] args) {
Micronaut.run(ServerApplication.class);
}
}
5.1. HTTP 차단
자체적으로는 이 응용 프로그램이 많은 작업을 수행하지 않습니다. Endpoints이 두 개인 컨트롤러를 추가해 보겠습니다. 둘 다 인사말을 반환하지만 하나는 GET HTTP 동사를 사용 하고 다른 하나는 POST를 사용합니다.
@Controller("/greet")
public class GreetController {
@Inject
private GreetingService greetingService;
@Get("/{name}")
public String greet(String name) {
return greetingService.getGreeting() + name;
}
@Post(value = "/{name}", consumes = MediaType.TEXT_PLAIN)
public String setGreeting(@Body String name) {
return greetingService.getGreeting() + name;
}
}
5.2. 리액티브 IO
기본적으로 Micronaut는 기존 차단 I/O를 사용하여 이러한 엔드포인트를 구현합니다. 그러나 반환 유형을 반응형 비차단 유형으로 변경하기만 하면 비차단 엔드포인트를 신속하게 구현할 수 있습니다 .
예를 들어 RxJava를 사용하면 Observable을 사용할 수 있습니다 . 마찬가지로 Reactor를 사용할 때 Mono 또는 Flux 데이터 유형을 반환할 수 있습니다.
@Get("/{name}")
public Mono<String> greet(String name) {
return Mono.just(greetingService.getGreeting() + name);
}
차단 및 비차단 Endpoints 모두에서 Netty는 HTTP 요청을 처리하는 데 사용되는 기본 서버입니다.
일반적으로 요청은 시작 시 생성되는 기본 I/O 스레드 풀에서 처리되어 차단됩니다.
그러나 비차단 데이터 유형이 컨트롤러 Endpoints에서 반환되면 Micronaut는 Netty 이벤트 루프 스레드를 사용하여 전체 요청을 비차단으로 만듭니다.
6. HTTP 클라이언트 구축
이제 방금 생성한 엔드포인트를 사용할 클라이언트를 구축해 보겠습니다. Micronaut는 HTTP 클라이언트를 만드는 두 가지 방법을 제공합니다.
- 선언적 HTTP 클라이언트
- 프로그래밍 방식의 HTTP 클라이언트
6.1. 선언적 HTTP 클라이언트
생성하는 첫 번째이자 가장 빠른 방법은 선언적 접근 방식을 사용하는 것입니다.
@Client("/greet")
public interface GreetingClient {
@Get("/{name}")
String greet(String name);
}
서비스를 호출하는 코드를 구현하지 않는 방법에 주목하십시오 . 대신 Micronaut는 우리가 제공한 메서드 서명 및 어노테이션에서 서비스를 호출하는 방법을 이해합니다.
이 클라이언트를 테스트하기 위해 임베디드 서버 API를 사용하여 서버의 임베디드 인스턴스를 실행하는 JUnit 테스트를 작성할 수 있습니다.
public class GreetingClientTest {
private EmbeddedServer server;
private GreetingClient client;
@Before
public void setup() {
server = ApplicationContext.run(EmbeddedServer.class);
client = server.getApplicationContext().getBean(GreetingClient.class);
}
@After
public void cleanup() {
server.stop();
}
@Test
public void testGreeting() {
assertEquals(client.greet("Mike"), "Hello Mike");
}
}
6.2. 프로그래밍 방식의 HTTP 클라이언트
동작 및 구현을 더 많이 제어해야 하는 경우 보다 전통적인 클라이언트를 작성할 수도 있습니다.
@Singleton
public class ConcreteGreetingClient {
private RxHttpClient httpClient;
public ConcreteGreetingClient(@Client("/") RxHttpClient httpClient) {
this.httpClient = httpClient;
}
public String greet(String name) {
HttpRequest<String> req = HttpRequest.GET("/greet/" + name);
return httpClient.retrieve(req).blockingFirst();
}
public Single<String> greetAsync(String name) {
HttpRequest<String> req = HttpRequest.GET("/async/greet/" + name);
return httpClient.retrieve(req).first("An error as occurred");
}
}
기본 HTTP 클라이언트는 RxJava를 사용하므로 차단 또는 비차단 호출로 쉽게 작업할 수 있습니다.
7. 마이크로넛 CLI
위에서 Micronaut CLI 도구를 사용하여 샘플 프로젝트를 만들 때 Micronaut CLI 도구가 작동하는 것을 이미 보았습니다.
우리의 경우 독립 실행형 애플리케이션을 만들었지만 여기에는 몇 가지 다른 기능도 있습니다.
7.1. 페더레이션 프로젝트
Micronaut에서 페더레이션은 동일한 디렉터리 아래에 있는 독립 실행형 애플리케이션 그룹입니다. 페더레이션을 사용하면 쉽게 함께 관리하고 동일한 기본값과 설정을 얻을 수 있습니다.
CLI 도구를 사용하여 페더레이션을 생성할 때 create-app 명령과 동일한 인수를 모두 사용합니다. 최상위 프로젝트 구조를 생성하고 각 독립 실행형 앱은 거기에서 하위 디렉터리에 생성됩니다.
7.2. 특징
독립 실행형 애플리케이션 또는 연합을 생성할 때 앱에 필요한 기능을 결정할 수 있습니다 . 이렇게 하면 최소한의 의존성 집합이 프로젝트에 포함되도록 할 수 있습니다.
-features 인수를 사용 하고 쉼표로 구분된 기능 이름 List을 제공하여 기능을 지정합니다 .
다음 명령을 실행하여 사용 가능한 기능 List을 찾을 수 있습니다.
> mn profile-info service
Provided Features:
--------------------
* annotation-api - Adds Java annotation API
* config-consul - Adds support for Distributed Configuration with Consul
* discovery-consul - Adds support for Service Discovery with Consul
* discovery-eureka - Adds support for Service Discovery with Eureka
* groovy - Creates a Groovy application
[...] More features available
7.3. 기존 프로젝트
CLI 도구를 사용하여 기존 프로젝트를 수정할 수도 있습니다. 빈, 클라이언트, 컨트롤러 등을 만들 수 있습니다. 기존 프로젝트 내에서 mn 명령을 실행하면 새로운 명령 집합을 사용할 수 있습니다.
> mn help
| Command Name Command Description
-----------------------------------------------
create-bean Creates a singleton bean
create-client Creates a client interface
create-controller Creates a controller and associated test
create-job Creates a job with scheduled method
8. 결론
Micronaut에 대한 이 간략한 소개에서 우리는 차단 및 비차단 HTTP 서버와 클라이언트를 모두 구축하는 것이 얼마나 쉬운지 확인했습니다. 또한 CLI의 일부 기능을 살펴보았습니다.
그러나 이것은 제공하는 기능의 작은 맛보기일 뿐입니다. 또한 서버리스 기능, 서비스 검색, 분산 추적, 모니터링 및 메트릭, 분산 구성 등을 완벽하게 지원합니다.
또한 많은 기능이 Grails 및 Spring과 같은 기존 프레임워크에서 파생되었지만 자체적으로 눈에 띄는 데 도움이 되는 고유한 기능도 많이 있습니다.
언제나처럼 GitHub 저장소 에서 위의 샘플 코드를 찾을 수 있습니다 .