🔥 FREE PRO OFFER OnlyLink.click Pro Version is 100% Free of Cost till 31 December, 2026! Claim Free Pro

Quarkus 소개: Java 개발자가 Supersonic Java로 전환하는 이유

Quarkus 소개: Java 개발자가 Supersonic Java로 전환하는 이유

거의 30년 동안 Java는 엔터프라이즈 소프트웨어 개발의 지배적인 세력이었습니다. 풍부한 생태계, 강력한 객체 지향 기반, JVM(Java Virtual Machine)을 통한 플랫폼 독립성, Spring Boot와 같은 전투 테스트를 거친 프레임워크 덕분에 백엔드 인프라의 확실한 왕이 되었습니다.

그러나 클라우드 네이티브 아키텍처, Kubernetes 오케스트레이션, 컨테이너화(Docker) 및 **서버리스 컴퓨팅(AWS Lambda, Knative)**으로의 전환은 높은 메모리 오버헤드와 느린 시작 시간이라는 기존 Java 애플리케이션 프레임워크의 심각한 취약점을 드러냈습니다.

마이크로서비스가 트래픽 급증에 대응하여 복제본 0개에서 100개까지 수평으로 확장해야 하거나 서버리스 기능이 요청 시 실행되는 경우 Java 프로세스가 부팅될 때까지 3~10초를 기다리는 것은 허용되지 않습니다. 최신 클라우드 인프라는 즉각적인 시작과 가벼운 메모리 소비를 요구합니다. 이는 전통적으로 Go, Rust 또는 Node.js와 같은 언어에만 해당되는 특성입니다.

GraalVM 및 OpenJDK HotSpot용으로 특별히 설계된 Kubernetes 기반 Java 프레임워크인 Quarkus를 입력하세요. 종종 *“초음속 아원자 Java”*라고도 불리는 Quarkus는 Java 애플리케이션의 컴파일, 부팅, 실행 방식을 근본적으로 재설계합니다.

이 심층 가이드에서는 Java 개발자가 Quarkus를 채택하는 이유, Quarkus가 1초 미만의 시작 시간과 마이크로 메모리 공간을 달성하는 방법, 빌드 시간 최적화의 아키텍처 메커니즘, Quarkus를 사용하여 Java에서 프로덕션에 즉시 사용 가능한 반응형 마이크로서비스를 구축하는 방법을 살펴보겠습니다.


1. 기존 Java의 클라우드 네이티브 딜레마

Quarkus가 존재하는 이유를 이해하려면 Spring Boot 또는 Jakarta EE와 같은 기존 Java 프레임워크가 내부에서 어떻게 작동하는지 조사해야 합니다.

A. 과도한 런타임 초기화 비용

기존 Java 프레임워크는 런타임 동적 반영, 클래스 경로 검색 및 프록시 생성에 크게 의존합니다.

  1. 클래스 경로 검색: 시작 중에 JVM은 클래스 경로에 있는 모든 JAR 파일을 검색하여 @Component, @Service, @Controller 또는 @Entity과 같은 주석을 검색합니다.
  2. 주석 처리 및 반사: 프레임워크는 반사(Class.forName(), getDeclaredFields())를 사용하여 Bean, 구성 속성 및 종속성의 메모리 내 그래프를 구축합니다.
  3. 동적 프록시 생성: CGLIB 또는 ByteBuddy는 AOP(측면 지향 프로그래밍), 데이터베이스 트랜잭션 관리(@Transactional) 및 보안 경계를 지원하기 위해 런타임 메모리에 동적 바이트코드 프록시를 생성합니다.
  4. 메타공간 및 RSS 인플레이션: 모든 메타데이터, 반영된 클래스 설명자 및 생성된 프록시는 JVM의 메타공간 및 RSS(Resident Set Size) 내부 메모리에 유지되어야 합니다.

이 런타임 반영 루프에는 상당한 CPU 주기가 필요하며 힙 메모리 소비가 늘어납니다. 기존 Java의 기본 CRUD REST 서비스는 유휴 상태에서 쉽게 140MB~300MB의 RAM을 소비하고 3~8초만 있으면 시작할 수 있습니다.

B. 클라우드 컴퓨팅의 재정적 불이익

