웹 애플리케이션 개발에 있어서 성능은 매우 중요한 요소입니다. 이 글에서는 두 가지 Java 스택(Spring Boot 3.0.2와 Eclipse MicroProfile 4.2)을 사용하여 동일한 웹 애플리케이션을 구현하고, 이를 비교해보려 합니다. Eclipse MicroProfile의 경우, 다양한 구현체가 존재하는데, 그 중에서도 Quarkus 2.16.2를 사용할 것입니다. 이러한 비교를 통해 각 기술의 Resident Set Size(RSS)와 Time to First Request(TFR)라는 두 가지 중요한 성능 지표를 살펴보겠습니다.
Eclipse MicroProfile와 Spring Boot 개요
Eclipse MicroProfile은 여러 구현체가 존재하는 반면, Spring Boot는 특정 구현체가 없습니다. 이는 Spring Boot가 특정 사양에 기반하지 않고, 다양한 환경에서 사용될 수 있음을 의미합니다. 반면 Eclipse MicroProfile은 Quarkus, Wildfly, Open Liberty, Payara와 같은 다양한 구현체를 가지고 있습니다.
비교할 웹 애플리케이션의 용도
우리가 구현할 웹 애플리케이션은 보도 자료(press release)를 관리하는 마이크로서비스입니다. 보도 자료는 공식 발표나 공지 사항을 제공하기 위해 뉴스 미디어에 전달되는 공식 성명서입니다. 여기서는 간단히 이름, 작성자, 발행자 등의 데이터를 포함하는 보도 자료를 CRUD(생성, 읽기, 수정, 삭제)할 수 있는 REST API를 제공합니다. 이 마이크로서비스는 Spring Boot와 Quarkus 두 가지 기술로 각각 구현됩니다.
성능 지표
Resident Set Size (RSS)
RSS는 프로세스가 사용하는 RAM의 양을 나타내며, JVM의 힙 메모리, 클래스 메타데이터, 스레드 스택, 컴파일된 코드, 가비지 컬렉션 등이 포함됩니다. 이는 애플리케이션의 성능과 메모리 사용량을 비교하는 데 매우 신뢰할 수 있는 지표입니다.
Time to First Request (TFR)
애플리케이션의 초기화 시간을 측정하는 것은 중요합니다. 일반적으로 로그 파일에 기록되는 애플리케이션의 시작 시간은 실제 요청을 처리할 수 있는 시간이 아닙니다. 이를 정확하게 측정하기 위해 Clément Escoffier의 time.js 스크립트를 사용하여 TFR을 측정합니다.
Spring Boot 구현
Spring Boot로 구현한 마이크로서비스의 성능을 측정하기 위해 다음과 같은 단계를 따릅니다:
Git 리포지토리를 클론하고, Spring Boot 브랜치를 체크아웃합니다:
$ git clone https://github.com/nicolasduminil/Comparing-Resident-Size-Set-Between-Spring-Boot-and-Quarkus.git metrics
$ cd metrics
$ git checkout spring-boot
$ mvn package
$ java -jar target/metrics.jar
Swagger UI를 통해 API를 테스트합니다. 먼저 POST 엔드포인트를 사용해 보도 자료를 생성한 후, GET /all과 GET /id로 확인합니다. 그 다음, PUT을 사용해 보도 자료를 수정하고, DELETE /id로 삭제합니다. ID는 자동으로 생성되며, 첫 번째 레코드는 ID 1을 가집니다.
애플리케이션의 RSS를 측정합니다:
$ ps aux | grep metrics
$ ps -o pid,rss,command -p <PID>
TFR을 측정합니다:
$ node time.js "java -jar target/metrics.jar" "http://localhost:8080/"
위 과정을 통해 Spring Boot 마이크로서비스의 RSS는 624MB, TFR은 173ms임을 확인할 수 있습니다.
Quarkus 구현
Quarkus로 구현한 마이크로서비스의 성능을 측정하기 위해 다음과 같은 단계를 따릅니다:
Quarkus 브랜치를 체크아웃하고, 마이크로서비스를 시작합니다:
$ git checkout quarkus
$ mvn package quarkus:dev
Swagger UI를 통해 API를 테스트합니다. 또는 제공된 curl 스크립트를 사용할 수 있습니다:
$ java -jar target/quarkus-app/quarkus-run.jar &
$ ./post.sh
$ ./get.sh
$ ./get-1.sh 1
$ ./update.sh
애플리케이션의 RSS를 측정합니다:
$ ps aux | grep quarkus-run
$ ps -o pid,rss,command -p <PID>
TFR을 측정합니다:
$ node time.js "java -jar target/quarkus-app/quarkus-run.jar" "http://localhost:8081/q/swagger-ui"
Quarkus 마이크로서비스의 RSS는 168MB, TFR은 121ms임을 확인할 수 있습니다. 이는 Spring Boot에 비해 RSS는 약 500MB 적게 사용하며, TFR도 약간 더 빠릅니다.
결론
이번 비교를 통해 두 가지 Java 스택(Spring Boot와 Quarkus)의 성능을 확인해 보았습니다. Spring Boot는 메모리 사용량이 더 크지만, Quarkus는 더 적은 메모리를 사용하면서도 더 빠른 응답 시간을 보여줍니다. 이는 Quarkus가 경량화된 프레임워크로서, 더 나은 성능을 제공할 수 있음을 의미합니다.
추후에는 GraalVM을 사용한 네이티브 이미지로 변환하여 성능을 비교해볼 계획입니다. 이는 특히 Spring Boot가 Java introspection에 많이 의존하기 때문에 어려움이 있지만, 이를 극복하는 방법을 연구할 것입니다.
'SW > Spring Boot' 카테고리의 다른 글
Spring Boot 3.0과 Spring Data JPA 및 Querydsl 업그레이드 가이드 (0) | 2024.07.16 |
---|---|
Spring Boot 애플리케이션에서 Neo4j 데이터베이스 연결 검증 방법 (0) | 2024.06.02 |
Spring Boot 애플리케이션에서 Neo4j 데이터베이스 연결 검증하기 (0) | 2024.06.01 |
Spring Boot 구성 프로퍼티: 설정 애너테이션 이해와 활용법 (0) | 2024.05.17 |
스프링 부트 : 리액트와 Hilla 사용 방법 (0) | 2023.10.11 |