Quarkus를 사용한 REST API 구축

22735 단어 quarkusjava
Quarkus는 컨테이너에서 실행하도록 설계된 Java 프레임입니다.빠른 시작 시간과 낮은 메모리 사용률에 집중하여 Kubernetes 등 용기 편성 플랫폼에서 실행하기에 더욱 적합하도록 합니다.
나는 Quarkus에 관한 문장을 쓰고 싶었는데, 이제 드디어 쓸 시간이 생겼다.
이 문서의 내용은 Quarkus를 사용하여 간단한 REST API를 작성하는 데 집중될 것이다.나는 Quarkus가 어떻게 일을 하는지 설명하지 않을 것이다. 왜냐하면 나는 아직 정확하게 설명하는 데 시간이 걸리지 않았기 때문이다.나는 이후의 게시물에서 이 문제를 바로잡을 수 있기를 바란다.따라서, 당신이Quarkus에 대한 정보를 더 알고 싶다면, 나는 당신이 그들의 docs 를 찾아보는 것을 권장합니다.지금까지 나는 그것들이 매우 상세하고 잘 쓰여진 것을 발견했다. 나는 개인적으로 그것들을 계속 사용하면서 Quarkus를 더욱 탐색할 것이다.

프로젝트 만들기
Quarkus는 maven 명령을 제공하여 프로젝트를 안내합니다. 예를 들어 (다음은 Linux와 MacOS에 적용되며 Quarkus - Getting started guide 를 참고하여 더 많은 정보를 얻으십시오.)
mvn io.quarkus:quarkus-maven-plugin:1.7.2.Final:create \
    -DprojectGroupId=dev.lankydan \
    -DprojectArtifactId=quarkus \
    -DclassName="dev.lankydan.web.people.PersonResource" \
    -Dpath="/hello"
이것은 HTTP 노드 in PersonResource 과 경로 hello, 응용 프로그램을 구축하고 실행하는 데 사용되는 자원을 포함하는 기본 프로젝트를 생성합니다.사실상, 이 때 로컬과 용기에서 생성된 코드를 실행할 충분한 자원이 있어야 합니다.
필요한 의존항을 포함하는 pom.xml만약 Hello World의 예시 이외의 어떤 것을 쓰고 싶다면, 이 점에 추가해야 한다.
실행(프로젝트 내에서):
./mvnw quarkus:list-extensions
프로젝트에서 사용할 수 있는 Quarkus 의존 항목/확장을 볼 수 있습니다.
그런 다음 다음 다음 명령을 사용하여 확장을 추가할 수 있습니다.
./mvnw quarkus:add-extension -Dextensions="hibernate-validator"
다른 옵션은 의존항을 정리할 때 보통 하는 것처럼 수동으로 추가하는 것입니다.나는 단지 add-extension 명령을 언급하고 싶었을 뿐이다. 왜냐하면 마븐을 사용할 때 나는 실제로 이런 의존 관계 관리 방법을 만나지 못했기 때문이다.

I keep mentioning Maven, but there is no reason you can't using something else, such as Gradle.



Quarkus는 JAX-RS를 사용하여 REST 기능을 수행합니다.
Quarkus는 JAX-RS규범을 따랐는데 그 중에서 Resteasy는 이를 실현했다.Java를 사용한 지 오래되었다면, JAX-RS 규범을 따르는 코드를 보거나 작성한 적이 있을 것입니다. 만약 그렇지 않다면, 언제든지 이 코드를 보거나 작성할 수 있습니다.나는 이전에 그것을 사용할 필요가 없었기 때문에 (자바 분야에서는 스프링을 사용하는 경향이 있다) 그것은 나에게 상당히 새로운 것이다.한 마디로 하면 일반적으로 주석에 의존하여 대부분의 간단한 REST API를 실현할 수 있습니다.

CDI bean을 사용하여 Quarkus 의존 주입
Quarkus의 의존항 해결 방안은 CDI(상하문과 의존항 주입) 규범을 바탕으로 한다.주의해야 할 것은 Quarkus가 완전한 CDI 구현을 제공하지 않았기 때문에 이것은 사용자가 사용할 수 있는 다른 프레임워크에 비해 한계가 있다는 것을 의미합니다.자세한 내용은 Quarkus' CDI referenceIntroduction to CDI에서 확인할 수 있습니다.

REST API 구현
관리자를 위한 REST API 예제를 만들었습니다.내 말은 API의 용도는 결코 중요하지 않다. 왜냐하면 그것은 단지 하나의 예일 뿐이다.다음은 매우 긴 코드입니다.
@Path("/people")
public class PersonResource {

  private final PersonRepository personRepository;