서버리스 및 컨테이너화된 환경에서 클라우드 제공업체는 할당된 메모리(GB) 및 **실행 기간(밀리초)**라는 두 가지 지표를 기준으로 요금을 청구합니다.

  • 콜드 스타트: 서버리스 기능을 부팅하는 데 5초가 걸리면 최종 사용자는 상당한 지연 시간을 경험하게 되며 5초의 유휴 시작 계산에 대한 비용을 지불하게 됩니다.
  • 밀도 및 포드 확장성: 16GB RAM을 보유한 작업자 노드가 있는 Kubernetes 클러스터에서는 메모리가 부족해지기 전에 최대 40개의 기존 Spring Boot 마이크로서비스 인스턴스만 실행할 수 있습니다. 각 인스턴스가 15MB의 RAM만 소비한다면 동일한 노드는 800개 이상의 인스턴스를 호스팅할 수 있습니다.

2. Quarkus 아키텍처: 작업을 런타임에서 빌드 시간으로 전환

Quarkus는 근본적인 아키텍처 패러다임 전환을 통해 클라우드 네이티브 딜레마를 해결합니다. 동적 작업을 런타임에서 빌드 시간으로 이동.

기존 런타임 Java와 Quarkus 빌드 시간 최적화 아키텍처 다이어그램

빌드 시간 처리(Ahead-Of-Time 최적화)

애플리케이션이 부팅될 때마다 클래스 경로 검색, 주석 구문 분석, 빈 그래프 연결을 실행하는 대신 Quarkus는 빌드 단계(mvn package 또는 ./gradlew build) 동안 이러한 모든 무거운 작업을 한 번 수행합니다.

  1. 확장 아키텍처 및 빌드 단계: Quarkus는 플러그형 확장 프레임워크를 사용합니다. 애플리케이션을 컴파일할 때 Quarkus 확장 프로그램은 주석을 구문 분석하고, 최적화된 정적 바이트코드를 생성하고, 종속성 주입 그래프를 미리 해결합니다.
  2. 사전 구운 메타데이터: 모든 종속성 주입 메타데이터는 사전 계산됩니다. 애플리케이션이 시작되면 Quarkus는 리플렉션을 호출하거나 클래스 경로를 검색하지 않고 사전 컴파일된 클래스를 직접 인스턴스화합니다.
  3. 데드 코드 제거(트리 쉐이킹): 빌드 프로세스 중에 Quarkus는 애플리케이션에서 사용되지 않는 클래스, 메소드 및 라이브러리를 식별하여 완전히 제거합니다.

애플리케이션 JAR 또는 기본 바이너리가 생성될 때 모든 런타임 오버헤드가 제거됩니다. JVM은 미리 연결된 정적 바이트코드를 로드하고 즉시 시작합니다.


3. GraalVM 네이티브 이미지와 OpenJDK HotSpot 비교

Quarkus는 이중 실행 모델을 제공합니다. 표준 OpenJDK HotSpot에서는 매우 빠르게 실행되지만 GraalVM 네이티브 이미지로 컴파일하면 최대 성능 잠재력에 도달합니다.

+-----------------------------------------------------------------------+
|                         Java Source Code (.java)                      |
+-----------------------------------------------------------------------+
                                    |
                                    v (Standard javac)
+-----------------------------------------------------------------------+
|                            Bytecode (.class)                          |
+-----------------------------------------------------------------------+
                       /                         \
                      /                           \
                     v                             v
   +----------------------------------+   +----------------------------------+
   |      OpenJDK HotSpot JVM         |   |     GraalVM Native Image (AOT)   |
   |  - JIT Compilation (C1/C2)       |   |  - Substrate VM                  |
   |  - Dynamic Class Loading         |   |  - No Classpath Scanning          |
   |  - Fast throughput, longer boot  |   |  - Millisecond boot, tiny RAM    |
   +----------------------------------+   +----------------------------------+

AOT(Ahead-of-Time) 컴파일 및 기판 VM

GraalVM 네이티브 이미지는 Java 바이트코드를 가져와 이를 OS별 독립 실행형 실행 바이너리(Linux의 ELF 바이너리, macOS의 Mach-O, Windows의 EXE)로 직접 컴파일합니다.

  • 폐쇄 세계 가정: GraalVM은 도달 가능한 모든 코드, 클래스 및 리소스가 빌드 시 알려져 있다고 가정합니다.
  • Substrate VM: 기본 실행 파일에는 전체 JVM 인스턴스를 실행하지 않고도 메모리 관리, 스레드 예약 및 가비지 수집을 처리하는 Substrate VM이라는 소형 런타임 엔진이 포함되어 있습니다.
  • 반사 오버헤드 제로: Quarkus는 빌드 시간 동안 반사 구성 및 프록시 정의를 준비하므로 GraalVM 네이티브 이미지 컴파일은 역사적으로 네이티브 GraalVM 빌드에 필요한 수동 구성 파일 없이도 원활하게 성공합니다.

4. 성능 벤치마크: 경험적 증거

