🚀   70세 이전에 한 모든 일은 신경 쓸 가치가 없다. - 호쿠사이

[Quarkus] 기본 개념 및 첫 번째 애플리케이션 제작

2024.08.07
11분

1. Quarkus 소개 및 준비를 먼저 읽으시길 추천합니다.

2. Quarkus의 기본 개념

이 글에서는 Quarkus의 핵심 아키텍처와 기본 개념을 설명하여, Quarkus 애플리케이션을 이해하고 개발하는 데 필요한 기초를 제공합니다. QuarkusJava 개발자들에게 익숙한 많은 도구와 프레임워크를 통합하고 있으며, 이를 통해 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 구현

  1. 프로젝트 생성: Quarkus CLI 또는 Maven을 사용하여 새로운 프로젝트를 생성합니다.
Maven
$ mvn io.quarkus:quarkus-maven-plugin:create \
    -DprojectGroupId=com.example \
    -DprojectArtifactId=first-quarkus-app \
    -DclassName="com.example.GreetingResource" \
    -Dpath="/greeting"
Quarkus_CLI
$ quarkus create app first-quarkus-app --package-name=com.example
  1. 코드 작성: 생성된 GreetingResource.java 파일을 열면 다음과 같은 REST 엔드포인트를 확인할 수 있습니다.
src/main/java/com/example/GreetingResource.java
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";
    }
}
  1. 애플리케이션 실행: 다음 명령어를 사용하여 애플리케이션을 개발 모드로 실행합니다.
$ ./mvnw quarkus:dev

또는 Quarkus CLI를 이용하여 실행할 수도 있습니다.

$ quarkus dev
  1. 결과 확인: 브라우저를 열고 http://localhost:8080/hello에 접속하여 "Hello from Quarkus REST" 메시지를 확인합니다.

2.4.2 애플리케이션 실행 및 테스트

Quarkus는 개발 모드에서 자동으로 테스트를 실행할 수 있는 기능을 제공합니다. 기본 제공되는 테스트 프레임워크인 JUnit을 사용하여 간단한 테스트를 작성하고 실행해봅니다.

  1. 테스트 작성: src/test/java/com/example/GreetingResourceTest.java 파일을 열고 다음과 같은 테스트 코드를 작성합니다.
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"));
    }
}
  1. 테스트 실행: 다음 명령어를 사용하여 테스트를 실행합니다.
$ ./mvnw test

테스트가 성공적으로 실행되면, Quarkus 애플리케이션이 정상적으로 작동하고 있음을 확인할 수 있습니다.


여기에서는 Quarkus의 기본 개념과 첫 번째 애플리케이션을 제작 및 실행해 보았습니다. 다음 글에서는 Panache와 데이터베이스와의 상호작용에 대해 자세히 알아보겠습니다.


프로필 사진
Nanutbae
A small boat sailing freely on the sea of curiosity ⊹ ࣪ ﹏𓊝﹏𓂁﹏⊹ ࣪ ˖

Quarkus를 이용한 REST API 개발

2 / 3
24.08.05
0분
Quarkus와 Panache를 활용한 REST API 개발에 관한 블로그 시리즈입니다. Java와 Spring에 익숙한 개발자들이 Quarkus를 빠르게 익히고 적용할 수 있도록 구성되었습니다.