자바는 엔터프라이즈의 왕좌를 지켜왔지만, 서버리스와 컨테이너 시대에 "시작이 느리고 메모리를 많이 먹는 언어"라는 꼬리표가 붙었다. 정말 자바 자체의 한계일까, 아니면 프레임워크가 해결할 수 있는 문제일까?

Quarkus란 무엇인가

Quarkus는 Red Hat이 주도하여 2019년에 첫 릴리즈한 자바 프레임워크 입니다. 정식 명칭은 "Supersonic Subatomic Java"로, 이름부터 속도와 경량화를 강조하고 있습니다. 현재 3.x 버전대가 활발히 릴리즈되고 있으며, 2026년 기준 3.32.x까지 나온 상태입니다.

핵심 철학은 단순합니다.

런타임에 할 일을 빌드 타임으로 옮겨서, 애플리케이션이 시작할 때 할 일을 최소화하자.

이 아이디어 하나가 자바 애플리케이션의 시작 속도와 메모리 사용량을 근본적으로 바꿔놓았습니다.


왜 Quarkus가 등장했는가

전통적인 자바 프레임워크(Spring, Jakarta EE)가 만들어진 시대와 지금은 환경이 다릅니다.

과거현재
애플리케이션 서버에 WAR 배포컨테이너(Docker/K8s)에 직접 배포
서버 한 대에서 오래 실행오토스케일링으로 인스턴스가 수시로 생성/삭제
시작 시간 중요하지 않음콜드 스타트가 사용자 경험에 직결
메모리 넉넉컨테이너 메모리 제한 (256MB, 512MB)

Spring Boot 애플리케이션은 시작할 때 클래스패스 스캐닝, 리플렉션 기반 빈 등록, 프록시 생성 등을 런타임에 수행합니다. 서버 하나에서 오래 돌리는 환경에서는 시작 시간이 10초든 30초든 크게 문제가 되지 않았습니다.

하지만 Kubernetes에서 Pod가 수시로 뜨고 내려가거나, AWS Lambda 같은 서버리스 환경에서 콜드 스타트가 발생하면 이야기가 달라집니다. 시작에 5초 걸리는 자바 애플리케이션은 50ms면 준비되는 Go나 Rust 애플리케이션과 경쟁할 수 없습니다.

Quarkus는 바로 이 문제를 해결하기 위해 태어났습니다.


빌드 타임 처리 (Build Time Boot)

Quarkus의 핵심 혁신은 "빌드 타임 처리" 입니다. 전통적인 자바 프레임워크가 런타임에 하던 작업을 빌드 시점으로 옮깁니다.

런타임에서 빌드 타임으로 옮겨지는 것들

  • **클래스패스 스캐닝 **: 어떤 클래스가 있는지 분석
  • **XML/어노테이션 파싱 **: 설정 파일 해석
  • ** 빈 디스커버리 **: DI 컨테이너에 등록할 빈 탐색
  • ** 프록시 생성 **: AOP 프록시, 인터셉터 바이트코드 생성
  • ** 설정 로딩 및 검증 **: 설정값 읽기 및 타입 변환

빌드가 끝나면 이미 "무엇을 어떻게 연결할지"가 결정된 상태이므로, 런타임에는 ** 준비된 코드를 실행하기만** 하면 됩니다.

PLAINTEXT
[전통적인 프레임워크]
시작 → 클래스패스 스캔 → 어노테이션 파싱 → 빈 등록 → 프록시 생성 → 준비 완료
       ~~~~~~~~~~~~~ 런타임에 모두 수행 ~~~~~~~~~~~~~

[Quarkus]
빌드 → 클래스패스 스캔 → 어노테이션 파싱 → 빈 등록 → 프록시 생성  (빌드 타임)
시작 → 준비 완료                                                  (런타임)

비유하자면, 전통적인 프레임워크는 레스토랑에서 주문을 받은 뒤 재료를 사러 가는 것이고, Quarkus는 미리 손질된 재료를 꺼내서 바로 조리하는 것입니다.


GraalVM Native Image 지원

Quarkus의 빌드 타임 처리 아키텍처는 GraalVM Native Image 와 궁합이 완벽합니다.