성능의 극명한 차이를 설명하기 위해 표준 REST + 데이터베이스 CRUD 서비스를 실행하는 세 가지 Java 런타임 구성에 대한 표준 업계 벤치마크 비교를 살펴보겠습니다.

  1. 기존 클라우드 네이티브 스택(기존 JVM/스프링 부트)
  2. OpenJDK HotSpot의 Quarkus
  3. GraalVM 네이티브 이미지의 Quarkus
Java Framework 성능 비교: 메모리 소비 및 시작 시간

성능 요약표

미터법 기존 스택(JVM) Quarkus(핫스팟 JVM) Quarkus(GraalVM 네이티브)
REST RSS 메모리 ~140MB ~74MB ~13MB
REST + CRUD RSS 메모리 ~218MB ~112MB ~35MB
REST 시작 시간 ~4.3초 ~0.98초 ~0.014초(14ms)
REST + CRUD 시작 시간 ~9.5초 ~2.0초 ~0.042초(42ms)
실행 가능한 아티팩트 대용량 JAR(~50MB) 최적화된 JAR(~20MB) 독립형 네이티브 바이너리(~30MB)

네이티브 이미지로 컴파일된 Quarkus는 눈을 깜박이는 것보다 빠른 14밀리초 만에 부팅되고 13MB의 RAM만 소비합니다. 이로 인해 Java는 서버리스 및 클라우드 네이티브 배포에서 Go 및 Rust와 완전히 경쟁하게 됩니다.


5. 반응형 및 명령형 듀얼 코어 엔진

역사적으로 Java 개발자는 상호 배타적인 두 가지 프로그래밍 모델 중에서 선택해야 했습니다.

  1. 필수적(요청별 스레드): 표준 JDBC 드라이버 및 동기식 REST 엔드포인트를 사용하는 간단하고 읽기 쉬운 차단 코드입니다.
  2. 반응형(이벤트 루프): 처리량이 높지만 콜백 체인이 복잡하고 디버깅이 어려운 비동기 비차단 코드(예: RxJava, Project Reactor)입니다.

Quarkus는 Eclipse Vert.xNetty로 구동되는 하나의 응집력 있는 엔진으로 두 세계를 통합합니다.

                      +---------------------------------+
                      |     Client HTTP Request         |
                      +---------------------------------+
                                       |
                                       v
                      +---------------------------------+
                      |       Eclipse Vert.x I/O        |
                      |          (Event Loop)           |
                      +---------------------------------+
                                   /       \
                                  /         \
                                 v           v
                 +-------------------+   +-------------------+
                 | Reactive Endpoint |   |Blocking Endpoint  |
                 | (Event Loop)      |   | (Worker Thread)   |
                 | - Mutiny (Uni/Multi)| | - Standard JDBC   |
                 | - Non-blocking    |   | - Imperative Code |
                 +-------------------+   +-------------------+

Quarkus에서는 비차단 I/O가 기초입니다. 기존 차단 코드를 작성하는 경우 Quarkus는 자동으로 관리되는 작업자 스레드 풀에 실행을 디스패치합니다. SmallRye Mutiny(Uni<T>Multi<T>)와 같은 반응형 유형을 사용하는 경우 고성능 비차단 이벤트 루프 스레드에서 실행이 유지됩니다.


6. 개발자의 즐거움: 라이브 코딩 및 개발 서비스

런타임 성능 외에도 Quarkus는 지루한 빌드-테스트-재시작 피드백 루프를 제거하도록 설계된 혁신적인 개발자 경험을 제공합니다.

A. 제로-리스타트 라이브 코딩(quarkus:dev)

mvn quarkus:dev을 실행하면 Quarkus가 라이브 코딩 모드를 시작합니다. Java 파일을 편집하고, 속성을 변경하고, HTML 템플릿을 수정하고, 데이터베이스 스키마를 업데이트할 수 있습니다.

다음에 브라우저나 터미널에서 HTTP 요청을 트리거하면 Quarkus는 파일 변경 사항을 감지하고 빌드 단계를 다시 적용하며 500밀리초 이내에 애플리케이션을 핫 리로드합니다. 개발 중에 애플리케이션 서버를 수동으로 중지했다가 다시 시작할 필요가 없습니다.

B. Quarkus Dev Services(제로 구성 테스트 컨테이너)

마이크로서비스를 PostgreSQL 데이터베이스, Kafka 브로커 또는 Redis 캐시에 연결하려면 일반적으로 docker-compose.yml 파일을 작성하고 로컬 데이터베이스 포트를 구성해야 합니다.

