Creating a hello project using Micronaut Launch
마이크로넛 런칭은 직관적인 웹 인터페이스 (intuitive web interface)입니다.[1] 마이크로넛 2.0 버전부터 시작된 이 마이크로넛 런칭 웹 인터페이스는 사용자로 하여금 서버 어플리케이션 혹은 CLI 서버레스 기능들 혹은 메시지 어플리케이션과 같은 다양한 마이크로넛 어플리케이션을 위하여 보일러플레이트 boilerplate 곧 판에 박힌 일정한 코드를 찍어내도록 하는 작업을 도와줍니다. 이는 자동 코드 생성기로서 일반적이거나 공통으로 사용되는 작업 소스 코드들을 일정하게 찍어내어 누구나 사용하도록 유도하는 코드 생성기 인 셈이죠.
개발자로서 이 마이크로넛 런칭 생성기를 한 번 사용해보겠습니다.
- 마이크로넛 런칭 생성기로 마이크로넛 보일러 플레이트 자바 코드 생성을 하기 위해 새로운 웹 브라우저를 여시고 아래과 같이 micronaut.io/launch 를 타입한 뒤 엔터를 치세요.
- 마이크로넛 런치 코드 생성기 웹 사이트에서 다음과 같이 내용을 선택할 수 있습니다.
Application Type : Micronaut Application
Java version : 11
Name : helloapp
Base Package : org.neuavenue
Micronaut Version : 3.0.1
Language : Java
Build Tool : Gradle
Test Framework : JUnit
Features (Supported Module) : none
위 화면과 같이 해당 내용을 선택하신 뒤 Generate Project 버튼을 클릭하여 직관적인 웹 인터페이스에서 자동 코드를 생성해보겠습니다.
- 다음과 같은 화면에서 세 가지 드랍 메뉴가 나타나는데 Download zip 파일로 다운받아 코드를 받아보겠습니다.
- Helloapp.zip 다운받기 위하여 Save File 을 클릭하시고 OK 버튼을 눌러 다운을 시작합니다.
- 시작하면서 다음과 같이 마이크로너트 사용 안내 팝업창이 띄게 됩니다. 동시에 다운로드는 맨 아래 왼쪽 상태 창에 다운 zip 파일을 받으신 것을 볼 수 있습니다.
안내 팝업창은 유닉스 혹은 리눅스 맥OS 플랫폼에서 세 가지 단계를 거쳐 해당 프로젝트를 실행시킬 수 있다는 안내 메시지 입니다.
- helloapp.zip 파일 위치를 알아내고자 FireFox 웹 브라우저 다운로드 아이콘을 클릭하여 해당 zip 파일 다운로드가 완료 되었는지 살펴봅니다.
- 마이크로넛에서 제공하는 안내 팝업창 Unzip the archive 란의 명령어를 복사 ()합니다.
- 터미널 창으로 돌아와 cd ~/Download 명령어를 던집니다. 그리고 다음과 같은 명령어로 압축 파일을 풉니다.
cd ~/Downloads
unzip helloapp.zip -d helloapp
- ls 명령어를 통해서 helloapp 폴더가 생성되었는지 확인합니다.
- 유분투 왼쪽바 중 Visual Studio Code 어플리케이션 아이콘을 열어 비주얼 스튜디오 코드를 열어 봅니다. 상위 메뉴 바 중 File > Open Folder 를 클릭합니다.
Task 2 : How to use Visual Studio Code Tools to run the Hello Application with gradle build tools
- 다음과 같이 파일들이 들어있는 helloapp 파일을 찾아서 OK 버튼을 클릭합니다.
- Source Code 소스 코드들 소개를 잠시 할까 합니다.
빌드툴 – gradle 그래들 소프트웨어 빌드는 해당 어플리케이션 소스 코드 파일을 컴퓨터나 휴대폰에서 실행 시킬 수 있는 독립 소프트웨어 (Standalone)로 변환하는 과정을 말합니다.
여기 마이크로넛은 서로 다른 환경들 지원 내에서 빌드를 하게 됩니다. 다음과 같은 소스를 구성하고 있죠. 여기서는 그랜들 범용 빌드 도구를 사용자가 선택하였다는 가정하에서 기본값 소스를 열어보겠습니다.
Gradle 폴더 – 경량된 범용 빌드 도구 입니다. 마븐과 같은 구조화된 빌드 프레임워크입니다.
Src java – Application.java 는 마이크로넛의 초기 실행 파일입니다. 어플리케이션을 처음 실행할 때 이 어플리케이션 자바 소스를 읽는 메인 메소드 내용이 들어 있습니다.
Resources –
Application.yml – yeml 파일로서 현재 어플리케이션을 구성하는 파일입니다.
Logback.xml – 로그백 xml 파일입니다. 이는 로깅 구현하는 소스 코드입니다.
Test – 해당 어플리케이션 소스 파일들을 테스트하는 폴더입니다.
Build.gradle – 빌드 구성 스크립트로서 의존성과 플러그인 빌드에 필요한 설정을 할 수 있습니다.
Gradle.properties – 다양한 wrapper 중 하나로 마이크로넛 어플리케이션 설정파일입니다
Micronaut-cli.yml – 마이크로넛 메타 정보들이 수록되어 있게하여 실행시 빌드를 도와줍니다.
Settings.gradle – 현재 어플리케이션 프로젝트의 구성 정보 세팅을 읽고 정의된 대로 프로젝트를 구성할 수 있습니다.
- 자바 익스텐션을 하기 위하여 VS Code 아래 밑 상태 창에서 인스톨하는 작업을 보실 수 있습니다. VS CODE 맨 아래 오른쪽 상태 바를 보셔서 진행상황을 보시길 바랍니다. 간혹 개발자는 진행을 보지 않고 소스를 개발하고자 하는데 잠시 기다리는 미덕이 필요하기도 합니다.
- Dive into Java Development 메서지 창에서 Get your Java runtime ready 왼쪽 옆에 버튼을 클릭하여 자바 런타임을 구성합니다. 또한 Configure Java Runtime 버튼을 동시에 클릭합니다.
- 현재 자바 버전 11이 설치되어 자바 개발명이 helloapp, 자바 버전 11, Type Gradle 로 설정된 것을 보셨다면 자바 구성이 정상적으로 구성되었습니다. 또한 Java Tooling Runtime 혹은 Installed JDKs 탭을 눌러 확인하시기 바랍니다.
- 자바 소스 익스텐션 준비가 되었다는 신호 를 보신 뒤 세 가지 아이콘들을 하나씩 눌러보시기 바랍니다.
- 자바 인스톨 과정 프로세스 진행 과정을 살펴보고자 아이콘에 마우스를 오버해봅니다.
- 다음과 같은 뷰 프로젝트 메시지 창이 나타납니다. 클릭하지 않고 확인만 하는 것으로 새로운 터미널 창을 시작해보겠습니다.
- 다음과 같이 파일들이 VS Code Explore Windows 창에 나타났다면 상위 메뉴 중 Terminal > New Terminal 을 클릭합니다.
- VS 코드 터미널이 열린 뒤, 다음과 같이 입력하여 Hello 마이크로넛 프로그램을 실행시켜보겠습니다. 이 실행화면을 통해 자동으로 그랜들 7.2 프로그램도 실행이 되는 상황을 터미널에서 볼 수 있습니다.
./gradlew run
[참고사항] 마이크로넛 프레임워크는 다음과 같은 디스플레이를 보여주면서 웹 서비스를 시작하게 됩니다. Ant와 Maven 장점만 모아 만든 빌드 도구인 Gradle 7.2 Daemon 이 작동되면서 마이크로넛 3.0.1 버전 역시 같이 동작하게 됩니다.
- :run 메시지가 터미널 창 맨 아래 부분에 나타난 뒤 http://localhost:8080 링크로 마우스 오버한 뒤 클릭 두번 눌러 다음 화면처럼 8080포트의 로컬 호스트가 새로운 탭으로 자동 연결되는 것을 볼 수 있습니다. 이 화면은 로컬 호스트의 초기 화면 (home page)입니다.
- Visual Studio Code 소프트웨어 창에서 Explore Windows 익스플로러 윈도우 창에 보시면 마이크로넛 생성기를 통해 코드생성했던 파일들을 엿볼 수 있습니다. 파일들을 하나 하나 클릭하여 열어 소스 내용들을 살펴보시면 유익할 것입니다. 또한 VS Code는 자동으로 아래 자바 소스를 사용하고자 인스톨 권유하는 팝업창이 열리면 Install 버튼을 눌러 자바 소스 익스텐션 (Extension for Java)를 연결시키도록 하겠습니다.
- 소스 코드로 다시 돌아가기 위해 Activity Bar 맨 위에 있는 Explore 아이콘 을 클릭합니다.
Hello World Controller generated during compilation
[Hello World Java code in Micronaut Framework][2]
현재 화면은 마이크로넛 프레임워크 구조를 한 눈에 보여주는 다이어그램입니다. 여기서 세 가지 과정인 어플리케이션 코드, 마이크로넛 프레임워크, 서드파트 라이브러리를 거쳐 마이크로넛 어플리케이션이 동작하게 됩니다.
Application Code
어플리케이션 소스를 런타임하면서 Hello app 관련 어플리케이션 소스를 비롯하여 헬로우 컨트롤러 소스는 런타임 실행 전, 마이크로넛 프레임워크의 내부 동작을 읽어들이기 시작합니다.
Micronaut Framework
마이크로넛 프레임워크은 헬로우 어플리케이션 파일 구조를 읽으면서 다양한 빈들을 동작하도록 도와줍니다. 마이크로넛 핵심인 인젝션 모듈은 IoC 패턴을 위하여 마이크로넛 프레임워크가 가진 어플리케이션 컨텐츠들을 비롯한 모든 빈들을 관리 및 동작하도록 돕습니다.
어플리케이션 시작하면서 빈과 함께 들어 있는 컨텐츠들은 생성되며 모든 어노테이션 메타데이터들이 평가되어집니다. 예를 들어 IoC 컨테이너는 모든 REST 컨트롤러 빈을 Router 빈에 인젝션 주입하게 됩니다. 이제 라우터는 모든 정의된 라우터들을 위해 매핑 테이블을 만들게 되죠. 어플리케이션 컨텐츠들을 만들고나서 네티 웹 서버는 시작됩니다.
3rd Party Lib
그 후 클라이언트가 마이크로넛 서버 포트와 함께 호스트 서버를 접근하여 HTTP 요청 (HTTP Request)을 hello 라는 엔드포인트 (최종 루트)에게 보내도록 합니다. 그 호출이 netty-http-server 모듈 안에서 핸들링을 트리커 당겨주는 Netty 서버에 의해 진행이 되죠.
그 핸들러는 당연히 HelloController 빈이 들어 있는 해당 컨트롤러 (corresponding controller)를 정의하기 위하여 라우터 빈을 사용합니다. 해당 컨트롤러 HelloController 빈은 그 내부 소스의 관련된 메소드를 호출할 것입니다. 그 호출 결과로 HTTP 채널 (HTTP Channel) 위에서 Hello World 라는 문자열이 되돌아 옵니다. 이는 네티 서버를 향하여 화면 디스플레이는 실행이 됩니다. 그 메소드 기능이 바로 그 문자열을 화면에 디스플레이 하는 역할이기 때문이죠.
- VS 코드로 다시 돌아와 “Hello World”라는 스트링 객체와 함께 마이크로서비스를 빌드해보죠. 이를 위해 hello controller 컨트롤러 클래스를 하나 생성하도록 하겠습니다. 그 파일의 폴더는 Application.java와 같은 경로(src/main/java/com/neuavenue)입니다. 마지막 하위 경로 neuavenue 폴더에서 New File을 클릭하셔서 파일을 생성해보죠.
- 빈 공간 텍스트 필드에 HelloController.java 라고 입력하고 엔터키를 누르세요.
- HelloController 클래스 코드 작성을 시작하기 전, 컨트롤러 클래스를 생성하여 서버 어플리케이션 제작을 준비하면서 알아야 할 어노테이션 타입은 세 가지 입니다. 사실 마이크로넛 프레임워크는 세 가지 중요한 가장 기초적인 http 어노테이션 타입을 가지고 갑니다.
- 첫번째 어노테이션 타입은 컨트롤러 (Annotation Type Controller) 입니다.
컨트롤로 클래스는 어플리케이션 내에 컨트롤러 통제를 위함이죠. 개발자는 마이크로넛에게 /Hello라는 인식하도록 /hello 마이크로넛 컨트롤러를 사용할 것입니다. 사실 로컬호스트에서 “/hello” 라는 Endpoint Controller (최종 컨트롤러) 경로를 지정하여 웹 브라우저에서 localhost/hello 라고 신호를 보내면 호스트는 마이크로넛 프레임워크를 통하여 /hello 라는 라우터로 이동합니다. 그 컨트롤러를 자동으로 인식하게 되면 해당 클래스인 HelloController 클래스에 액세스하도록 돕기 위하여 Controller 어노테이션 맵을 지정하게 되죠..
- 두번째 어노테이션 타입은 Get 입니다.
Get 어노테이션 타입은 URL과 함께 특별한 소스로부터 엔티티 데이터가 존재하는 정보를 요구하고자 사용합니다. 쉽게 말해 URL 과 함께 데이터를 요구하는 메소드이죠. 그래서 HttpMethod.GET[3] 메소드를 받는 것으로 시작합니다. 데이터들을 시그널 사인으로 받아 Request-URI 내 data-producing process 데이터 생산 프로세스를 거쳐 데이터가 생산 되게 됩니다.
- 세번째 어노테이션 타입은 Produces 입니다.
일반적으로 컨트롤러 어노테이션은 프로듀스 속성 (produces attribute)과 함께 사용할 수 있습니다. 프로듀스 인터페이스 어노테이션은 MediaTypes를 인지하고 있습니다. 여기서는 스트링 미디어타입으로 인지하도록 MdeiaType.Text_PLAIN 스트링 텍스트로 설정할 수 있습니다.
Hello, Micronaut 스트링을 로컬호스트에 디스플레이 하도록 세 가지 어노테이션 타입을 코딩한 뒤 마지막 단계는 역시 디스플레이하는 메소드를 생성하는 일입니다. 입력한 뒤 Ctrl + S 키보드 키를 눌러 저장합니다.
package org.neuavenue;
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 helloMicronaut(){
return "Hello Micronaut!";
}
}
- 새로 코딩한 Hello Controller 클래스를 헬로우 마이크로너트 어플리케이션 적용하고자 trash 아이콘 을 클릭하여 터미널을 강제 종료 (kill terminal) 한 뒤 다시 터미널을 엽니다.
- VS 코드 상단 메뉴 중 Terminal -> New Terminal 을 클릭하여 ./gradlew run 을 입력하여 헬로우 마이크로넛 어플리케이션을 다시 실행시켜보겠습니다.
- 로컬 호스트 (localhost:8080)를 접속하고자 터미널에 디스플레이 된 마이크로넛 로그들 중 http://localhost:8080 링크를 클릭하여 Follow Link 팝업을 띄웁니다. 그후 이를 클릭하여 웹 사이트에 접속합니다.
- 웹 브라우저 주소창에서 로컬호스트 주소 옆에 /hello 를 추가로 입력하여 엔터를 치시면 다음과 같이 hello, micronaut 라는 메시지를 보게 됩니다.