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:
mvn 컴파일 quarkus 개발

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에서 사용할 수 있습니다 . 즐거운 코딩하세요!

Cloud footer banner