1. 개요

이 빠른 기사에서는 Spring과 Vert-x의 통합에 대해 논의하고 강력하고 잘 알려진 Spring 기능과 Vert.x의 반응성 단일 이벤트 루프라는 두 가지 장점을 모두 활용합니다.

Vert.x에 대한 자세한 내용은 여기에서 소개 기사를 참조하십시오 .

2. 설정

먼저 의존성을 제자리에 배치해 보겠습니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-web</artifactId>
    <version>3.4.1</version>
</dependency>

verticles를 사용하여 서비스를 배포할 예정 이므로 spring-boot-starter-web 에서 임베디드 Tomcat 의존성을 제외했습니다 .

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

3. 스프링 Vert.x 애플리케이션

이제 두 개의 버티클이 배포된 샘플 애플리케이션을 빌드합니다.

첫 번째 Verticle은 요청을 지정된 주소에 메시지로 보내는 핸들러로 요청을 라우팅합니다. 다른 Verticle은 주어진 주소에서 수신 대기합니다.

이것들을 실제로 살펴봅시다.

3.1. 발신자 수직

ServerVerticle 은 HTTP 요청을 수락하고 메시지로 지정된 주소로 보냅니다. AbstractVerticle을 확장 하는 ServerVerticle 클래스 를 만들고 start() 메서드를 재정의하여HTTP 서버를 만듭니다.

@Override
public void start() throws Exception {
    super.start();

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

    vertx.createHttpServer()
      .requestHandler(router::accept)
      .listen(config().getInteger("http.port", 8080));
}

서버 요청 처리기에서 들어오는 요청을 getAllArticlesHandler 처리기 로 리디렉션하는 라우터 개체 를 전달했습니다.

private void getAllArticlesHandler(RoutingContext routingContext) {
    vertx.eventBus().<String>send(ArticleRecipientVerticle.GET_ALL_ARTICLES, "", 
      result -> {
        if (result.succeeded()) {
            routingContext.response()
              .putHeader("content-type", "application/json")
              .setStatusCode(200)
              .end(result.result()
              .body());
        } else {
            routingContext.response()
              .setStatusCode(500)
              .end();
        }
      });
}

핸들러 메서드에서 이벤트 ID를 GET_ALL_ARTICLES로 사용하여 이벤트를 Vert.x 이벤트 버스로 전달합니다. 그런 다음 성공 및 오류 시나리오에 따라 콜백을 처리합니다.

이벤트 버스의 메시지 는 다음 섹션에서 설명 하는 ArticleRecipientVerticle 의해 소비됩니다 .

3.2. 받는 사람 Verticle

ArticleRecipientVerticle 은 들어오는 메시지를 수신하고 Spring bean을 주입합니다 . Spring과 Vert.x의 랑데뷰 포인트 역할을 합니다.

Spring 서비스 빈을 Verticle에 주입하고 각각의 메서드를 호출합니다.

@Override
public void start() throws Exception {
    super.start();
    vertx.eventBus().<String>consumer(GET_ALL_ARTICLES)
      .handler(getAllArticleService(articleService));
}

여기에서 articleService 는 삽입된 Spring 빈입니다.

@Autowired
private ArticleService articleService;

이 Verticle은 주소 GET_ALL_ARTICLES에서 이벤트 버스를 계속 수신합니다. 메시지를 받으면 getAllArticleService 핸들러 메서드에 Delegation합니다.

private Handler<Message<String>> getAllArticleService(ArticleService service) {
    return msg -> vertx.<String> executeBlocking(future -> {
        try {
            future.complete(
            mapper.writeValueAsString(service.getAllArticle()));
        } catch (JsonProcessingException e) {
            future.fail(e);
        }
    }, result -> {
        if (result.succeeded()) {
            msg.reply(result.result());
        } else {
            msg.reply(result.cause().toString());
        }
    });
}

이는 필요한 서비스 작업을 수행하고 상태와 함께 메시지에 회신합니다. 메시지 응답은 이전 섹션에서 본 것처럼 ServerVerticle 및 콜백 결과 에서 참조됩니다.

4. 서비스 클래스

서비스 클래스는 리포지토리 계층과 상호 작용하는 메서드를 제공하는 간단한 구현입니다.

@Service
public class ArticleService {

    @Autowired
    private ArticleRepository articleRepository;

    public List<Article> getAllArticle() {
        return articleRepository.findAll();
    }
}

ArticleRepositoryorg.springframework.data.repository.CrudRepository 를 확장 하고 기본 CRUD 기능을 제공합니다.

5. 버티클 배포

일반 Spring Boot 애플리케이션에 대해 수행하는 방식대로 애플리케이션을 배포할 것입니다. Spring 컨텍스트 초기화가 완료된 후 Vert.X 인스턴스를 생성하고 그 안에 verticle을 배포해야 합니다.

public class VertxSpringApplication {

    @Autowired
    private ServerVerticle serverVerticle;

    @Autowired
    private ArticleRecipientVerticle articleRecipientVerticle;

    public static void main(String[] args) {
        SpringApplication.run(VertxSpringApplication.class, args);
    }

    @PostConstruct
    public void deployVerticle() {
        Vertx vertx = Vertx.vertx();
        vertx.deployVerticle(serverVerticle);
        vertx.deployVerticle(articleRecipientVerticle);
    }
}

우리는 verticle 인스턴스를 Spring 애플리케이션 클래스에 주입하고 있습니다. 따라서 Verticle 클래스에 어노테이션을 달아야 합니다.

따라서 Verticle 클래스, ServerVerticleArticleRecipientVerticle@Component로 어노테이션을 달아야 합니다.

애플리케이션을 테스트해 보겠습니다.

@Test
public void givenUrl_whenReceivedArticles_thenSuccess() {
    ResponseEntity<String> responseEntity = restTemplate
      .getForEntity("http://localhost:8080/api/baeldung/articles", String.class);
 
    assertEquals(200, responseEntity.getStatusCodeValue());
}

6. 결론

이 기사에서는 Spring과 Vert.x를 사용하여 RESTful WebService를 빌드하는 방법에 대해 배웠습니다.

평소와 같이 예제는 GitHub에서 사용할 수 있습니다.

Generic footer banner