GraalVM Native Image는 자바 바이트코드를 네이티브 바이너리로 AOT(Ahead-of-Time) 컴파일 하는 기술입니다. JVM 없이 실행 가능한 단일 바이너리가 만들어집니다.

Native Image의 장점

  • **시작 시간 **: 수십 밀리초 (15~80ms)
  • ** 메모리 사용량 **: 50MB 미만도 가능
  • ** 바이너리 크기 **: JRE 번들 불필요, 컨테이너 이미지 경량화

Native Image의 제약

GraalVM Native Image는 빌드 시점에 도달 가능한(reachable) 코드만 포함합니다. 그래서 ** 런타임 리플렉션, 동적 프록시, 동적 클래스 로딩 **에 제약이 생깁니다.

BASH
# Quarkus 프로젝트에서 네이티브 이미지 빌드
./mvnw package -Dnative

# Docker를 이용한 네이티브 빌드 (GraalVM 미설치 환경)
./mvnw package -Dnative -Dquarkus.native.container-build=true

전통적인 프레임워크는 런타임에 리플렉션을 많이 사용하기 때문에 네이티브 이미지로 변환할 때 별도의 설정이 필요합니다. 반면 Quarkus는 빌드 타임에 이미 모든 분석이 끝나 있으므로, ** 네이티브 이미지 변환이 자연스럽게** 이루어집니다.


Kubernetes 최적화

Quarkus는 "Kubernetes-native Java"를 표방합니다. 단순히 컨테이너에 올릴 수 있다는 수준이 아니라, Kubernetes 환경에 맞게 설계되었습니다.

Kubernetes 관련 기능

  • ** 자동 리소스 생성 **: quarkus-kubernetes 확장을 추가하면 deployment.yaml, service.yaml 등이 빌드 시 자동 생성
  • ** 헬스 체크 **: quarkus-smallrye-health로 liveness/readiness 프로브 자동 설정
  • ** 컨피그 맵 연동 **: Kubernetes ConfigMap/Secret을 직접 읽을 수 있는 설정 소스 제공
  • Knative/OpenShift: Red Hat 주도답게 OpenShift와의 통합이 깊음
JAVA
// application.properties
quarkus.kubernetes.deploy=true
quarkus.kubernetes.service-type=ClusterIP
quarkus.container-image.build=true
quarkus.container-image.group=my-team
quarkus.container-image.name=my-app

빌드만 하면 컨테이너 이미지까지 만들어주고, Kubernetes 매니페스트까지 생성해줍니다.


확장 생태계

Quarkus의 또 다른 강점은 ** 확장(Extension) 생태계 **입니다. 2026년 기준 700개 이상의 확장이 존재하며, 주요 자바 라이브러리 대부분을 Quarkus 방식으로 사용할 수 있습니다.

주요 확장 카테고리

카테고리대표 확장
RESTEasy (JAX-RS), Undertow (Servlet)
데이터Hibernate ORM, Panache, Reactive SQL
메시징Kafka, AMQP, MQTT
보안OIDC, JWT, Keycloak
클라우드AWS Lambda, Azure Functions, GCP
관측성OpenTelemetry, Micrometer
그래프SmallRye GraphQL

확장은 단순한 라이브러리 래핑이 아닙니다. 각 확장은 빌드 타임 처리를 위한 ** 빌드 스텝(Build Step)**을 포함하고 있어서, 해당 라이브러리가 Quarkus의 빌드 타임 최적화 혜택을 받을 수 있도록 합니다.

BASH
# CLI로 확장 추가
quarkus extension add hibernate-orm-panache
quarkus extension add resteasy-reactive-jackson

# Maven으로 확장 추가
./mvnw quarkus:add-extension -Dextensions="hibernate-orm-panache"

MicroProfile 표준

Quarkus는 Eclipse MicroProfile 표준을 완벽하게 구현합니다. MicroProfile은 마이크로서비스를 위한 자바 표준 API 세트입니다.

지원하는 MicroProfile 스펙:

  • Config: 외부 설정 관리
  • Health: 헬스 체크 엔드포인트
  • Metrics/Telemetry: 메트릭 수집
  • Fault Tolerance: Circuit Breaker, Retry, Timeout
  • REST Client: 타입 안전한 REST 클라이언트
  • JWT Auth: JWT 기반 인증
  • OpenAPI: API 문서 자동 생성
