# 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


티스토리 툴바