vert.x는 현재 가장 뜨ê²ê²Œ 부ìƒí•˜ê³ 있는 서버 í”„ë ˆìž„ì›Œí¬ìž…니다. ëª¨ë“ ì„œë²„ í”„ë ˆìž„ì›Œí¬ê°€ ê·¸ë ‡ë“¯ì´ ê³ ì„±ëŠ¥ê³¼ 다양한 í”„ë¡œí† ì½œ 지ì›ì„ 장ì 으로 ë‚´ì„¸ìš°ê³ ìžˆìŠµë‹ˆë‹¤. vert.x는 여기서 í•œ ë°œ ë” ë‚˜ì•„ê°€ 서버 ë„¤íŠ¸ì›Œí¬ í™˜ê²½ì„ êµ¬ì¶•í•˜ê³ ìš´ì˜í•˜ëŠ” í™˜ê²½ê¹Œì§€ë„ ê³ ë ¤í•˜ê³ ìžˆìŠµë‹ˆë‹¤. 즉, vert.x는 í•˜ë‚˜ì˜ ‘서버 프로세스 ë°ëª¬’ì„ ì œìž‘í•˜ëŠ” 것ë¿ë§Œ 아니ë¼, í´ëŸ¬ìŠ¤í„°ë§ 환경ì—ì„œ ë™ìž‘하는 여러 서버 프로세스 ë°ëª¬ì„ ì œìž‘í•˜ëŠ” ë°©ë²•ì— ëŒ€í•œ ê³ ë¯¼ê¹Œì§€ ë‹´ê³ ìžˆìŠµë‹ˆë‹¤.
ê·¸ë ‡ê¸° ë•Œë¬¸ì— vert.xê°€ ì–´ë–¤ ë°©ì‹ìœ¼ë¡œ ê³ ì„±ëŠ¥ì„ ë‚´ê³ ìžˆëŠ”ì§€, ì–´ë–¤ ë„¤íŠ¸ì›Œí¬ í™˜ê²½ì„ ê³ ë ¤í•˜ê³ ìžˆëŠ”ì§€ 충분히 ì‹œê°„ì„ ë“¤ì—¬ 알아볼 가치가 ìžˆë‹¤ê³ í• ìˆ˜ 있습니다.
vert.xì˜ ì² í•™
vert.x는 Node.js로부터 ì˜í–¥ì„ ë°›ì€ í”„ë¡œì 트다. vert.x는 Node.js처럼 Event-based í”„ë¡œê·¸ëž˜ë° ëª¨ë¸ì„ ì œê³µí•˜ëŠ” 서버 í”„ë ˆìž„ì›Œí¬ë‹¤. ê·¸ë ‡ê¸° ë•Œë¬¸ì— vert.xì˜ API는 Node.js와 매우 ìœ ì‚¬í•˜ë‹¤. 둘 ëª¨ë‘ ë¹„ë™ê¸° í˜•íƒœì˜ API를 ì œê³µí•œë‹¤.
Node.js는 JavaScriptë¡œ 만들어졌지만, vert.x는 Javaë¡œ ì œìž‘ë˜ì—ˆë‹¤. 하지만 vert.x를 Node.jsì˜ Java ë²„ì „ì´ë¼ê³ ì´í•´í•˜ê¸°ì—는 무리가 있다. vert.xê°€ Node.js로부터 ì˜í–¥ì„ ë°›ì€ ê²ƒì€ ì‚¬ì‹¤ì´ì§€ë§Œ, vert.x는 Node.js와 다른 ê³ ìœ í•œ ì² í•™ì„ ê°€ì§€ê³ ìžˆê¸° 때문ì´ë‹¤.
대표ì ì¸ vert.xì˜ ì„¤ê³„ ì² í•™ì„ ì •ë¦¬í•˜ë©´ 다ìŒê³¼ 같다.
- Polyglot – 여러 언어 지ì›
vert.x ìžì²´ëŠ” Javaë¡œ 작성ë˜ì—ˆì§€ë§Œ, vert.x를 사용하기 위해 반드시 Java를 ì‚¬ìš©í• í•„ìš”ëŠ” 없다. Java나 Groovy ê°™ì´ JVM ë™ìž‘ì„ ì „ì œë¡œ í•œ 언어 ë¿ë§Œ ì•„ë‹ˆë¼ Ruby나 Python, 심지어 JavaScriptë¡œë„ vert.x를 ì´ìš©í• 수 있다. JavaScriptë¡œ ê¼ ì„œë²„ ì• í”Œë¦¬ì¼€ì´ì…˜ì„ 만들어야 한다면, Node.jsë§Œì´ ìœ ì¼í•œ ëŒ€ì•ˆì´ ì•„ë‹ˆê²Œ ë˜ëŠ” 것ì´ë‹¤. 향후 Scala와 Closureë„ ì§€ì›í• 계íšì´ë‹¤.
- Super Simple Concurrency model
vert.xë¡œ 서버 ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ìž‘ì„±í• ë•Œ, 사용ìžëŠ” 싱글 ìŠ¤ë ˆë“œ ì• í”Œë¦¬ì¼€ì´ì…˜ì„ 작성하듯 코드를 ìž‘ì„±í•´ë„ ê´œì°®ë‹¤. vert.x는 사용ìžê°€ 작성한 코드가 ë™ì¼í•œ ìŠ¤ë ˆë“œì—서만 실행ë¨ì„ 보장해서 ë” ì´ìƒ synchronized나 volatile ê°™ì€ ë™ê¸°í™”를 위한 locking 처리를 ì‹ ê²½ 쓰지 ì•Šì•„ë„ ëœë‹¤.
Node.jsì—서는 JavaScript 실행 엔진 ìžì²´ê°€ 멀티 ìŠ¤ë ˆë“œë¥¼ 지ì›í•˜ì§€ 않으므로 ëª¨ë“ CPU 코어를 í™œìš©í•˜ë ¤ë©´ ê°™ì€ JavaScript í”„ë¡œê·¸ëž¨ì„ ì—¬ëŸ¬ ê°œ 실행해야 했다. 하지만 vert.xì—서는 í•˜ë‚˜ì˜ í”„ë¡œì„¸ìŠ¤ë§Œ ê°€ë™í•´ë„ CPU 코어 ê°œìˆ˜ì— ë§žì¶° 멀티 ìŠ¤ë ˆë“œê°€ ìƒì„±ë 수 있다. 멀티 ìŠ¤ë ˆë“œì™€ ê´€ë ¨ëœ ìž‘ì—…ì€ vert.xê°€ í•˜ê³ , 사용ìžëŠ” 비즈니스 ë¡œì§ êµ¬í˜„ì— ì§‘ì¤‘í• ìˆ˜ 있게 í•œ 것ì´ë‹¤.
- Event Bus ì œê³µ
ë„ìž… 부분ì—ì„œ ì„¤ëª…í–ˆë“¯ì´ vert.xì˜ ëª©í‘œëŠ” ‘í•˜ë‚˜ì˜ ì„œë²„ 프로세스 ë°ëª¬’ì„ ë§Œë“œëŠ” ê²ƒì— ê·¸ì¹˜ì§€ 않는다. vert.xë¡œ ë§Œë“ ì—¬ëŸ¬ 서버 í”„ë¡œê·¸ëž¨ì´ ì„œë¡œ ì›í™œí•˜ê²Œ í†µì‹ í•˜ê²Œ 하는 ê²ƒê¹Œì§€ë„ ëª©í‘œì— ë‘ê³ ìžˆë‹¤. ì´ë¥¼ 위해 vert.x는 Event Bus를 ì œê³µí•œë‹¤. Point to Point나 Pub/Sub ê°™ì€ MQ ê¸°ëŠ¥ì„ ì‚¬ìš©í• ìˆ˜ 있다(Event Bus ê¸°ëŠ¥ì„ ì œê³µí•˜ê¸° 위해 vert.x는 Hazelcastë¼ëŠ” IMDG를 사용한다). ì´ëŸ° Event Busê°€ 있기 ë•Œë¬¸ì— ì„œë¡œ 다른 언어로 ìž‘ì„±ëœ ì„œë²„ ì• í”Œë¦¬ì¼€ì´ì…˜ì´ ìš©ì´í•˜ê²Œ í†µì‹ í• ìˆ˜ 있다.
- Module System & Public Module Repository
vert.xì—는 모듈 시스템ì´ë¼ëŠ” ê²ƒì´ ìžˆë‹¤. 모듈 ì‹œìŠ¤í…œì€ ì¼ì¢…ì˜ ì»´í¬ë„ŒíŠ¸ë¡œ ì´í•´í• 수 있다. vert.xë¡œ ë§Œë“ ì„œë²„ ì• í”Œë¦¬ì¼€ì´ì…˜ 프로ì 트 ìžì²´ë¥¼ 모듈화한 것ì´ë‹¤. ì´ëŸ° ë°©ì‹ìœ¼ë¡œ ìž¬ì‚¬ìš©ì„±ì„ ë„모한다. ì´ë ‡ê²Œ 만들어진 ëª¨ë“ˆì€ Public Module Repositoryì— ë“±ë¡í• 수 있다. Public Module Repository를 통해 ëª¨ë“ˆì„ ê³µìœ í• ìˆ˜ 있는 것ì´ë‹¤.
ì°¸ê³ ) Netty와 vert.xì˜ ê´€ê³„
vert.xì˜ ì„±ëŠ¥ì„ ë…¼í•˜ê¸° ì „ì— Netty와 vert.xì˜ ê´€ê³„ë¥¼ ì •ë¦¬í• í•„ìš”ê°€ 있다. vert.x는 Netty를 사용한다. 즉, 다중 I/O ì²˜ë¦¬ì— Netty를 사용한다. ê·¸ë ‡ê¸° ë•Œë¬¸ì— vert.x와 Nettyì˜ ì„±ëŠ¥ ì°¨ì´ë¥¼ 확ì¸í•˜ëŠ” ê²ƒì€ ë¬´ì˜ë¯¸í•˜ë‹¤.
vert.x는 Netty와는 다른 ë…ìžì ì¸ API와 ê¸°ëŠ¥ì„ ì œê³µí•˜ëŠ” 다른 목ì ì˜ ì„œë²„ í”„ë ˆìž„ì›Œí¬ë‹¤. Netty는 ë¡œìš°ë ˆë²¨ ìˆ˜ì¤€ì˜ I/O를 다룰 수 있는 í”„ë ˆìž„ì›Œí¬ê³ , vert.x는 그보다는 하ì´ë ˆë²¨ ì˜ì—ì„ ë‹¤ë£¬ë‹¤.
Node.jsì™€ì˜ ì„±ëŠ¥ 비êµ
vert.xê°€ ì œê³µí•˜ëŠ” ê¸°ëŠ¥ì´ Node.js와는 다르ë”ë¼ë„ 둘 사ì´ì˜ ì„±ëŠ¥ì„ ë¹„êµí•˜ëŠ” ê²ƒì€ ì¶©ë¶„ížˆ ì˜ë¯¸ 있는 ì¼ì´ë‹¤. 그림1ê³¼ 그림2는 vert.x(Java, Ruby, Groovy)와 Node.jsì˜ ì„±ëŠ¥ì„ ë¹„êµí•œ ìžë£Œë‹¤(출처:http://vertxproject.wordpress.com/2012/05/09/vert-x-vs-node-js-simple-http-benchmarks/).
그림 1ì€ HTTP 서버를 ë§Œë“¤ê³ 200/OK ì‘ë‹µë§Œì„ ì£¼ì—ˆì„ ë•Œì˜ ì„±ëŠ¥ì„ ë¹„êµí•œ 결과다. 그림 2는 72 ë°”ì´íŠ¸ í¬ê¸°ì˜ ì •ì HTML 파ì¼ì„ ì‘답 결과로 ì œê³µí•˜ëŠ” ê²½ìš°ì— ì„±ëŠ¥ì„ ë¹„êµí•œ 결과다. vert.x ì œìž‘ìžê°€ ë°ížŒ 성능ì´ê³ ìŠ¤ìŠ¤ë¡œë„ ì—„ê²©í•œ 환경ì—ì„œ 실시한 테스트가 아니므로 ìƒëŒ€ì ì¸ ì„±ëŠ¥ 격차ì—만 주목하는 ê²ƒì´ ì¢‹ì„ ê²ƒìœ¼ë¡œ ë³´ì¸ë‹¤.
그림 1 200/OK ì‘답만 ì£¼ì—ˆì„ ë•Œì˜ ì„±ëŠ¥ 비êµ
그림 2 72ë°”ì´íŠ¸ í¬ê¸°ì˜ ì •ì íŒŒì¼ ì œê³µ 성능 비êµ
ì£¼ëª©í• ë§Œí•œ ì ì€ Node.js보다 vert.x-JavaScriptì˜ ì„±ëŠ¥ì´ ì¢‹ë‹¤ëŠ” 것ì´ë‹¤. ì´ ì„±ëŠ¥ ë¹„êµ ê²°ê³¼ê°€ ì‹ ë¢°ì„±ì´ ë§¤ìš° ë†’ë‹¤ê³ í•˜ë”ë¼ë„, 단순히 Node.jsì— ë¹„í•´ vert.xê°€ ë‚«ë‹¤ê³ ë§í•˜ê¸°ëŠ” ì–´ë ¤ìš¸ 수 있다. Node.js는 Socket.io와 ê°™ì€ í›Œë¥í•œ 모ë¸ì„ ì œê³µí•˜ê³ ìžˆì„ ë¿ë§Œ 아니ë¼, ë§Žì€ ë ˆí¼ëŸ°ìŠ¤ë¥¼ í™•ë³´í•˜ê³ ìžˆê¸° 때문ì´ë‹¤.
vert.x 용어들
vert.x는 vert.xë§Œì˜ ê³ ìœ ìš©ì–´ë¥¼ ì •ì˜í•˜ê±°ë‚˜, ì¼ë°˜ì ì¸ ìš©ì–´ë¥¼ vert.xì—ì„œ 다시 ì •ì˜í•´ì„œ ì‚¬ìš©í•˜ê¸°ë„ í•œë‹¤. vert.x를 잘 ì´í•´í•˜ë ¤ë©´ vert.xê°€ ì •ì˜í•œ 용어를 잘 ì´í•´í•´ì•¼ 한다. vert.xì—ì„œ 사용하는 대표ì ì¸ ìš©ì–´ë¥¼ ì •ë¦¬í•´ 보았다.
Verticle
vert.xì—ì„œ 배치(deploy)ì˜ ê¸°ë³¸ 단위다. Javaì˜ ê²½ìš°ë¼ë©´ main 메서드가 있는 í´ëž˜ìŠ¤ê°€ ëœë‹¤. Verticleì€ ë˜í•œ main 메서드ì—ì„œ 참조ë˜ëŠ” 다른 스í¬ë¦½íŠ¸ë¥¼ í¬í•¨í• 수 있다. .jar 파ì¼ì´ë‚˜ 리소스를 í¬í•¨í• 수 있다. ì• í”Œë¦¬ì¼€ì´ì…˜ì€ í•˜ë‚˜ì˜ Verticleë¡œ ì´ë£¨ì–´ì§ˆ ìˆ˜ë„ ìžˆê³ , event bus를 통해 서로 í†µì‹ í•˜ëŠ” 여러 ê°œì˜ Verticleë¡œ ì´ë£¨ì–´ì§ˆ ìˆ˜ë„ ìžˆë‹¤. Javaë¡œ ìƒê°í•˜ë©´ ë…립ì 으로 실행 가능한 Class ë˜ëŠ” .jar 파ì¼ë¡œ ì´í•´í• 수 ìžˆê² ë‹¤.
vert.x ì¸ìŠ¤í„´ìŠ¤
Verticleì€ vert.x ì¸ìŠ¤í„´ìŠ¤ 안ì—ì„œ 실행ë˜ê³ , vert.x ì¸ìŠ¤í„´ìŠ¤ëŠ” ìžì‹ ì˜ JVM ì¸ìŠ¤í„´ìŠ¤ 안ì—ì„œ 실행ëœë‹¤. ë‹¨ì¼ vert.x ì¸ìŠ¤í„´ìŠ¤ 안ì—서는 ë™ì‹œì— 실행ë˜ëŠ” ë§Žì€ Verticleì´ ì¡´ìž¬í• ìˆ˜ 있다. ê°ê°ì˜ Verticleì€ ê³ ìœ ì˜ í´ëž˜ìŠ¤ ë¡œë”를 가질 수 있다. ì´ë¡œ ì¸í•´ Verticle ê°„ì— ìŠ¤íƒœí‹± 멤버, 글로벌 변수 ë“±ì„ í†µí•œ ì§ì ‘ì ì¸ ìƒí˜¸ìž‘ìš©ì„ ë§‰ì„ ìˆ˜ 있다. 네트워í¬ìƒì˜ 여러 호스트ì—ì„œ ë™ì‹œì— ë§Žì€ vert.x ì¸ìŠ¤í„´ìŠ¤ê°€ 실행ë 수 ìžˆê³ event bus를 형성해서 vert.x ì¸ìŠ¤í„´ìŠ¤ ê°„ì— í´ëŸ¬ìŠ¤í„°ë§ë˜ë„ë¡ ì„¤ì •í• ìˆ˜ 있다.
ë™ì‹œì„±(concurrency)
Verticle ì¸ìŠ¤í„´ìŠ¤ëŠ” í•ìƒ ë™ì¼í•œ ìŠ¤ë ˆë“œì—ì„œ 실행ë¨ì´ 보장ëœë‹¤. ëª¨ë“ ì½”ë“œë¥¼ ë‹¨ì¼ ìŠ¤ë ˆë“œ ë™ìž‘ 형태로 ê°œë°œí• ìˆ˜ 있기 때문ì—, vert.x를 사용하는 개발ìžì—게 개발하기 편한 í™˜ê²½ì„ ì œê³µí•˜ëŠ” 것ì´ë¼ í• ìˆ˜ 있다. 게다가 ë ˆì´ìŠ¤ 컨디션ì´ë‚˜ ë°ë“œë½ì´ ë°œìƒí•˜ì§€ 않게 í• ìˆ˜ë„ ìžˆë‹¤.
Event-based Programming Model
vert.x는 Node.js í”„ë ˆìž„ì›Œí¬ì™€ 비슷하게 Event-based í”„ë¡œê·¸ëž˜ë° ëª¨ë¸ì„ ì œê³µí•œë‹¤. vert.xë¡œ 서버 프로그래ë°ì„ í• ë•Œ 개발해야 하는 ì½”ë“œì˜ ëŒ€ë¶€ë¶„ì€ ì´ë²¤íŠ¸ í•¸ë“¤ëŸ¬ì— ê´€í•œ 것ì´ë‹¤. 예를 들어, TCP 소켓으로부터 ë°ì´í„°ë¥¼ ìˆ˜ì‹ í•˜ê¸° 위해 핸들러를 ì„¤ì •í•˜ëŠ” 것ì´ë‚˜ ë°ì´í„°ê°€ ë„ì°©í• ë•Œ 호출ë 핸들러를 ì œìž‘í•˜ëŠ” 것ì´ë‹¤. ì´ì™¸ì—ë„ ‘Event busì—ì„œ 메시지를 ìˆ˜ì‹ í• ë•Œ’, ‘HTTP 메시지를 ìˆ˜ì‹ í• ë•Œ’, ‘ì»¤ë„¥ì…˜ì´ ì¢…ë£Œë˜ì—ˆì„ ë•Œ’, ‘타ì´ë¨¸ê°€ 종료 ë˜ì—ˆì„ ë•Œ’ ì•Œë¦¼ì„ ë°›ê¸° ì›í•œë‹¤ë©´ 핸들러를 작성하면 ëœë‹¤.
Event Loops
vert.x ì¸ìŠ¤í„´ìŠ¤ëŠ” 내부ì 으로 ìŠ¤ë ˆë“œ í’€ì„ ê´€ë¦¬í•œë‹¤. vert.x는 가급ì ìŠ¤ë ˆë“œ í’€ì˜ ê°œìˆ˜ë¥¼ CPU 코어 수와 ì¼ì¹˜í• 수 있게 한다.
ê·¸ë¦¬ê³ ì´ ê°ê°ì˜ ìŠ¤ë ˆë“œì—서는 Event Loop를 실행한다. Event Loop란 확ì¸í•´ì•¼ í• ì´ë²¤íŠ¸ë¥¼ 루프(loop)를 ëŒë©´ì„œ 확ì¸í•˜ëŠ” 것ì´ë‹¤. ê°€ë ¹ ì†Œì¼“ì— ì½ì„ ë°ì´í„°ê°€ 있거나, ì–´ë–¤ 타ì´ë¨¸ì— ì´ë²¤íŠ¸ê°€ ë°œìƒí–ˆëŠ”지 확ì¸í•˜ëŠ” 것과 ê°™ì€ ê²ƒë“¤ì´ë‹¤. 루프를 ëŒë‹¤ê°€ 처리해야 í• ì´ë²¤íŠ¸ê°€ 있다면, 해당 핸들러를 호출하는 ë°©ì‹ìœ¼ë¡œ vert.xê°€ ë™ìž‘한다(ë¬¼ë¡ ì´ë•Œ 핸들러 처리 ì‹œê°„ì´ ê¸¸ë‹¤ê±°ë‚˜ 블로킹 I/Oê°€ 있다거나 í• ë•ŒëŠ” 별ë„ì˜ ìž‘ì—…ì´ í•„ìš”í•˜ë‹¤. ë‹¤ìŒ ê²Œì‹œê¸€ì—ì„œ ì†Œê°œí• ì˜ˆì •ì´ë‹¤.).
Message Passing
Verticle ê°„ì˜ í†µì‹ ì€ Event Bus를 ì´ìš©í•œë‹¤. Verticleì„ actorë¼ê³ ìƒê°í•˜ë©´, Message Passingì€ Erlang í”„ë¡œê·¸ëž˜ë° ì–¸ì–´ì—ì„œ ìœ ëª…í•´ì§„ actor 모ë¸ê³¼ ìœ ì‚¬í•˜ë‹¤. vert.x 서버ì—서는 ë§Žì€ Verticle ì¸ìŠ¤í„´ìŠ¤ ìƒì„± ë° ì´ë“¤ ê°„ì˜ message passingì„ í†µí•´ Verticle ì½”ë“œì— ëŒ€í•œ 멀티 ìŠ¤ë ˆë“œ ì‹¤í–‰ì´ ì—†ì´ë„ 사용 가능한 ì½”ì–´ì— ë§žê²Œ 시스템 í™•ìž¥ì´ ê°€ëŠ¥í•˜ë‹¤.
Shared data
Message passingì´ ë§¤ìš° ìœ ìš©í•˜ê¸´ 하지만 ëª¨ë“ ì¢…ë¥˜ì˜ ì• í”Œë¦¬ì¼€ì´ì…˜ ë™ì‹œì„± ìƒí™©ì—ì„œ ìµœê³ ì˜ ì ‘ê·¼ ë°©ë²•ì€ ì•„ë‹ˆë‹¤. ìºì‹œê°€ 대표ì ì¸ ì˜ˆë‹¤. ì–´ë–¤ ìºì‹œë¥¼ ì–´ëŠ í•˜ë‚˜ì˜ Verticle만 ê°€ì§€ê³ ìžˆë‹¤ë©´ 매우 비효율ì ì´ ëœë‹¤. ì´ ìºì‹œê°€ 다른 Verticleì—ë„ í•„ìš”í•œ ë‚´ìš©ì´ë¼ë©´ Verticleì´ ê°ê° ê°™ì€ ë‚´ìš©ì˜ ìºì‹œ ë°ì´í„°ë¥¼ 관리하여야 하기 때문ì´ë‹¤.
ê·¸ë ‡ê¸° ë•Œë¬¸ì— vert.x는 ì „ì—ì—ì„œ ì ‘ê·¼í• ìˆ˜ 있는 ë°©ë²•ì„ ì œê³µí•œë‹¤. 바로 Shared Mapì´ë‹¤. ê·¸ë¦¬ê³ Verticle 사ì´ì—서는 ì˜¤ì§ ë¶ˆë³€(immutable) ë°ì´í„°ë§Œ ê³µìœ ë˜ê²Œ í•˜ê³ ìžˆë‹¤.
vert.x Core
ì´ë¦„ 그대로 vert.xì˜ í•µì‹¬ 기능ì´ë‹¤. Verticleì—ì„œ ì§ì ‘ì 으로 호출ë 수 있는 ê¸°ëŠ¥ì€ ëª¨ë‘ ì´ Coreì— ë‹´ê²¨ìžˆë‹¤. 당연하게 ì´ Core는 vert.xê°€ 지ì›í•˜ëŠ” í”„ë¡œê·¸ëž˜ë° ì–¸ì–´ APIì—ì„œ ì ‘ê·¼í• ìˆ˜ 있다.
vert.x 아키í…처
vert.xì˜ ëŒ€ëžµì ì¸ ì•„í‚¤í…처는 ë‹¤ìŒ ê·¸ë¦¼ê³¼ 같다.
그림 3 vert.x 아키í…처(ì›ë³¸ 출처: http://www.javacodegeeks.com/2012/07/osgi-case-study-modular-vertx.html)
vert.xì˜ ê¸°ë³¸ 실행 단위는 Verticleì´ê³ ë™ì‹œì— 여러 Verticleì´ í•˜ë‚˜ì˜ vert.x ì¸ìŠ¤í„´ìŠ¤ì—ì„œ 실행ë 수 있다. Verticleì€ Event-Loop ìŠ¤ë ˆë“œì—ì„œ 실행ëœë‹¤. í•˜ë‚˜ì˜ í˜¸ìŠ¤íŠ¸ëŠ” ë¬¼ë¡ ë„¤íŠ¸ì›Œí¬ìƒì˜ 다른 여러 호스트ì—ì„œ 여러 vert.x ì¸ìŠ¤í„´ìŠ¤ê°€ 실행ë 수 있는ë°, ì´ë•Œ Verticleì´ë‚˜ Module ê°„ì—는 Event Bus를 통해 í†µì‹ í• ìˆ˜ 있다.
요약하면, vert.x ì• í”Œë¦¬ì¼€ì´ì…˜ì€ Verticle ë˜ëŠ” Module ì˜ ì¡°í•©ìœ¼ë¡œ ì´ë£¨ì–´ì§€ë©° ì´ë“¤ ê°„ì˜ í†µì‹ ì€ Event Bus를 사용한다.
vert.x 프로ì 트 구조
ë‹¤ìŒ ê·¸ë¦¼ì€ githubì˜ vert.x 페ì´ì§€ì—ì„œ 소스 코드를 ë³µì œ(clone)í•´ Eclipseì—ì„œ 본 vert.x 프로ì 트 구조다.
그림 4 vert.x 소스 트리
ì „ì²´ì ì¸ êµ¬ì„±ì„ ì‚´íŽ´ë³´ë©´ 다ìŒê³¼ 같다.
- 핵심 libraryì¸ vertx-core
- ë°°í¬ ë° ë¼ì´í”„사ì´í´ì„ 관리하는 vertx-platform
- Core Java API를 다른 언어로 노출하는 vert-lang
프로ì 트 빌드(build) 시스템으로는 Ant와 Mavenì˜ ìž¥ì ì„ ê°–ì·„ë‹¤ëŠ” Gradle를 사용한다.
vert.x 설치 ë° ê°„ë‹¨í•œ ì˜ˆì œ 실행
vert.x를 ì‚¬ìš©í•˜ë ¤ë©´ 반드시 JDK7ì´ í•„ìš”í•˜ë‹¤. vert.x는 JDK7ì— ìžˆëŠ” invokeDynamicì„ ì‚¬ìš©í•˜ê¸° 때문ì´ë‹¤.
vert.x는 매우 간단하게 ì„¤ì¹˜í• ìˆ˜ 있다. https://github.com/purplefox/vert.x/downloadsì—ì„œ ì••ì¶•ëœ ì„¤ì¹˜ 파ì¼ì„ ì›í•˜ëŠ” ìœ„ì¹˜ì— ë‹¤ìš´ë¡œë“œí•´ ì••ì¶•ì„ í‘¼ 다ìŒ, bin ë””ë ‰í„°ë¦¬ë¥¼ PATH 환경 ë³€ìˆ˜ì— ì¶”ê°€í•˜ë©´ 설치를 ì™„ë£Œí• ìˆ˜ 있다. 커맨드 ì°½ì—ì„œ vertx versionì„ ì‹¤í–‰í•´ ë²„ì „ ì •ë³´ê°€ ì œëŒ€ë¡œ 나오면 설치가 성공한 것ì´ë‹¤.
ì´ì œëŠ” “Hello World!”를 ì¶œë ¥í•˜ëŠ” 간단한 웹 서버를 JavaScriptë¡œ ìž‘ì„±í•˜ê³ ì‹¤í–‰í•´ ë³´ìž. 다ìŒê³¼ ê°™ì´ ì½”ë“œë¥¼ 작성한 후 server.jsë¡œ ì €ìž¥í•œë‹¤. Node.js 코드와 ê±°ì˜ í¡ì‚¬í•œ 형ì‹ì´ë‹¤.
1
2
3
4
5
|
load( 'vertx.js' );
vertx.createHttpServer().requestHandler(function(req) {
    req.response.end( "Hello World!" );
}).listen( 8080 , 'localhost' );
|
ìƒì„±í•œ server.js ì• í”Œë¦¬ì¼€ì´ì…˜ì„ 다ìŒê³¼ ê°™ì´ vert.x ëª…ë ¹ì–´ë¡œ 실행한다.
브ë¼ìš°ì €ë¥¼ ì—´ê³ Â http://localhost:8080ì— ì ‘ì†í•´ “Hello World!” 메시지를 ë³¼ 수 있으면 성공ì´ë‹¤.
다른 언어로 작성 ëœ ì˜ˆì œë¥¼ 살펴보ìž. 다ìŒì€ Javaë¡œ 작성한 ì˜ˆì œë‹¤. ì •ì 파ì¼ì„ ì½ì–´ HTTP ì‘답으로 ì œê³µí•˜ëŠ” 웹 서버를 작성해 본 것ì´ë‹¤.
1
2
3
4
5
6
7
8
|
Vertx vertx = Vertx.newVertx();
vertx.createHttpServer().requestHandler( new Handler<httpserverrequest>() {
    public void handle(HttpServerRequest req) {
        String file = req.path.equals( "/" ) ? "index.html" : req.path;
        req.response.sendFile( "webroot/" + file);
    }
}).listen( 8080 );
</httpserverrequest>
|
다ìŒì€ Groovyë¡œ 작성한 코드로 ì•žì˜ Javaë¡œ 작성한 ì˜ˆì œì™€ ê°™ì€ ê¸°ëŠ¥ì„ í•œë‹¤.
1
2
3
4
5
|
def vertx = Vertx.newVertx()
vertx.createHttpServer().requestHandler { req ->
    def file = req.uri == "/" ? "index.html" : req.uri
    req.response.sendFile "webroot/$file"
}.listen( 8080 )
|
NHNê³¼ vert.x
NHNì˜ í”Œëž«í¼ ê°œë°œ 부서ì—는 vert.xê°€ ì •ì‹ìœ¼ë¡œ 릴리스ë˜ê¸° ì „ë¶€í„° 개발 ê³¼ì •ì„ ì§€ì¼œë³´ê³ ìžˆì—ˆë‹¤. vert.xì˜ ê°€ëŠ¥ì„±ì„ ë†’ì´ ìƒ€ê¸° 때문ì´ë‹¤. ê·¸ë¦¬ê³ 2012ë…„ 6월부터 ë©”ì¸ ê°œë°œìžì¸ Tim Fox와 êµë¥˜í•˜ì—¬ vert.x를 ë°œì „ì‹œì¼œ 나갈 수 있ë„ë¡ ë…¼ì˜ë¥¼ ì§„í–‰í•˜ê³ ìžˆë‹¤. 예를 들어, Socket.io는 Node.jsì—서만 ì‚¬ìš©í• ìˆ˜ 있었는ë°, ì´ë¥¼ vert.xì—ì„œë„ Javaë¡œ ì‚¬ìš©í• ìˆ˜ 있게 í¬íŒ… ìž‘ì—…ì„ ì§„í–‰í–ˆê³ í˜„ìž¬ ê°œë°œì´ ì™„ë£Œëœ ìƒíƒœë‹¤. 다ìŒì€ githubì˜ vert.x ë ˆíŒŒì§€í† ë¦¬ì— ìžˆëŠ” pull request ìš”ì² ë§í¬ë‹¤.
ì‚°ì¶œë¬¼ì¸ socket.io vert.x ëª¨ë“ˆì€ í˜„ìž¬ 개발 ì¤‘ì¸ RTCS 2.0 ë²„ì „(vert.x + Socket.io)ì— ì‚¬ìš©ë ì˜ˆì •ì´ë‹¤.
Node.jsê°€ 지금처럼 í™œì„±í™”ëœ ê²ƒì€ Socket.io ë•ë¶„ì´ì—ˆëŠ”ë°, vert.xì—ì„œ Socket.io를 ì‚¬ìš©í• ìˆ˜ 있다면 vert.x ë˜í•œ ë§Žì€ ì‚¬ìš© 사례가 ìƒê¸¸ 것으로 예ìƒí•œë‹¤. ë˜í•œ ì´ socket.io vertx ëª¨ë“ˆì„ ìž„ë² ë””ë“œ ë¼ì´ë¸ŒëŸ¬ë¦¬ 형태로 사용하면 Java ê¸°ë°˜ì˜ ì• í”Œë¦¬ì¼€ì´ì…˜ì—ì„œë„ socket.io를 ì‚¬ìš©í• ìˆ˜ 있게 ëœë‹¤ëŠ” ì ì—ì„œ ì˜ë¯¸ê°€ 있다 í•˜ê² ë‹¤.
ì°¸ê³ ) RTCS 란?
RTCS(Real Time Communication System)는 NHNì˜ Real Time Web 개발 플랫í¼ìœ¼ë¡œ, 브ë¼ìš°ì €ì™€ 서버 ê°„ì— ì‹¤ì‹œê°„ìœ¼ë¡œ 메시지를 ì „ë‹¬í• ìˆ˜ 있게 ë„와주는 플랫í¼ì´ë‹¤. RTCS는 현재 야구9단, 미투ë°ì´ 채팅, ë°´ë“œ(BAND) ì±„íŒ…ì— ì ìš©ë˜ì–´ 있다.
마치며
vert.x는 2012ë…„ 5ì›”ì— ì²« ë²„ì „ì´ ë‚˜ì™”ë‹¤. 2009ë…„ì— ì²« ë²„ì „ì´ ë‚˜ì˜¨ Node.jsì— ë¹„í•˜ë©´ ì—사가 매우 ì§§ë‹¤ê³ í• ìˆ˜ 있다. ê·¸ë ‡ê¸° ë•Œë¬¸ì— ì•„ì§ ë ˆí¼ëŸ°ìŠ¤ê°€ 많지 않다. 하지만 vert.x는 VMwareì˜ ë“ ë“ í•œ 후ì›ì„ ë°›ê³ ìžˆê³ Cloud Foundryì—ì„œ 구ë™í• 수 있기 때문ì—, 앞으로 ë§Žì€ ë ˆí¼ëŸ°ìŠ¤ê°€ 확보ë 것으로 ë³´ì¸ë‹¤.
ì°¸ê³ ìžë£Œ
최근 답글