1. 개요

이 기사에서는 Vert.x 에 대해 논의하고 핵심 개념을 다루며 간단한 RESTfull 웹 서비스를 만듭니다.

툴킷에 대한 기본 개념부터 시작하여 천천히 HTTP 서버로 이동한 다음 RESTfull 서비스를 빌드합니다.

2. Vert.x 소개

Vert.x는 Eclipse 개발자가 제공하는 오픈 소스, 반응형 및 다중 언어 소프트웨어 개발 툴킷입니다.

리액티브 프로그래밍은 변경 사항이나 이벤트에 응답하는 비동기 스트림과 관련된 프로그래밍 패러다임입니다.

마찬가지로 Vert.x는 이벤트 버스를 사용하여 애플리케이션의 다른 부분과 통신하고 이벤트를 핸들러에 비동기적으로 전달합니다.

Java, Groovy, Ruby, Python 및 JavaScript와 같은 여러 JVM 및 비 JVM 언어에 대한 지원으로 인해 polyglot이라고 합니다.

3. 설정

Vert.x를 사용하려면 Maven 의존성을 추가해야 합니다.

<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-core</artifactId>
    <version>3.4.1</version>
</dependency>

의존성의 최신 버전은 여기 에서 찾을 수 있습니다 .

3. 정점

Verticle은 Vert.x 엔진이 실행하는 코드 조각입니다. 이 툴킷은 우리가 원하는 대로 확장하고 구현할 수 있는 많은 추상 버티클 클래스를 제공합니다.

다국어이므로 지원되는 모든 언어로 verticle을 작성할 수 있습니다. 애플리케이션은 일반적으로 동일한 Vert.x 인스턴스에서 실행되는 여러 버티클로 구성되며 이벤트 버스를 통해 이벤트를 사용하여 서로 통신합니다.

JAVA에서 verticle을 생성하려면 클래스는 io.vertx.core.Verticle 인터페이스 또는 해당 하위 클래스 중 하나를 구현해야 합니다.

4. 이벤트 버스

모든 Vert.x 응용 프로그램의 신경 시스템입니다.

반응형이기 때문에 버티클은 메시지나 이벤트를 받을 때까지 휴면 상태를 유지합니다. 버티클은 이벤트 버스를 통해 서로 통신합니다. 메시지는 문자열에서 복잡한 객체에 이르기까지 무엇이든 될 수 있습니다.

메시지 처리는 이상적으로는 비동기식이며 메시지는 이벤트 버스에 대기하고 제어권은 발신자에게 반환됩니다. 나중에 그것은 청취 verticle에 Queue에서 제외됩니다. 응답은 Future콜백 메서드를 사용하여 전송됩니다.

5. 간단한 Vert.x 애플리케이션

verticle이 있는 간단한 애플리케이션을 만들고 vertx 인스턴스 를 사용하여 배포해 보겠습니다 . verticle을 만들기 위해

verticle을 만들기 위해 io.vertx.core.AbstractVerticle 클래스를 확장하고 start() 메서드를 재정의합니다.

public class HelloVerticle extends AbstractVerticle {

    @Override
    public void start(Future<Void> future) {
        LOGGER.info("Welcome to Vertx");
    }
}

start() 메서드 는 verticle이 배포될 때 vertx 인스턴스 에 의해 호출됩니다 . 이 메서드는 io.vertx.core.Future 를 매개변수로 사용하여 verticle의 비동기 배포 상태를 검색하는 데 사용할 수 있습니다.

이제 verticle을 배포해 보겠습니다.

public static void main(String[] args) {
    Vertx vertx = Vertx.vertx();
    vertx.deployVerticle(new HelloVerticle());
}

마찬가지로 AbstractVerticle 클래스에서 stop() 메서드를 재정의할 수 있습니다. 이 메서드 는 verticle을 종료하는 동안 호출됩니다.

@Override
public void stop() {
    LOGGER.info("Shutting down application");
}

6. HTTP 서버

이제 verticle을 사용하여 HTTP 서버를 가동해 보겠습니다.

@Override
public void start(Future<Void> future) {
    vertx.createHttpServer()
      .requestHandler(r -> r.response().end("Welcome to Vert.x Intro");
      })
      .listen(config().getInteger("http.port", 9090), 
        result -> {
          if (result.succeeded()) {
              future.complete();
          } else {
              future.fail(result.cause());
          }
      });
}

start() 메서드를 재정의하여 HTTP 서버를 만들고 요청 처리기를 연결했습니다. requestHandler() 메서드 는 서버가 요청을 받을 때마다 호출됩니다.

마지막으로 서버는 포트에 바인딩되고 AsyncResult<HttpServer> 핸들러는 연결 또는 서버 시작이 성공했는지 여부에 관계없이 다음에서 future.complete() 또는 future.fail() 을 사용하여 listen() 메서드에 전달됩니다 . 모든 오류의 경우.

참고: config.getInteger() 메서드는 외부 conf.json 파일 에서 로드되는 HTTP 포트 구성의 값을 읽습니다 .

서버를 테스트해 보겠습니다.

@Test
public void whenReceivedResponse_thenSuccess(TestContext testContext) {
    Async async = testContext.async();

    vertx.createHttpClient()
      .getNow(port, "localhost", "/", response -> {
        response.handler(responseBody -> {
          testContext.assertTrue(responseBody.toString().contains("Hello"));
          async.complete();
        });
      });
}

테스트를 위해 JUnit과 함께 vertx-unit을 사용해 봅시다.:

<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-unit</artifactId>
    <version>3.4.1</version>
    <scope>test</scope>
</dependency>

여기 에서 최신 버전을 얻을 수 있습니다 .

