Table of contents
- 2. `Quarkus`의 기본 개념
- 2.1 `Quarkus` 아키텍처 이해하기
- 2.2 개발 모드와 네이티브 모드
- 2.3 `Quarkus` 확장 기능 소개
- 2.4 첫 번째 `Quarkus` 애플리케이션 만들기
1. Quarkus 소개 및 준비를 먼저 읽으시길 추천합니다.
2. Quarkus
의 기본 개념
이 글에서는 Quarkus
의 핵심 아키텍처와 기본 개념을 설명하여, Quarkus
애플리케이션을 이해하고 개발하는 데 필요한 기초를 제공합니다. Quarkus
는 Java
개발자들에게 익숙한 많은 도구와 프레임워크를 통합하고 있으며, 이를 통해 Spring
과 같은 기존의 Java
프로젝트를 Quarkus
로 전환하거나 새로운 프로젝트를 시작할 때 큰 장점을 제공합니다.
2.1 Quarkus
아키텍처 이해하기
Quarkus
는 전통적인 Java
애플리케이션 개발 방식과는 다른 방식으로 동작합니다. 이는 Quarkus
가 클라우드 네이티브 및 서버리스 환경에서의 최적화를 목표로 하기 때문입니다. Quarkus
의 아키텍처는 다음과 같은 주요 요소들로 구성됩니다:
-
빌드 타임 부트스트래핑 (Build Time Bootstrapping):
Quarkus
는 가능한 많은 작업을 빌드 타임에 수행하여 런타임 시 성능을 극대화합니다. 이 접근 방식은Quarkus
가 다른Java
프레임워크와 차별화되는 중요한 특징입니다. -
개발 모드와 네이티브 모드:
Quarkus
는 개발 시의 편의성과 프로덕션 환경에서의 성능을 동시에 고려하여 두 가지 주요 실행 모드를 제공합니다.- 개발 모드 (Dev Mode): 코드를 수정하고 저장하면 애플리케이션이 자동으로 다시 컴파일되고 실행됩니다. 이는 개발 속도를 크게 향상시킵니다.
- 네이티브 모드 (Native Mode):
GraalVM
을 활용하여 네이티브 이미지를 생성함으로써 메모리 사용량과 부팅 시간을 최소화할 수 있습니다.
-
Extension 기반 구조:
Quarkus
는 다양한 확장(extension)을 통해 필요한 기능을 손쉽게 추가할 수 있는 구조를 가지고 있습니다. 이 확장들은Quarkus
의 성능 최적화와 통합을 염두에 두고 개발되었으며, 기존의Java
표준과 잘 호환됩니다.
2.2 개발 모드와 네이티브 모드
Quarkus
의 두 가지 주요 실행 모드는 개발자와 운영자 모두에게 강력한 이점을 제공합니다. 이 모드들에 대해 좀 더 자세히 살펴보겠습니다.
2.2.1 개발 모드 (Dev Mode)
개발 모드는 Quarkus
애플리케이션을 개발할 때 가장 자주 사용되는 모드입니다. 이 모드에서는 애플리케이션을 실행한 상태에서 코드를 변경하면 Quarkus
가 자동으로 해당 코드를 다시 컴파일하고 애플리케이션을 다시 시작합니다. 이를 통해 개발자는 빠르게 피드백을 얻고, 실시간으로 애플리케이션의 변화를 확인할 수 있습니다.
개발 모드에서 애플리케이션을 실행하려면 다음 명령어를 사용합니다.
$ ./mvnw quarkus:dev
또는 앞선 글에서 안내한 대로 Quarkus CLI
를 설치했다면 다음처럼 CLI 명령어를 사용하는 것도 동일합니다.
$ quarkus dev
이 명령어를 실행하면 Quarkus
는 애플리케이션을 개발 모드로 실행하고, 소스 코드의 변경을 모니터링하여 변경 사항이 있을 때마다 애플리케이션을 업데이트합니다.
이 명령어를 실행한 이후 터미널에서 실행을 종료하고 싶다면
Q
를 입력하거나Ctr + C
를 입력합니다.
2.2.2 네이티브 모드 (Native Mode)
네이티브 모드는 Quarkus
애플리케이션을 GraalVM
을 사용하여 네이티브 이미지로 빌드하고 실행하는 모드입니다. 네이티브 이미지는 JVM 위에서 동작하는 애플리케이션보다 훨씬 빠른 부팅 시간과 낮은 메모리 사용량을 자랑합니다. 이는 서버리스 환경이나 리소스가 제한된 환경에서 매우 유용합니다.
네이티브 모드로 애플리케이션을 빌드하려면 다음 명령어를 사용합니다:
$ ./mvnw package -Pnative
Quarkus CLI
를 이용하는 방법은 다음과 같습니다.
$ quarkus build --native
빌드가 완료되면 target/
디렉토리에 네이티브 실행 파일이 생성됩니다. 이 파일을 직접 실행하여 애플리케이션을 시작할 수 있습니다.
2.3 Quarkus
확장 기능 소개
Quarkus
는 다양한 확장을 통해 기본적인 기능 외에도 추가적인 기능을 쉽게 추가할 수 있도록 설계되었습니다. Quarkus
확장은 기존 Java
라이브러리나 프레임워크를 Quarkus
환경에 맞게 최적화한 구성 요소입니다. 이러한 확장을 사용하면 개발자는 필요한 기능을 선택적으로 추가할 수 있으며, 확장들이 이미 최적화되어 있기 때문에 성능에 대한 걱정을 줄일 수 있습니다.
Quarkus
확장은 다음과 같이 관리할 수 있습니다:
- 확장 목록 보기:
Quarkus
프로젝트에서 사용 가능한 확장 목록을 보려면 다음 명령어를 사용합니다:
$ ./mvnw quarkus:list-extensions
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------------< org.acme:hello >---------------------------
[INFO] Building hello 1.0.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- quarkus:3.13.0:list-extensions (default-cli) @ hello ---
[INFO] Looking for the newly published extensions in registry.quarkus.io
[INFO] Current Quarkus extensions available:
[INFO]
[INFO] ✬ ArtifactId Extension Name
[INFO] ✬ blaze-persistence-integration-quarkus-3 Blaze-Persistence
[INFO] ✬ camel-quarkus-activemq Camel ActiveMQ
.
.
.
[INFO] vaadin-quarkus-extension Vaadin Flow
[INFO]
[INFO] To get more information, append `-Dformat=full` to your command line.
[INFO]
[INFO] To list only extensions from specific category, append `-Dcategory="categoryId"` to your command line.
[INFO]
[INFO] Add an extension to your project by adding the dependency to your pom.xml or use `./mvnw quarkus:add-extension -Dextensions="artifactId"`
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.916 s
[INFO] Finished at: 2024-08-06T17:09:58+09:00
[INFO] ------------------------------------------------------------------------
- 확장 추가하기:
Quarkus
프로젝트에 특정 확장을 추가하려면 다음 명령어를 사용합니다:
$ ./mvnw quarkus:add-extension -Dextensions="hibernate-orm-panache, quarkus-resteasy"
이 명령어는 프로젝트에 Hibernate ORM Panache와 RESTEasy 확장을 추가합니다.
2.4 첫 번째 Quarkus
애플리케이션 만들기
이제 Quarkus
의 기본 개념을 이해했으므로, 첫 번째 Quarkus
애플리케이션을 만들어보겠습니다. 간단한 RESTful API를 구현하여 Quarkus
의 동작 방식을 체험해볼 수 있습니다.
2.4.1 간단한 RESTful API 구현
- 프로젝트 생성:
Quarkus CLI
또는Maven
을 사용하여 새로운 프로젝트를 생성합니다.
$ mvn io.quarkus:quarkus-maven-plugin:create \
-DprojectGroupId=com.example \
-DprojectArtifactId=first-quarkus-app \
-DclassName="com.example.GreetingResource" \
-Dpath="/greeting"
$ quarkus create app first-quarkus-app --package-name=com.example
- 코드 작성: 생성된
GreetingResource.java
파일을 열면 다음과 같은 REST 엔드포인트를 확인할 수 있습니다.
package com.example;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello from Quarkus REST";
}
}
- 애플리케이션 실행: 다음 명령어를 사용하여 애플리케이션을 개발 모드로 실행합니다.
$ ./mvnw quarkus:dev
또는 Quarkus CLI
를 이용하여 실행할 수도 있습니다.
$ quarkus dev
- 결과 확인: 브라우저를 열고
http://localhost:8080/hello
에 접속하여 "Hello from Quarkus REST" 메시지를 확인합니다.
2.4.2 애플리케이션 실행 및 테스트
Quarkus
는 개발 모드에서 자동으로 테스트를 실행할 수 있는 기능을 제공합니다. 기본 제공되는 테스트 프레임워크인 JUnit을 사용하여 간단한 테스트를 작성하고 실행해봅니다.
- 테스트 작성:
src/test/java/com/example/GreetingResourceTest.java
파일을 열고 다음과 같은 테스트 코드를 작성합니다.
package com.example;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;
@QuarkusTest
class GreetingResourceTest {
@Test
void testHelloEndpoint() {
given()
.when().get("/hello")
.then()
.statusCode(200)
.body(is("Hello from Quarkus REST"));
}
}
- 테스트 실행: 다음 명령어를 사용하여 테스트를 실행합니다.
$ ./mvnw test
테스트가 성공적으로 실행되면, Quarkus
애플리케이션이 정상적으로 작동하고 있음을 확인할 수 있습니다.
여기에서는 Quarkus
의 기본 개념과 첫 번째 애플리케이션을 제작 및 실행해 보았습니다. 다음 글에서는 Panache와 데이터베이스와의 상호작용에 대해 자세히 알아보겠습니다.
Quarkus를 이용한 REST API 개발