1. 소개
요즘에는 인프라에 대해 걱정하지 않고 애플리케이션을 작성하고 클라우드에 배포하는 것이 매우 일반적입니다. 서버리스와 FaaS는 매우 대중화되었습니다.
인스턴스가 자주 생성되고 소멸되는 이러한 유형의 환경에서는 완전히 다른 사용자 경험을 생성할 수 있으므로 부팅 시간과 최초 요청 시간이 매우 중요합니다.
JavaScript 및 Python과 같은 언어는 이러한 유형의 시나리오에서 항상 주목을 받고 있습니다. 즉, JAR이 크고 부팅 시간이 긴 Java는 결코 최고의 경쟁자가 아닙니다.
이 사용방법(예제)에서는 Quarkus를 제시하고 이것이 Java를 클라우드에 보다 효과적으로 도입하기 위한 대안인지 논의합니다 .
2. 쿼커스
Supersonic Subatomic Java인 QuarkusIO 는 작은 아티팩트, 매우 빠른 부팅 시간 및 첫 번째 요청 시간 단축을 약속합니다. GraalVM 과 결합하면 Quarkus는 AOT(ahead-of-time)를 컴파일합니다.
그리고 Quarkus는 표준 위에 구축되었기 때문에 새로운 것을 배울 필요가 없습니다. 결과적으로 CDI와 JAX-RS 등을 사용할 수 있습니다. 또한 Quarkus에는 Hibernate, Kafka, OpenShift, Kubernetes 및 Vert.x를 지원하는 확장 기능을 포함하여 많은 확장 기능이 있습니다.
3. 첫 번째 적용
새 Quarkus 프로젝트를 생성하는 가장 쉬운 방법은 터미널을 열고 다음을 입력하는 것입니다.
mvn io.quarkus:quarkus-maven-plugin:0.13.1:create \
-DprojectGroupId=com.baeldung.quarkus \
-DprojectArtifactId=quarkus-project \
-DclassName="com.baeldung.quarkus.HelloResource" \
-Dpath="/hello"
이렇게 하면 프로젝트 스켈레톤, /hello 엔드포인트가 노출 된 HelloResource , 구성, Maven 프로젝트 및 Dockerfile이 생성됩니다.
IDE로 가져온 후에는 아래 이미지에 표시된 것과 유사한 구조를 갖게 됩니다.
HelloResource 클래스 의 내용을 살펴보겠습니다 .
@Path("/hello")
public class HelloResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}
지금까지는 모든 것이 좋아 보입니다. 이 시점에서 단일 RESTEasy JAX-RS 엔드포인트가 있는 간단한 애플리케이션이 있습니다. 계속해서 터미널을 열고 다음 명령을 실행하여 테스트해 보겠습니다.
./mvnw compile quarkus:dev:
REST Endpoints은 localhost:8080/hello에 노출되어야 합니다. curl 명령 으로 테스트해 보겠습니다 .
$ curl localhost:8080/hello
hello
4. 핫 리로드
개발 모드( ./mvn compile quarkus:dev )에서 실행할 때 Quarkus는 핫 리로드 기능을 제공합니다. 즉, Java 파일 또는 구성 파일에 대한 변경 사항은 브라우저를 새로 고치면 자동으로 컴파일됩니다 . 여기서 가장 인상적인 기능은 파일을 저장할 필요가 없다는 것입니다. 이것은 우리의 선호도에 따라 좋거나 나쁠 수 있습니다.
이제 핫 리로드 기능을 보여주기 위해 예제를 수정하겠습니다. 응용 프로그램이 중지되면 개발자 모드에서 간단히 다시 시작할 수 있습니다. 이전과 동일한 예를 시작점으로 사용합니다.
먼저 HelloService 클래스를 만듭니다.
@ApplicationScoped
public class HelloService {
public String politeHello(String name){
return "Hello Mr/Mrs " + name;
}
}
이제 HelloService 를 주입하고 새 메서드를 추가하여 HelloResource 클래스를 수정합니다.
@Inject
HelloService helloService;
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/polite/{name}")
public String greeting(@PathParam("name") String name) {
return helloService.politeHello(name);
}
다음으로 새 엔드포인트를 테스트해 보겠습니다.
$ curl localhost:8080/hello/polite/Baeldung
Hello Mr/Mrs Baeldung
속성 파일에도 동일하게 적용할 수 있음을 보여주기 위해 한 번 더 변경하겠습니다. application.properties 파일을 편집하고 키를 하나 더 추가해 보겠습니다.
greeting=Good morning
그런 다음 새 속성을 사용 하도록 HelloService 를 수정합니다 .
@ConfigProperty(name = "greeting")
private String greeting;
public String politeHello(String name){
return greeting + " " + name;
}
동일한 curl 명령을 실행하면 이제 다음을 볼 수 있습니다.
Good morning Baeldung
다음을 실행하여 애플리케이션을 쉽게 패키징할 수 있습니다.
./mvnw package
이렇게 하면 대상 디렉토리 내에 2개의 jar 파일이 생성됩니다.
- quarkus-project-1.0-SNAPSHOT-runner.jar — target/lib 에 복사된 의존성이 있는 실행 가능한 jar
- quarkus-project-1.0-SNAPSHOT.jar — 클래스 및 리소스 파일 포함
이제 패키지 애플리케이션을 실행할 수 있습니다.
java -jar target/quarkus-project-1.0-SNAPSHOT-runner.jar
5. 네이티브 이미지
다음으로 애플리케이션의 기본 이미지를 생성합니다. 기본 이미지는 시작 시간과 첫 번째 응답까지의 시간을 개선합니다. 즉, 애플리케이션을 실행하는 데 필요한 최소한의 JVM을 포함하여 실행에 필요한 모든 것을 포함합니다 .
먼저 GraalVM을 설치하고 GRAALVM_HOME 환경 변수를 구성해야 합니다 .
이제 애플리케이션을 중지하고(Ctrl + C) 아직 중지하지 않은 경우 다음 명령을 실행합니다.
./mvnw package -Pnative
완료하는 데 몇 초 정도 걸릴 수 있습니다. 네이티브 이미지는 더 빠르게 부팅하기 위해 모든 코드 AOT를 생성하려고 하기 때문에 결과적으로 빌드 시간이 길어집니다.
./mvnw verify -Pnative 를 실행 하여 네이티브 아티팩트가 제대로 구성되었는지 확인할 수 있습니다.
둘째, 기본 실행 파일을 사용하여 컨테이너 이미지를 만듭니다 . 이를 위해서는 머신에서 실행 중인 컨테이너 런타임(예: Docker )이 있어야 합니다. 터미널 창을 열고 다음을 실행해 봅시다:
./mvnw package -Pnative -Dnative-image.docker-build=true
이렇게 하면 Linux 64비트 실행 파일이 생성되므로 다른 OS를 사용하는 경우 더 이상 실행되지 않을 수 있습니다. 지금은 괜찮습니다.
프로젝트 생성 은 우리를 위해 Dockerfile.native 를 만들었습니다.
FROM registry.fedoraproject.org/fedora-minimal
WORKDIR /work/
COPY target/*-runner /work/application
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
파일을 검사하면 다음에 오는 내용에 대한 힌트를 얻을 수 있습니다. 먼저 도커 이미지를 만듭니다 .
docker build -f src/main/docker/Dockerfile.native -t quarkus/quarkus-project .
이제 다음을 사용하여 컨테이너를 실행할 수 있습니다.
docker run -i --rm -p 8080:8080 quarkus/quarkus-project
컨테이너는 0.009초라는 매우 짧은 시간에 시작되었습니다. 이것이 Quarkus의 강점 중 하나입니다.
마지막으로 수정된 REST를 테스트하여 애플리케이션의 유효성을 검사해야 합니다.
$ curl localhost:8080/hello/polite/Baeldung
Good morning Baeldung
6. OpenShift에 배포
Docker를 사용하여 로컬에서 테스트를 완료하면 컨테이너를 OpenShift 에 배포합니다 . 레지스트리에 Docker 이미지가 있다고 가정하면 아래 단계에 따라 애플리케이션을 배포할 수 있습니다.
oc new-build --binary --name=quarkus-project -l app=quarkus-project
oc patch bc/quarkus-project -p '{"spec":{"strategy":{"dockerStrategy":{"dockerfilePath":"src/main/docker/Dockerfile.native"}}}}'
oc start-build quarkus-project --from-dir=. --follow
oc new-app --image-stream=quarkus-project:latest
oc expose service quarkus-project
이제 다음을 실행하여 애플리케이션 URL을 얻을 수 있습니다.
oc get route
마지막으로 동일한 엔드포인트에 액세스합니다(IP 주소에 따라 URL이 다를 수 있음).
$ curl http://quarkus-project-myproject.192.168.64.2.nip.io/hello/polite/Baeldung
Good morning Baeldung
7. 결론
이 기사에서 우리는 Quarkus가 Java를 클라우드로 보다 효과적으로 가져올 수 있는 훌륭한 추가 기능임을 보여주었습니다. 예를 들어 이제 AWS Lambda에서 Java를 상상할 수 있습니다. 또한 Quarkus는 JPA 및 JAX/RS와 같은 표준을 기반으로 합니다. 그러므로 우리는 새로운 것을 배울 필요가 없습니다.
Quarkus는 최근 많은 주목을 받았으며 매일 많은 새로운 기능이 추가되고 있습니다. Quarkus GitHub 리포지토리 에는 Quarkus 를 사용해 볼 수 있는 몇 가지 빠른 시작 프로젝트가 있습니다 .
항상 그렇듯이 이 기사의 코드는 GitHub에서 사용할 수 있습니다 . 즐거운 코딩하세요!