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();
}
}
ArticleRepository 는 org.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 클래스, ServerVerticle 및 ArticleRecipientVerticle 에 @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에서 사용할 수 있습니다.