verticle은 배포되고 단위 테스트의 setup() 메서드에서 vertx 인스턴스에 있습니다 .

@Before
public void setup(TestContext testContext) {
    vertx = Vertx.vertx();

    vertx.deployVerticle(SimpleServerVerticle.class.getName(), 
      testContext.asyncAssertSuccess());
}

마찬가지로 vertx 인스턴스는 @AfterClass tearDown() 메서드에서 닫힙니다.

@After
public void tearDown(TestContext testContext) {
    vertx.close(testContext.asyncAssertSuccess());
}

@BeforeClass setup() 메서드는 TestContext 인수를 사용합니다. 이는 테스트의 비동기 동작을 제어하고 테스트하는 데 도움이 됩니다. 예를 들어 verticle 배포는 비동기식이므로 기본적으로 올바르게 배포되지 않으면 아무것도 테스트할 수 없습니다.

deployVerticle() 메서드에 대한 두 번째 매개변수 인 testContext.asyncAssertSuccess()가 있습니다. 이는 서버가 올바르게 배포되었는지 또는 오류가 발생했는지 확인하는 데 사용됩니다. 서버 버티클의 future.complete() 또는 future.fail() 이 호출 되기를 기다립니다 . 실패하는 경우 테스트에 실패합니다.

7. RESTful 웹 서비스

HTTP 서버를 만들었으니 이제 이를 사용하여 RESTfull WebService를 호스팅할 수 있습니다. 이를 위해서는 vertx-web 이라는 또 다른 Vert.x 모듈이 필요합니다 . 이것은 vertx-core 위에 웹 개발을 위한 많은 추가 기능을 제공합니다 .

pom.xml 에 의존성을 추가해 보겠습니다 .

<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-web</artifactId>
    <version>3.4.1</version>
</dependency>

여기 에서 최신 버전을 찾을 수 있습니다 .

7.1. 라우터경로

WebService용 라우터 를 만들어 봅시다 . 이 라우터는 GET 메서드와 핸들러 메서드 getArtilces() 의 간단한 경로를 사용합니다 .

Router router = Router.router(vertx);
router.get("/api/baeldung/articles/article/:id")
  .handler(this::getArticles);

getArticle () 메서드는 새 Article 객체 를 반환하는 간단한 메서드입니다 .

private void getArticles(RoutingContext routingContext) {
    String articleId = routingContext.request()
      .getParam("id");
    Article article = new Article(articleId, 
      "This is an intro to vertx", "baeldung", "01-02-2017", 1578);

    routingContext.response()
      .putHeader("content-type", "application/json")
      .setStatusCode(200)
      .end(Json.encodePrettily(article));
}

라우터요청을 받으면 일치하는 경로를 찾고 요청을 추가로 전달합니다. 요청과 합산하기 위해 연결된 처리기 메서드가 있는 경로 .

이 경우 핸들러는 getArticle() 메서드를 호출합니다. RoutingContext 개체를 인수로 받습니다 . 경로 매개변수 ID를 파생하고 이를 사용하여 Article 객체를 생성 합니다.

메서드의 마지막 부분에서는 routingContext 개체에서 response() 메서드를 호출 하고 헤더를 넣고 HTTP 응답 코드를 설정하고 JSON 인코딩된 기사 개체를 사용하여 응답을 종료해 보겠습니다.

7.2. 서버에 라우터 추가

이제 이전 섹션에서 만든 라우터 를 HTTP 서버에 추가해 보겠습니다 .

vertx.createHttpServer()
  .requestHandler(router::accept)
  .listen(config().getInteger("http.port", 8080), 
    result -> {
      if (result.succeeded()) {
          future.complete();
      } else {
          future.fail(result.cause());
      }
});

서버에 requestHandler(router::accept) 를 추가했음을 주목 하세요. 이는 요청이 수신될 때 라우터 개체 accept() 를 호출하도록 서버에 지시합니다 .

이제 WebService를 테스트해 보겠습니다.

@Test
public void givenId_whenReceivedArticle_thenSuccess(TestContext testContext) {
    Async async = testContext.async();

    vertx.createHttpClient()
      .getNow(8080, "localhost", "/api/baeldung/articles/article/12345", 
        response -> {
            response.handler(responseBody -> {
            testContext.assertTrue(
              responseBody.toString().contains("\"id\" : \"12345\""));
            async.complete();
        });
      });
}

8. Vert.x 애플리케이션 패키징

애플리케이션을 배포 가능한 Java 아카이브(.jar)로 패키징하려면 Maven Shade 플러그인과 실행 태그의 구성을 사용합니다.

<configuration>
    <transformers>
        <transformer 
          implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <manifestEntries>
                <Main-Class>io.vertx.core.Starter</Main-Class>
                <Main-Verticle>com.baeldung.SimpleServerVerticle</Main-Verticle>
            </manifestEntries>
        </transformer>
    </transformers>
    <artifactSet />
    <outputFile>
        ${project.build.directory}/${project.artifactId}-${project.version}-app.jar
    </outputFile>
</configuration>

manifestEntries에서 Main -Verticle 은 애플리케이션의 시작점을 나타내며 Main-Classvertx 인스턴스를 생성하고 Main-Verticle을 배포하는 Vert.x 클래스입니다.

9. 결론

이 소개 기사에서는 Vert.x 툴킷과 그 기본 개념에 대해 논의했습니다. Vert.x 및 RESTFull WebService를 사용하여 HTTP 서버를 생성하는 방법을 살펴보고 vertx-unit 을 사용하여 테스트하는 방법을 보여주었습니다 .

마지막으로 응용 프로그램을 실행 가능한 jar로 패키징했습니다.

코드 스니펫의 전체 구현은 GitHub에서 사용할 수 있습니다 .

REST footer banner