# Learning Vert.x Vert.x 를 배워봅시다. (version 3.0.0 이 나오면서 뭔가 많이 바뀐듯?) 가장 비슷한 server-side 언어가 node.js 일듯? Vert.x 자체가 node.js 로부터 영향을 받은 프로젝트이기 때문에 node.js 의 많은 장점들을 가져와서 구현했을듯. JVM (Java Vertual Machine) 에서 돌아가기 때문에 "Java, JavaScript, Python, Groovy, Scala" 등 node.js 보다 다양한 언어가 지원된다고. 이런걸 polyglot (여러 언어를 말하는) 특성이라고 하는듯. 그래도 기본적으로 Java 로 돌아가는 놈이라 다른언어로 작성했을때도 vertx 의 모든 기능 및 장점을 사용할 수 있을지는 잘 모르겠음. 그런데 에서의 vert.x 성적이 좋지 않은데... 대충 생각해볼때 이게 가장 강력할것도 같은데 이상함. 초기단계라 아직 제대로 안돌아가나? 아무튼 한동안 Java 랑 이놈을 좀 공부해봐야 할듯. ## PH
  • 2015-12-13 : Embeded vert.x 관련 ref 링크 추가.
  • 2014-05-23 : First posting.
## TOC ## Hello World! 기본적으로 window 에서는 batch file (vertx.bat) 로 실행됨. 확장자가 없는 vertx file 은 linux 에서 쓰는듯하고. Window 에서 기본적으로 %PATH%"...\java\bin" 위치와 "...\vertx\bin" 위치를 넣어주고, %JAVA_HOME%=...\java%VERTX_HOME% 도 설정해주면 좋고, %CLASSPATH%는 " (quotation mark) 없이 classpath 폴더 목록들 넣어주고. (set CLASSPATH=%CLASSPATH%;%VERTX_HOME%\conf;%VERTX_HOME%\lib\* 와 같은 명령어가 batch file에 들어있어서 따로 vertx class들의 path는 안넣어놔도 되는듯.) 설치가 잘 되었는지 확인하기 위해 cmd 창에 vertx -version 입력하면 3.0.0와 같이 버전이 표시되어야 함. 가장 기본적인 "Hello World" 테스트는 아래와 같은 "HelloWorldServer.java" 파일을 만든 뒤, ```[.linenums.lang-java] import org.vertx.java.core.Handler; import org.vertx.java.core.http.HttpServerRequest; import org.vertx.java.platform.Verticle; public class HelloWorldServer extends Verticle { @Override public void start() { // Using lambda expression of JAVA, // ``` // vertx.createHttpServer().requestHandler(new Handler<HttpServerRequest>() { // public void handle(HttpServerRequest req) { req: doing something } // } // ``` // can become simple like this. vertx.createHttpServer().requestHandler( (req) -> { req.response().headers().set("Content-Type","text/html"); req.response().end("<h1>Hello World</h1>"); }).listen(1001); } } ```/ cmd 창에서 vertx run HelloWorldServer.java 실행 후. Browser 로 localhost:1001에 접속하면 "Hello World"가 뜸. 실행되면 Succeeded in deploying verticle 에 멈춰있는데, 하나 실행하면 다른건 못하는건가? =ㅇ=;;; 취소는 Ctrl+C (Cancel 인듯?) 누르면, Terminate batch job (Y/N)? 가 뜨면서 취소할 수 있는듯. (단 'N'을 쳐도 취소된다는거. Ctrl+Break 로는 멈추진 않고 뭔가 장황하게 뜨기만 함.) 실제 batch 파일에서 마지막 실행은 ```[.linenums] "%JAVA_EXE%" %JVM_OPTS% %JMX_OPTS% %JAVA_OPTS% %VERTX_OPTS% %VERTX_MODULE_OPTS% -Djava.util.logging.config.file="%VERTX_JUL_CONFIG%" -Dvertx.home="%VERTX_HOME%" -Dvertx.clusterManagerFactory="%VERTX_CLUSTERMANAGERFACTORY%" -classpath "%CLASSPATH%" org.vertx.java.platform.impl.cli.Starter %CMD_LINE_ARGS% // empty variables. java.exe -Djava.util.logging.config.file="...\vert.x-2.1\conf\logging.properties" -Dvertx.home="...\vert.x-2.1" -Dvertx.clusterManagerFactory="org.vertx.java.spi.cluster.impl.hazelcast.HazelcastClusterManagerFactory" -classpath ".;...\jdk1.8.0_05\lib\;...\classes;...vert.x-2.1conf;...vert.x-2.1lib*" org.vertx.java.platform.impl.cli.Starter run HelloWorldServer.java // 실제로 실행시키는 것은 "org.vertx.java.platform.impl.cli.Starter" class의 main 함수인듯. Args로 "run HelloWorldServer.java"를 전달하는 것이고. javac.exe가 아니기 때문에 compile하는게 아니고 Starter class 내부에서 "HelloWorldServer.java"를 컴파일을 해주고 실행까지 해주는 것인듯. ```/ 와 같이 일어나는듯. Vert.x bin 폴더에 있는 batch 파일 열어보면 나옴. ### Encoding UTF-8 한글 출력 관련해서는 vertx.bat 파일에서 ```set JVM_OPTS=-Dfile.encoding=UTF8```/ 와 같이 써줘야 하는듯도... (정확한 reference를 찾아야 할텐데;;;;;; 어거지로 해결한듯한.) 보통 JAVA에서 인코딩은 컴파일 단계에서 ```javac -encoding utf8 -sourcepath "%sp%" %~nx1 -d "%cp%" -classpath "%CLASSPATH%"```/ 와 같이 설정해주는 것으로 알고 있었는데, 위에건 아예 실행시 설정을 바꾸는 것인듯? ```java -Dfile.encoding=UTF8 -classpath "%CLASSPATH%" file.class args```/ 처럼 batch 파일에서 실행시켜 줌. ### TCP echo server 또다른 간단한 테스트 예제로 TCP telnet echo server 가 있음. 파일 "TCPechoServer.java"를 만들어 다음과 같이 저장한 뒤, ```[.linenums.lang-java] import org.vertx.java.core.Handler; import org.vertx.java.core.net.NetSocket; import org.vertx.java.core.streams.Pump; import org.vertx.java.platform.Verticle; // Every Java verticle must extend the class org.vertx.java.deploy.Verticle. You must override the start method - this is called by Vert.x when the verticle is started. public class TCPechoServer extends Verticle{ public void start(){ // vertx.createNetServer().connectHandler(new Handler<NetSocket>(){ // public void handle(final NetSocket socket){ // Pump.createPump(socket, socket).start(); // } // }).listen(1234); vertx.createNetServer().connectHandler( (socket) -> { Pump.createPump(socket, socket).start(); }).listen(1234); } } ```/ cmd 창에 telnet localhost 1234 를 입력하면, TThhiiss iiss eecchhoo sseerrvveerr.. 와 같이 타자치는걸 그대로 베껴서 쏴주는 서버가 만들어짐. (그런데 어떻게 나가지?) ### Verticle \subset Module Verticle은 particle 비슷한 개념의 "execution unit of Vert.x" 이고, module 이란 것으로 이런 verticle 들을 감쌀 수 있음. (Grouping/Wrapping) Raw verticle 은 vertx run foo.js -conf myconf.json 와 같이 실행하고 (요건 JAVA 로 작성한 코드가 아니라 javascript 로 작성한 서버코드), module 은 vertx runmod com.mycompany~my-mod~1.0 -conf myconf.json 와 같이 실행. -conf 로 configuration 을 JSON 파일로 줄 수 있음. 이렇게 설정한 configuration 은 verticle 내에서도 다음과 같은 형태로 접근 가능. ```[.linenums.lang-java] import org.vertx.java.core.json.JsonObject; JsonObject config = container.config(); System.out.println("Config is " + config); ```/ ### Log 여러 간단한 기록을 남기고 싶을 때 쓰는. 아니면 잘 돌아가는지 테스트 할때도 쓰이고. ## Classes
org.vertx.java.platform.Verticle: A verticle is the unit of execution in the Vert.x platform.
## HTTP Server HTTP Server 에서 데이터를 받을때 방법이 꽤나 여러가지인듯? 데이터 크기가 클 경우 중간중간 데이터들을 잘라서 처리할 수 있도록 해주려고 그런거 같은데... 대충 아래와 같은 세가지 function 이 제공됨. Ref. - Writing HTTP Servers and Clients - Writing HTTP servers - Handling HTTP Requests - Reading Data from the Request Body : req.dataHandler, req.endHandler, req.bodyHandler 요렇게 세개? 데이터를 보내는 쪽에서 chunked option 을 켜놔야 (req.response().setChunked(true); 와 같은 명령어로) 받는 쪽에서도 chunked data 를 처리할 수 있음. 그러니 chunked option 같은게 안켜져 있다면 그냥 req.bodyHandler 써야함. 전체 데이터를 받은 다음 처리하는 놈. 아래는 그냥 JAVA lambda expression 이용한 예제. ```[.scrollable.lang-java] ///////////////////////////////////////////// // Reading Data from the Request Body (Request Header is firstly handled, and Body is handled later.) ///////////////////////////////////////////// final Buffer body = new Buffer(0); req.dataHandler( (Buffer data) -> { System.out.println("\nI received "+data.length()+" bytes."); // System.out.println("data: "+data); body.appendBuffer(data); }); // receive each HTTP chunk of the request body. req.endHandler( (event) -> { System.out.println("\nHttpServerRequest including the total body is ended with body.length(): "+body.length()+" ."); // System.out.println("event: "+event); // null System.out.println("data orginal: "+body); try { System.out.println(URLDecoder.decode( ("data: 한글\n"+body).replaceAll("&","\n").replaceAll("=","\t=\t") , encoding)); } catch (Exception e) { System.out.println(e); } req.response().headers().set("Content-Type","text/html; charset=utf-8"); req.response().end( ("<script>document.write( decodeURIComponent('" +"data: 한글<br>"+body +"') );</script>") .replaceAll("&","<br>").replaceAll("=","\t=\t") , encoding); }); // req.bodyHandler( (Buffer data) -> { // System.out.println("I received the total body of "+data.length()+" bytes."); // }); // bodyHandler override dataHandler and endHandler??? ```/ ## RRA

    Official

  1. groups.google.com - vertx
  2. Vert.x.io and http://vertx.io - docs
  3. github.com - vert-x3
    Old version :: github.com - vert-x; and the main project github.com - eclipse - vert.x
  4. vertx-kor.otofu.me; Official homepage는 아닌가? 최신 정보를 위해서는 영어 페이지로 봅시다.
  5. Introducing

  6. Naver 개발자 블로그 Hello world - vert.x는 무엇이 좋은가?, 2012-10-05, by 우성민
  7. Naver 개발자 블로그 Hello world - vert.x 임베디드, 2013-05-13, by 김재홍
    // Embeded 형태로도 vert.x 를 쓸 수 있구나. Spring MVC 같은데에 vert.x 를 embed 해서 사용할 수 있다는듯. 그런데 이러면 vert.x 의 performance 를 해치는거 같기도 한데... 잘 모르겄넹;;
  8. Daum DevOn 2012 - B3 자바기반 Vert.x로 Socket.io 서버 만들기, 2012-10-12, by 백기선 (NHN Business Platform); 영상 (42 min) 도 있음.
    // Socket.io 괜찮아 보이는데 "facebook post by Keesun Baik, 2013-12-17" 에서는 "한동안 Socket.io + Vert.x로 재미를 봤었는데.. 이제 그거 그만 쓰는게 좋을것 같다. 이제는 스프링 4가 하듯이 Websocket은 전송수단으로 쓰고 STOMP라는 훌륭한 메시징 프로토콜(+구현체)을 그 위에 얹어서 쓰는게 좋겠다."라고 하시기도...
  9. bcho.tistory.com - 비동기 네트워크 서버 프레임웍 Vert.x 소개, 2014-02-04, by 조대협
  10. Competition with other server-side languages

  11. Tech Empower.com - Web Framework Benchmarks - Round 9 (2014-05-01) - Multiple queries
    // Vert.x의 성적이 그닥 성적이 좋지는 않은듯도. "Ctrl+F"로 "vert"를 검색해 보시길. 최고 대비 18.8%. (Round 8에서의 결과, 9에서는 removed.) 약간 이상하긴 함. 암튼, 이건 기본바탕이 Java니까 당연히 인터프리터가 아니라 컴파일 이후 실행되는 거겠지?
  12. vertxproject.wordpress.com - Vert.x vs node.js simple HTTP benchmarks, 2012-05-09, by swilliamsvmw;
    // Node.js와 비교해봤을때 훨씬 더 뛰어나다는 이야기. 그중 Vert.x Java를 쓰는것이 가장 성능이 좋은듯. 당연한 결과 같기도... 배우려면 vert.x Java를 배웁시다? 엄밀히는 Java에서 vert.x library를 쓰는 개념이겠지만.
  13. kipid's blog - Learning Node.js, 2014-05-23;
    // Event-driven server의 특징을 보시려면, 여기로 가보시면 될듯. Node.js를 쓰지는 않더라도 개념을 이해해놓으면 여러모로 도움이 되는듯.
저작자 표시 비영리 변경 금지
신고
Posted by 냥냥 kipid
comments powered by Disqus