2016년 5월 25일 수요일

Vert.x 3.0.0 시작해보기...(2)

제가 요즘 요긴하게 써먹고 있는 Vert.x 을 소개하고자 합니다. 폴리글랏이긴 한데, 저는 Java 만을 사용해서 개발하고 있습니다. 그래서 Java 코드만 올리겠습니다.

장문의 글을 올리기 보다는, 바로 어떤 결과가 나오는 짧은 팁만 올리고, 댓글로 보충 내용을 올리는 쪽으로 해보겠습니다. 방송 형태가 적합하겠지만, 할 줄을 몰라서...(컴맹입니다)

------------------------------------------------------------------------------------------------------

이전 글에서 vertx.createHttpServer() 을 이용해서 웹서버를 바로 띄울 수 있다고 알려드렸습니다. 그냥 서버만 뜹니다. 아무런 동작도 하지 않구요. 이번에는 사용자가 요청한 URL 에 따라 동작하도록 한 번 만들어보겠습니다.

먼저 vertx.createHttpServer() 에 옵션을 추가하는 방법입니다.

HttpServerOptions httpServerOptions = new HttpServerOptions();
// httpServerOptions.setAcceptBacklog(10000);
// httpServerOptions.setSendBufferSize(4 * 1024);
// httpServerOptions.setReceiveBufferSize(4 * 1024);
httpServerOptions.setCompressionSupported(true);

vertx.createHttpServer(httpServerOptions)
   .listen(8080);

HttpServerOptions 라는 개체를 통해 옵션을 지정해줄 수 있습니다. 저는 보통 compressionSupported 옵션만을 이용합니다. json 을 결과를 넘겨줄 때 많은 양의 정보를 보내줄 경우 유용합니다. 게임의 기본 데이터를 시작할 때 보내는 경우 몇 메가의 텍스트 데이터를 보내야 하는데, 압축을 하게 되면 1/10 정도까지 용량을 줄여줍니다.

이번에는 사용자의 요청 URI 에 따라서 분기를 하는 방법입니다.

Router router = Router.router(vertx);
Route route = router.route("/:METHOD");

route.handler(routingContext -> {

 HttpServerRequest request = routingContext.request();
 MultiMap params = request.params();

 String method = params.get("METHOD");
 System.out.println(method);

 request.endHandler(empty -> {

  JsonObject param = new JsonObject();
  params.forEach(entry -> param.put(entry.getKey(), entry.getValue()));

 });

});

HttpServerOptions httpServerOptions = new HttpServerOptions();
httpServerOptions.setCompressionSupported(true);

vertx.createHttpServer(httpServerOptions)
  .requestHandler(router::accept)
  .listen(8080);

사용자의 요청 주소를 Router 을 이용해서 일일이 처리하지 않고 URI 의 값에 따라서 분기해서 처리할 수 있도록 만들 수 있습니다. 위에서 /:METHOD 라고 지정되어 있는데 / 뒤에 어떤 주소를 가지느냐에 따라 매개변수 정보에 METHOD 라는 변수에 이 값을 넣어주는 것입니다. Spring MVC 에서도 REST API 에서 비슷한 기능을 보셨을 겁니다.

그래서 위의 문장을 추가한 뒤 vertx run 으로 실행해주면, 이번에는 http://localhost:8080/Login  이나 http://localhost:8080/Index  와 같은 주소 요청에 따라 화면에 Login 이나 Index 가 출력될 것입니다. 물론 아직 return 에 대해서 처리를 하지 않았기 때문에 서버를 실행한 쪽에서 콘솔 출력으로 이 값이 출력되고, 브라우져는 응답을 멍하니 기다리기만 하는 상태이지만요. http://localhost:8080/Login?val1=test1&val2=test2  와 같은 요청도 한 번 해보세요.

눈여겨 보실 점은 모든 매개변수는 MultiMap 형태로 사용자에게 제공된다는 것입니다. 그걸 아래에서 JsonObject 형태로 옮겨 담고 있습니다.(params.forEach() 보이시나요?)

다음에 배울 EventBus 는 vert.x 와 함께 제공되는 JsonObject 나 JsonArray 혹은 자바의 기본 자료형(int, long 등)과 String 등만 전송할 수 있습니다. 그래서 주로 사용하게 될 개체가 바로 JsonObject 가 되겠습니다.

마지막으로, 코드를 좀 더 확장해서 브라우저에 응답을 보내는 것을 해보겠습니다.

Router router = Router.router(vertx);
Route route = router.route("/:METHOD");

route.handler(routingContext -> {

 HttpServerRequest request = routingContext.request();
 MultiMap params = request.params();

 String method = params.get("METHOD");
 System.out.println(method);

 request.endHandler(empty -> {

  JsonObject param = new JsonObject();
  params.forEach(entry -> param.put(entry.getKey(), entry.getValue()));

  request.response().putHeader("content-type", "application/json");
  request.response().end("{\"METHOD\": \"" + method + "\"}");

 });

});

HttpServerOptions httpServerOptions = new HttpServerOptions();
httpServerOptions.setCompressionSupported(true);

vertx.createHttpServer(httpServerOptions)
  .requestHandler(router::accept)
  .listen(8080);

요청 결과를 보내기 위해 HttpServerResponse 개체를 request 에서 얻어올 수 있습니다. 그리고 헤더 정보와 결과 문장을 보내고 연결을 종료합니다. request.response().end() 로 말이죠. 그럼 이 응답에 대한 처리는 끝납니다. 이렇게 연결을 종료하기 전에는 새로운 연결을 받지 못합니다. WAS 처럼 쓰레드를 여러개 생성한 뒤 병렬로 처리하는게 아니라 한 번에 하나씩만 처리하기 때문이죠. 이 부분을 잊지 마세요.

오늘은 여기까지...





이 글은 제 개인 블로그(http://zepinos.blogspot.kr)와 okky(http://okky.kr)에만 공개되는 글입니다. 퍼 가는 것은 금해주시고, 링크로 대신해주시기 바랍니다. 당연히 상업적 용도로 이용하시면...저랑 경찰서에서 정모하셔야 합니다. ^^;;;

위에 작성한 코드 등은 실제 컴파일한 것이 아니라 제가 글을 적으면서 키보드 코딩(?...손 코딩의 친구) 한 것이므로, 오류가 있다면 저에게 알려주시면 고맙겠습니다.

댓글 없음:

댓글 쓰기