Spring

Quarkus 사용방법(예제)

기록만이살길 2023. 1. 6. 17:29
반응형

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
참고
  • https://docs.spring.io/spring-framework/docs/current/reference/html
  • https://www.baeldung.com/quarkus-io
반응형