  public PersonResource(PersonRepository personRepository) {
    this.personRepository = personRepository;
  }

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public List<Person> all() {
    return personRepository.findAll();
  }

  @GET
  @Path("/{id}")
  @Produces(MediaType.APPLICATION_JSON)
  public Person get(@PathParam("id") UUID id) {
    return personRepository.findById(id);
  }

  @POST
  @Produces(MediaType.APPLICATION_JSON)
  public Person post(Person person) {
    return personRepository.insert(
        new Person(UUID.randomUUID(), person.getName(), person.getAge())
    );
  }

  @PUT
  @Path("/{id}")
  @Produces(MediaType.APPLICATION_JSON)
  public Person put(@PathParam("id") UUID id, Person person) {
    if (personRepository.findById(id) == null) {
      throw new PersonNotFoundException(id);
    }
    return personRepository.update(new Person(id, person.getName(), person.getAge()));
  }

  @DELETE
  @Path("/{id}")
  @Produces(MediaType.APPLICATION_JSON)
  public void delete(@PathParam("id") UUID id) {
    if (personRepository.findById(id) == null) {
      throw new PersonNotFoundException(id);
    }
    personRepository.deleteById(id);
  }
}
앞에서 언급한 바와 같이Quarkus는 Resteasy를 자신의 JAX-RS로 사용한다.이 클래스의 모든 주석은 JAX-RS와 관련이 있습니다. 여기서 함수 중 하나를 빠르게 살펴보겠습니다.
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Person get(@PathParam("id") UUID id) {
  return personRepository.findById(id);
}
  • @GET GET HTTP 요청을 처리하는 방법을 지정합니다.
  • @Path("/{id}")@PathParam HTTP path 변수id를 함께 사용하여 끝점 입력으로 사용
  • @Produces(MediaType.APPLICATION_JSON)는 단점이 JSON으로 되돌아오는 데이터 형식을 나타낸다
  • 주석에 관해서는 이 정도면 충분하다.이 방법의 나머지 부분은 입력Person과 일치하는 id을 찾아 단점이라고 불리는 모든 대상으로 되돌려주는 것을 포함한다.직접 되돌아오는 Person 대상이 아니라 Response 대상을 사용할 수 있지만, 나는 그것이 간단하고 읽기 쉽기를 바란다.

    JSON 서열화
    JSON-B 또는 Jackson를 사용하여 서열화할 수 있습니다.개인적으로 나는 잭슨을 사용하는 경향이 있어서 계속 사용하고 삽입했다.선택한 확장자 중 하나를 추가해야 합니다.
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy-jackson</artifactId>
    </dependency>
    
    또는 명령을 통해 다음을 수행할 수 있습니다.
    ./mvnw quarkus:add-extension -Dextensions="resteasy-jackson"
    

    Replace "jackson" with "jsonb" to switch over to JSON-B



    JDBC를 사용하여 데이터베이스에 연결
    만약 이 API가 어느 곳에서 데이터를 영구화할 수 없다면, 그것은 어떤 유용한 일도 하지 못할 것이다.
    Quarkus는 데이터베이스에 연결하는 JDBC 구현을 제공합니다.나는 이 프로젝트의 데이터베이스에서 Postgres를 사용하기로 선택했지만, 분명히 너는 네가 필요로 하는 모든 것을 사용할 수 있다.자세한 내용은 Quarkus' data source documentation를 참조하십시오.
    데이터베이스에 연결하려면 먼저 JDBC 드라이버 종속성을 추가해야 합니다.
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-jdbc-postgresql</artifactId>
    </dependency>
    
    너도 뛸 수 있다.
    ./mvnw quarkus:add-extension -Dextensions="jdbc-postgresql"
    
    그런 다음 지정된 접속 유형 및 세부 정보에 대한 속성을 application.properties에 추가합니다.
    quarkus.datasource.db-kind=postgresql
    # Change this part to match your connection details!
    quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/mytestdb
    quarkus.datasource.username=admin
    quarkus.datasource.password=admin
    

    연못
    데이터베이스 연결을 직접 관리하고 싶지 않습니다.
    Quarkus가 선택한 JDBC 데이터 소스와 연결 탱크 라이브러리는 Agroal입니다.다음은 Quarkus data source documentation의 인용이다.

    Agroal is a modern, light weight connection pool implementation designed for very high performance and scalability, and features first class integration with the other components in Quarkus, such as security, transaction management components, health metrics.


    이것은 당신에게 무엇을 의미하는가:
  • 종속성에 Agrol 확장을 추가하려면:
  • <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-agroal</artifactId>
    </dependency>
    
    또는 다음을 실행합니다.
    ./mvnw quarkus:add-extension -Dextensions="agroal"
    
  • 를 초기화한 DataSource 주입 코드AgroalDataSource 또는 DataSource 인터페이스를 직접 통과).

  • 라이브러리 작성
    데이터 원본 연결을 정리하고 연결 탱크를 사용하면 검색어를 작성할 수 있습니다.다음은 PersonRepository의 간략한 버전이다. 원시 JDBC를 사용하기 때문에 코드가 상당히 길고 함수 사이에서 중복된다는 것을 의미한다.
    @ApplicationScoped
    public class PersonRepository {
    
      private static final String FIND_BY_ID = "SELECT * FROM people WHERE id = ?";
    
      private final DataSource dataSource;
    
      public PersonRepository(DataSource dataSource) {
        this.dataSource = dataSource;
      }
    
      public Person findById(UUID id) {
        try (Connection connection = dataSource.getConnection();
            PreparedStatement statement = connection.prepareStatement(FIND_BY_ID)) {
          statement.setObject(1, id);
          try (ResultSet resultSet = statement.executeQuery()) {
            if (resultSet.next()) {
              return new Person(
                  UUID.fromString(resultSet.getString("id")),
                  resultSet.getString("name"),
                  resultSet.getInt("age"));
            }
          }
        } catch (SQLException e) {
          throw new PersistenceException(e);
        }
        return null;
      }
    }
    
    이 코드의 주요 장점은 Agrol이 그것을 위해 실현된 DataSource 용법을 제공하는 것이다.JDBC 드라이버와 Agrol 자체의 의존항만 포함하면 구성 요소에 주입할 수 있습니다.JDBC 코드에 대해서는 JDBC 일반 사용법에 대한 더 많은 정보here를 찾을 수 있습니다.

    어플리케이션 실행
    Quarkus 응용 프로그램을 실행하려면 다음을 수행합니다.
    ./mvnw compile quarkus:dev
    
    이것은 개발 모드에서 프로그램을 실행하여 열 리셋을 사용합니다.당신의 개발 체험을 더욱 원활하게 하세요.그럼에도 불구하고, 나는 코드가 바뀔 때마다 프로그램을 다시 시작하는 습관을 깨기가 매우 어렵다는 것을 발견했다.
    실제 모드나 비개발 모드로 프로그램을 실행하려면 프로그램의jar를 구축하고 실행해야 합니다.다음 방법을 사용하여 이 작업을 완료할 수 있습니다.
    ./mvnw package
    java -jar target/quarkus-1.0-SNAPSHOT-runner.jar
    

    ./mvnw package places the generated jar in the target directory


    만약 내가 본문에서 보여준 명령을 사용하여 프로젝트를 생성한다면, 이 모든 정보를 포함하는 README.md 메시지가 있을 것이다.이 컴퓨터의 실행 가능한 파일을 만드는 방법과 용기에서Quarkus 프로그램을 실행하는 방법을 포함합니다.나는 미래의 블로그 글에서 그 중의 일부 내용을 소개할 것이다.

    요약
    이제 Quarkus를 사용하여 REST API를 작성하는 방법에 대해 잘 알고 있어야 합니다.대부분의 다른 프레임워크와 마찬가지로 의존 관계를 이용하여 응용 프로그램을 신속하고 효과적으로 구축할 수 있습니다.Quarkus에서 같은 일을 할 수 있도록 허락합니다.내가 너에게 새로운 의존항을 추가하는 횟수를 알려주면 이 점을 알 수 있다.
    Quarkus가 제공하는 내용으로 돌아가서 빠른 시작 시간과 낮은 메모리 사용률을 전문적으로 연구하는 프레임워크임을 기억하십시오.저는 이러한 요소에 대한 진일보한 토론을 잊어버리고 Quarkus를 사용하여 응용 프로그램을 구축하는 데 전념하고자 합니다. 이것은 JAX-RS를 사용하는 REST 응용 프로그램을 구축하는 것과 거의 같습니다. 따라서 귀하와 같은 개발자/엔지니어가 Quarkus를 사용하여 REST API를 구축하는 방법을 검색할 때 이 점이 낯설지 않다는 것을 알게 될 것입니다.Quarkus 사용의 이점은 향후 내용에 소개할 예정입니다.
    주요 내용에 대한 주의력을 분산시키지 않기 위해서, 나는 일부 부분을 생략했지만, 너는 나의 GitHub repository에서 내가 예시를 만드는 데 사용하는 모든 코드를 찾을 수 있다.
    만약 당신이 이 글을 좋아하거나 유용하다고 생각한다면 (또는 둘 다 유용하다) 언제든지 트위터에서 저를 주목하고 이 글이 유용하다고 생각할 수 있는 모든 사람과 공유하세요!

    좋은 웹페이지 즐겨찾기