JAVA
// MicroProfile REST Client 예시
@RegisterRestClient(configKey = "user-api")
@Path("/users")
public interface UserClient {

    @GET
    @Path("/{id}")
    UserDto getUser(@PathParam("id") Long id);
}

// 사용하는 쪽
@Inject
@RestClient
UserClient userClient;

Spring에서 RestTemplate이나 WebClient로 하던 외부 API 호출을, 인터페이스 하나로 선언적으로 처리할 수 있습니다.


도입 현황과 성장세

Quarkus의 성장세는 주목할 만합니다.

  • 4,626개 이상의 기업 이 프로덕션에서 사용 중 (2026년 기준)
  • **Maven Central 다운로드 **: 매년 약 2배씩 성장
  • **GitHub 스타 **: 13,000+ (꾸준한 증가세)
  • ** 주요 사용 기업 **: Vodafone, Lufthansa, Decathlon 등

특히 ** 서버리스, 이벤트 드리븐, 마이크로서비스** 아키텍처를 채택하는 팀에서 도입이 활발합니다. Red Hat의 지원 아래 엔터프라이즈 레벨의 안정성도 확보하고 있습니다.


첫 번째 Quarkus 애플리케이션

간단하게 Quarkus 프로젝트를 시작하는 방법을 살펴보겠습니다.

프로젝트 생성

BASH
# Quarkus CLI로 생성
quarkus create app com.example:my-app \
  --extension='resteasy-reactive-jackson,hibernate-orm-panache,jdbc-postgresql'

# Maven으로 생성
mvn io.quarkus.platform:quarkus-maven-plugin:3.32.0:create \
  -DprojectGroupId=com.example \
  -DprojectArtifactId=my-app

REST 엔드포인트 작성

JAVA
@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello from Quarkus";
    }

    @GET
    @Path("/{name}")
    @Produces(MediaType.APPLICATION_JSON)
    public Greeting helloName(@PathParam("name") String name) {
        return new Greeting("Hello, " + name);
    }
}

public record Greeting(String message) {}

개발 모드 실행

BASH
quarkus dev
# 또는
./mvnw quarkus:dev

개발 모드로 실행하면 코드를 수정할 때마다 ** 자동으로 핫 리로드 **됩니다. 서버 재시작 없이 바로 변경사항이 반영되는데, 이 경험은 공부하다 보니 상당히 인상적이었습니다.


Spring 개발자를 위한 비교 맵

Spring에 익숙하다면, Quarkus의 대응 개념을 정리해두면 이해가 빠릅니다.

SpringQuarkus
@RestController@Path + JAX-RS 어노테이션
@Autowired@Inject (CDI)
@Component@ApplicationScoped
@Service@ApplicationScoped
application.ymlapplication.properties
Spring Data JPAHibernate Panache
Spring Boot DevToolsQuarkus Dev Mode
Spring ActuatorSmallRye Health + Micrometer

Quarkus는 Spring의 어노테이션을 사용할 수 있는 호환 레이어도 제공합니다. @Autowired, @Component 등을 그대로 쓸 수 있어서 마이그레이션 장벽이 낮습니다.


정리

Quarkus를 한 줄로 정리하면, "빌드 타임에 프레임워크의 무거운 작업을 끝내서 런타임을 극단적으로 가볍게 만든 자바 프레임워크" 입니다.

기억할 포인트를 정리하면 다음과 같습니다.

  • **빌드 타임 처리 **: 리플렉션, 클래스패스 스캐닝, 프록시 생성을 빌드에서 완료
  • GraalVM Native: 15~80ms 시작, 50MB 미만 메모리
  • **Kubernetes 최적화 **: 매니페스트 자동 생성, 헬스 체크, ConfigMap 연동
  • **700+ 확장 **: 대부분의 자바 생태계를 빌드 타임 최적화와 함께 사용
  • **MicroProfile 표준 **: 벤더 종속 없는 표준 API 기반

자바가 클라우드 네이티브 환경에서 경쟁력이 없다는 것은 이제 과거의 이야기입니다. Quarkus는 자바의 강점(풍부한 생태계, 타입 안전성, 엔터프라이즈 안정성)을 유지하면서 클라우드 네이티브 환경에서 요구하는 성능 요건을 충족시키는 방법을 보여주고 있습니다.

댓글 로딩 중...