Quarkus Dev Services 이용 시:

  • Quarkus가 데이터베이스 종속성(예: quarkus-reactive-pg-client)을 감지했지만 application.properties에 구성된 데이터베이스 URL이 없는 경우 Quarkus는 백그라운드에서 Testcontainers를 통해 PostgreSQL을 실행하는 자동으로 Docker 컨테이너를 실행합니다.
  • 실행 중인 애플리케이션에 연결 자격 증명을 자동으로 주입합니다.
  • 개발 모드를 중지하면 컨테이너가 자체적으로 깨끗하게 정리됩니다.

7. 실습 연습: 프로덕션에 즉시 사용 가능한 반응형 Quarkus 서비스 구축

Hibernate Reactive with Panache를 사용하여 PostgreSQL 데이터베이스에 연결된 REST API를 노출하는 깔끔한 고성능 Quarkus 마이크로서비스를 Java로 구축해 보겠습니다.

1단계: 프로젝트 종속성(pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ghaznix.quarkus</groupId>
    <artifactId>user-service</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <compiler-plugin.version>3.13.0</compiler-plugin.version>
        <maven.compiler.release>21</maven.compiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
        <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
        <quarkus.platform.version>3.15.1</quarkus.platform.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>${quarkus.platform.artifact-id}</artifactId>
                <version>${quarkus.platform.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- RESTEasy Reactive for high-performance HTTP endpoints -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
        </dependency>

        <!-- Hibernate Reactive with Panache for active-record data access -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-hibernate-reactive-panache</artifactId>
        </dependency>

        <!-- Reactive PostgreSQL Driver -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-reactive-pg-client</artifactId>
        </dependency>

        <!-- Quarkus SmallRye OpenAPI / Swagger UI -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-smallrye-openapi</artifactId>
        </dependency>

        <!-- Testing -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-junit5</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>quarkus-maven-plugin</artifactId>
                <version>${quarkus.platform.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

2단계: 반응형 엔터티(UserEntity.java) 정의

Quarkus는 Hibernate 위에 Active-Record 패턴을 구현한 Panache를 사용하여 데이터 액세스를 단순화했습니다.

package com.ghaznix.quarkus.entity;

import io.quarkus.hibernate.reactive.panache.PanacheEntity;
import io.smallrye.mutiny.Uni;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import java.time.Instant;

@Entity
@Table(name = "users")
public class UserEntity extends PanacheEntity {

    @NotBlank(message = "Username cannot be blank")
    @Column(unique = true, nullable = false)
    public String username;

    @Email(message = "Email must be valid")
    @Column(unique = true, nullable = false)
    public String email;

    @Column(nullable = false)
    public String role;

    @Column(name = "created_at", nullable = false, updatable = false)
    public Instant createdAt = Instant.now();

    /**
     * Helper method to find a user reactively by email.
     */
    public static Uni<UserEntity> findByEmail(String email) {
        return find("email", email).firstResult();
    }
}

3단계: 반응형 REST 리소스 구현(UserResource.java)

RESTEasy Reactive 및 SmallRye Mutiny를 사용하여 HTTP 엔드포인트는 비차단 스레드에서 완전히 비동기식으로 작동합니다.

package com.ghaznix.quarkus.resource;

import com.ghaznix.quarkus.entity.UserEntity;
import io.quarkus.hibernate.reactive.panache.Panache;
import io.smallrye.mutiny.Uni;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.validation.Valid;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.net.URI;
import java.util.List;

@Path("/api/v1/users")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@ApplicationScoped
public class UserResource {

    @GET
    public Uni<List<UserEntity>> getAllUsers() {
        return UserEntity.listAll();
    }

    @GET
    @Path("/{id}")
    public Uni<Response> getUserById(@PathParam("id") Long id) {
        return UserEntity.<UserEntity>findById(id)
                .onItem().ifNotNull().transform(user -> Response.ok(user).build())
                .onItem().ifNull().continueWith(() -> Response.status(Response.Status.NOT_FOUND).build());
    }

    @POST
    public Uni<Response> createUser(@Valid UserEntity user) {
        return Panache.withTransaction(user::persist)
                .replaceWith(() -> Response.created(URI.create("/api/v1/users/" + user.id))
                        .entity(user)
                        .build());
    }

    @DELETE
    @Path("/{id}")
    public Uni<Response> deleteUser(@PathParam("id") Long id) {
        return Panache.withTransaction(() -> UserEntity.deleteById(id))
                .map(deleted -> deleted 
                        ? Response.noContent().build() 
                        : Response.status(Response.Status.NOT_FOUND).build());
    }
}

4단계: 애플리케이션 구성(application.properties)

# Quarkus Application Configuration
quarkus.application.name=user-service
quarkus.http.port=8080

# Database Schema Management (Automatically managed by Dev Services in dev mode)
quarkus.hibernate-orm.database.generation=drop-and-create
quarkus.hibernate-orm.log.sql=true

# SmallRye OpenAPI & Swagger UI Configuration
quarkus.smallrye-openapi.path=/swagger-ui
quarkus.swagger-ui.always-include=true

데이터베이스 URL, 사용자 이름 또는 비밀번호를 구성하지 않았습니다! ./mvnw quarkus:dev을 실행하면 Quarkus는 자동으로 PostgreSQL을 감지하고, Docker 컨테이너를 시작하고, 데이터베이스 스키마 테이블을 설정하고, http://localhost:8080/swagger-ui에서 Swagger UI를 엽니다.


5단계: 네이티브 실행 파일 빌드 및 실행

인스턴트 라이브 코딩 개발 모드에서 실행하려면:

./mvnw quarkus:dev

Docker 컨테이너 내에서 GraalVM을 사용하여 기본 Linux 바이너리를 빌드하려면(로컬 GraalVM 설치가 필요하지 않음):

./mvnw package -Dnative -Dquarkus.native.container-build=true

OS에서 직접 결과 바이너리를 실행하려면:

./target/user-service-1.0.0-SNAPSHOT-runner
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2026-08-26 01:37:15,102 INFO  [io.quarkus] (main) user-service 1.0.0-SNAPSHOT native (powered by Quarkus 3.15.1) started in 0.016s. Listening on: http://0.0.0.0:8080
2026-08-26 01:37:15,103 INFO  [io.quarkus] (main) Profile prod activated. 
2026-08-26 01:37:15,103 INFO  [io.quarkus] (main) Installed features: [cdi, hibernate-reactive, panache, reactive-pg-client, resteasy-reactive, resteasy-reactive-jackson, smallrye-openapi]

0.016초 시동!


8. 전략적 기능 비교: Quarkus와 Spring Boot

능력/특징 전통적인 스프링 부트 3.x 쿼커스 3.x
기본 아키텍처 런타임 리플렉션 및 동적 스캐닝 빌드 타임 처리 및 AOT 최적화
네이티브 컴파일 Spring Native(복잡한 힌트 필요) 최고 수준의 GraalVM 기본 통합
시작 속도(기본) 0.10.5초 ~0.01 - 0.04초
메모리 RSS 공간 140MB - 300MB 13MB - 40MB
개발 환경 DevTools를 통한 핫스왑(제한적) 제로-리스타트 라이브 코딩(quarkus:dev)
타사 서비스 수동 Docker/Testcontainers 구성 자동 개발 서비스(제로 구성 컨테이너)
표준 지원 봄 생태계 특정 자카르타 EE 및 MicroProfile 표준 사양
반응형 패러다임 Spring WebFlux(별도 스택) 통합 엔진(Vert.x Core / Reactive + Imperative)

9. 결론: 이제 Quarkus로 전환해야 할 때인가?

Quarkus는 단순한 웹 프레임워크가 아닙니다. 이는 클라우드 네이티브 시대를 위한 Java의 진화를 나타냅니다. Quarkus는 빌드 시간 최적화와 GraalVM 기본 컴파일을 결합하여 최신 마이크로서비스 및 서버리스 기능에 비해 Java가 너무 느리거나 메모리가 너무 많다는 기존 고정관념을 무효화합니다.

언제 Quarkus를 선택해야 합니까?

  • 서버리스 및 이벤트 기반 애플리케이션: AWS Lambda, GCP Cloud Run 또는 Knative에 마이크로서비스를 배포하는 경우 Quarkus 네이티브 바이너리는 콜드 스타트 ​​문제를 완전히 제거합니다.
  • 고밀도 Kubernetes 클러스터: 인프라 비용이 클러스터 RAM 소비에 의해 좌우되는 경우 서비스를 Quarkus로 마이그레이션하면 메모리 비용을 최대 75% 절감할 수 있습니다.
  • 반응형 마이크로서비스: 비차단 스트리밍(Kafka, gRPC, WebSockets)이 필요한 높은 처리량 시스템을 구축하는 경우 Quarkus는 즉시 최고 수준의 성능을 제공합니다.

Java는 더 이상 느린 시작이나 비대해진 런타임으로 인해 고정되지 않습니다. Quarkus를 사용하면 Java 개발자는 초음속 속도와 아원자 발자국을 갖춘 클라우드 네이티브 애플리케이션을 구축할 수 있습니다.

Ghaznix Ecosystem Products

Empower Your Digital Presence & Workflows

Explore top-tier tools built by Ghaznix to streamline your links, surveys, and brand growth.