Vert.x란?
자바의 비동기 소켓서버 프레임워크입니다.
= 비동기적인 네트워크 애플리케이션을 쉽게 구현할 수 있는 툴킷
웹 어플리케이션을 개발할 때 일반적으로 요청에 대한 응답을 기다리면서 작업을 처리합니다.
이것을 동기식 처리라고 합니다. 그러나 이것은 요청이 많을수록 처리 속도가 느려지는 문제가 발생할 수 있습니다.
Java Vert.x는 이 문제를 해결하기 위해 이벤트 기반 및 비동기식 프로그래밍을 제공합니다.
이를 통해 여러 작업을 동시에 처리하고, 요청이 많을 때도 빠른 속도로 처리할 수 있습니다.
Vert.x는 데이터 베이스, 파일 처리 그리고 서버와 클라이언트 모든 부분을 비동기 처리를 하는 것이 가능하다.
그렇기 때문에 I/O 부하가 심한 대규모 서비스를 개발하기에 적절한 프레임워크라고 합니다.
Vert.x에서 실행되는 하나의 프로그램을 Verticle이라고 하는데, 이 Verticle 사이에 정보를 메세지에 담아
event bus라는 매개체를 통해 주고 받게 됩니다.
Vert.x 시작하기
https://start.vertx.io/에서 쉽게 버전, 컴파일러, 디펜던시들을 설정해 생성해 시작할수있다.
압축풀고 eclipse로 열면,
package com.example.starterVertx;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
public class MainVerticle extends AbstractVerticle {
@Override
public void start(Promise<Void> startPromise) throws Exception {
vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader("content-type", "text/plain")
.end("Hello from Vert.x!");
}).listen(8888, http -> {
if (http.succeeded()) {
startPromise.complete();
System.out.println("HTTP server started on port 8888");
} else {
startPromise.fail(http.cause());
}
});
}
}
자동으로 만들어져있는데 실행해보자
run configurations
Main class : io.vertx.core.Launcher
Program argumensts : run com.example.starterVertx.MainVerticle
run을 하면!
HTTP server started on port 8888
11월 07, 2023 2:41:36 오후 io.vertx.core.impl.launcher.commands.VertxIsolatedDeployer
정보: Succeeded in deploying verticle
이렇게 뜬다.
postman키고 http://localhost:8888 으로 get으로 send보내보면...
응답을 확인 할수있다.
아래는 자세한 설명이다.
Vert.x의 오브젝트 생성
Vertx vertx = Vertx.vertx();
Vert.x의 오브젝트를 자바로 생성하는 것은 간단하다.
자바에서 integer 혹은 String을 생성하는 것과 차이가 전혀 없다.
Vert.x를 활용해 서버를 생성
HttpServer httpServer = vertx.createHttpServer();
Vert.x를 활용해 서버를 생성하는 것 역시 매우 간단하다.
생성된 서버의 포트를 지정
httpServer.listen(8000);
생성 된 서버의 포트를 지정해 주는 것은 다음과 같다.
스프링과 마찬가지로 디폴트 값은 8080
Vert.x Router
스프링에서는 별도의 Controller을 사용해 매핑을 진행하지만, Vert.x에서는 Router이란 것을 사용한다.
- Vert.x 라우터는 HTTP 요청을 처리하는 데 사용되며, RESTful 웹 서비스를 빠르고 간편하게 구현할 수 있습니다.
Vert.x 라우터를 사용하기 위해서는 다음과 같은 단계를 따릅니다
1. Vert.x의 라우터 모듈을 프로젝트에 추가합니다.
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web</artifactId>
<version>4.2.0</version>
</dependency>
2. Vert.x의 Router 클래스를 사용하여 라우터를 생성합니다.
Router router = Router.router(vertx);
3. 라우터에 HTTP 요청 핸들러를 등록합니다. Handler<RoutingContext> 인터페이스를 구현한 클래스를 생성하여
라우터에 등록하거나, 람다 표현식을 사용할 수 있습니다.
router.route("/hello").handler(routingContext -> {
routingContext.response().putHeader("content-type", "text/plain").end("Hello World!");
});
위의 예제에서는 /hello 경로에 대한 요청이 들어오면 Handler<RoutingContext> 인터페이스를 구현한 람다 표현식이 실행되며, "Hello World!"라는 메시지를 반환합니다.
생성 된 Router에서 route를 생성해서 해당 매서드가 매핑 될 앤드포인트를 지정할 수 있다.
또한 핸들러를 사용해, Post 요청인지 Get 요청인지, Update 요청인지, Delete요청인지 지정할 수 있으며,
헤더에 넣을 정보와 타입들을 지정할 수 있다.
4.라우터를 Vert.x의 HTTP 서버와 연결합니다.
vertx.createHttpServer().requestHandler(router).listen(8080);
위의 예제에서는 Vert.x의 HttpServer 클래스를 사용하여 HTTP 서버를 생성하고,
Router 객체를 요청 핸들러로 등록합니다. 마지막으로, listen() 메서드를 호출하여 HTTP 서버를 시작합니다.
Vert.x 라우터는 다양한 기능을 제공합니다.
예를 들어, 경로 매개 변수(parameter)를 처리하거나, 요청 메서드(method)별로 핸들러를 지정할 수 있습니다.
다른 코드 예제
package com.example.starterVertx;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
import io.vertx.core.Vertx;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.web.handler.BodyHandler;
public class MainVerticle extends AbstractVerticle {
public static void main(String[] args) {
Vertx.vertx().deployVerticle(new MainVerticle());
}
@Override
public void start(Promise<Void> startPromise) throws Exception {
Router router = Router.router(vertx);
router.route().handler(BodyHandler.create());
router.route().handler(this::rootHandler);
router.get("/user").handler(this::getUsers);
router.get("/user/:id").handler(this::getById);
vertx.createHttpServer().requestHandler(router).listen(8887, http -> {
if (http.succeeded()) {
startPromise.complete();
System.out.println("HTTP server started on port 8887");
} else {
startPromise.fail(http.cause());
}
});
}
private void rootHandler(RoutingContext context){
context.put("name", "b의개발일기").next();
}
private void getUsers(RoutingContext context) {
context.response()
.setStatusCode(200)
.putHeader("content-type", "text/plain; charset=utf-8")
.end("Got Users! " + "By " + context.get("name"));
}
private void getById(RoutingContext context) {
String id = context.pathParam("id");
context.response()
.setStatusCode(200)
.putHeader("content-type", "text/plain; charset=utf-8")
.end("Got User " + id + " !" + "By " + context.get("name"));
}
}
참고 출처 :
https://ubrain0624.medium.com/java-vert-x-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90-4544ead86bc6
Vert.x DOCS
https://vertx.io/docs/vertx-core/java/
Vert.x Core | Eclipse Vert.x
When Vert.x needs to read a file from the classpath (embedded in a fat jar, in a jar form the classpath or a file that is on the classpath), it copies it to a cache directory. The reason behind this is simple: reading a file from a jar or from an input str
vertx.io
'STUDY > Vert.x' 카테고리의 다른 글
[Vert.x] 이벤트 핸들러 정리 (1) | 2023.09.21 |
---|---|
[Vert.x] setTimer , setPeriodic - 특정 시간 간격으로 작업하기 (0) | 2023.09.20 |
[Vert.x] 이벤트버스(Event Bus)란? (0) | 2023.06.16 |
[Vert.x] 버텍스(Vert.x) 코드 분석 정리 (0) | 2023.06.16 |