2013ë…„ 7ì›” 9ì¼
by admin
0 comments

성광제약 비딩수주!

2013ë…„ 7ì›” 8ì¼
by admin
0 comments

Hyundai life EDAì˜ ESS를 íƒí•˜ë‹¤!

2013ë…„ 7ì›” 8ì¼
by gdkim
0 comments

모든 ê²ƒì´ ë§ˆìŒì˜ ìž‘ìš©

ìƒê° ìžì²´ê°€ ì—너지를 ê°–ê³  있다.

ëª¸ì— ë‚˜íƒ€ë‚˜ëŠ” 모든 현ìƒì€ 마ìŒì´ ì¼ìœ¼í‚¤ëŠ” 것.

ê¸ì •ì  ì—ë„ˆì§€ì— íœ©ì‹¸ì—¬ 몸과 ë§ˆìŒ ëª¨ë‘ ê±´ê°•í•˜ìž

2013ë…„ 7ì›” 2ì¼
by aduris
0 comments

vert.x는 ë¬´ì—‡ì´ ì¢‹ì€ê°€?

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 제작ìžê°€ ë°ížŒ 성능ì´ê³  ìŠ¤ìŠ¤ë¡œë„ ì—„ê²©í•œ 환경ì—ì„œ 실시한 테스트가 아니므로 ìƒëŒ€ì ì¸ 성능 격차ì—만 주목하는 ê²ƒì´ ì¢‹ì„ ê²ƒìœ¼ë¡œ ë³´ì¸ë‹¤.

ad70637d150cff0744f460a6da1bcb00.png

그림 1 200/OK ì‘답만 ì£¼ì—ˆì„ ë•Œì˜ ì„±ëŠ¥ 비êµ

572fdeba65175722f09387935f981788.png

그림 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ì˜ ëŒ€ëžµì ì¸ 아키í…처는 ë‹¤ìŒ ê·¸ë¦¼ê³¼ 같다.

374e032351d88c70dc05736e3079e6ca.png

그림 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 프로ì íŠ¸ 구조다.

49e1c3d8d3329e1bd3a1043166caf566.png

그림 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 명령어로 실행한다.

1
%> vertx run server.js

브ë¼ìš°ì €ë¥¼ 열고 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ì—ì„œ 구ë™í•  수 있기 때문ì—, 앞으로 ë§Žì€ ë ˆí¼ëŸ°ìŠ¤ê°€ í™•ë³´ë  ê²ƒìœ¼ë¡œ ë³´ì¸ë‹¤.

참고 ìžë£Œ

2013ë…„ 7ì›” 1ì¼
by gdkim
0 comments

ì •ë³´ ìŠ¤íŠ¸ë¦¼ìœ¼ë¡œì„œì˜ ì„¸ì»¨ë“œ 스í¬ë¦°

by gemong on 2013/06/27

Main-Second Screen[요약] 세컨드 스í¬ë¦° 서비스는 현재 양방향성 ê¸°ëŠ¥ì— ì´ˆì ì„ 맞추고 있지만, 프로그램 ì—°ë™ ì •ë³´ì™€ ê´‘ê³  ë“±ì„ ìžë™ 노출하는 ‘정보 ìŠ¤íŠ¸ë¦¼â€™ì˜ ìŠ¤í¬ë¦°ìœ¼ë¡œì„œ ë” ê°€ëŠ¥ì„±ì´ ìžˆë‹¤ê³  ë´„. âœ

 

최근 TVì˜ ë¶€ê°€ 서비스 스í¬ë¦°ìœ¼ë¡œì„œ ì•„ì´íŒ¨ë“œ 등 ëª¨ë°”ì¼ ë‹¨ë§ê¸°ë¥¼ 세컨드 스í¬ë¦°ìœ¼ë¡œ 활용하는 서비스가 ë§Žì´ ë“±ìž¥í•˜ê³  있습니다. 지박스(Zeebox), 샤잠(Shazam), 넥스트가ì´ë“œ(NextGuide), 코넥티비(ConnecTV), 와치위드(Watchwith) 등 여러 서비스가 활발한 ì‚¬ì—…ì„ ì „ê°œí•˜ê³  있고, 심지어 ’세컨드 스í¬ë¦° 소사ì´ì–´í‹°(2nd Screen Society)‘ë¼ëŠ” 단체까지 만들어져 있습니다.

보통 ì´ëŸ° ì„œë¹„ìŠ¤ë“¤ì€ í•œêµ­ì—ì„œ 제대로 사용해 ë³¼ 기회가 ê±°ì˜ ì—†ê¸° ë•Œë¬¸ì— ë‰´ìŠ¤ 기사를 통한 ê°„ì ‘ ê²½í—˜ì— ì˜ì¡´í•˜ì—¬ 대략ì ì¸ ê²½í–¥ì„ ì‚´íŽ´ë³´ë©´ ì´ë ‡ìŠµë‹ˆë‹¤. 오디오 ì¸ì‹ 등으로 현재 방송 프로그램(ë˜ëŠ” ê´‘ê³ ) 위치를 ìžë™ìœ¼ë¡œ 정확하게 파악하여 프로그램과 ì—°ë™ëœ 관련 정보를 서비스하고, ë°˜ì‘, 소셜 등 참여를 ì ê·¹ 유ë„하는 ì–‘ë°©í–¥ 서비스를 강조하고 있습니다. 특히 마케터들ì—ê² TVì— íš¨ê³¼ì ìœ¼ë¡œ ì–‘ë°©í–¥ 광고를 진행할 수 있는 솔루션으로 í° ê¸°ëŒ€ë¥¼ 하고 있습니다.

 

세컨드 스í¬ë¦°ì˜ 가장 í° ë¬¸ì œì ì€ 비디오 ìŠ¤íŠ¸ë¦¼ì˜ ë‹¨ì ˆ

세컨드 스í¬ë¦°ì˜ ìž ìž¬ë ¥ì€ ë©”ì¸ ìŠ¤í¬ë¦°ì˜ 비디오 ì˜ì—­ì„ 방해하지 ì•Šê³  부가ì ì¸ 디스플레ì´ê°€ 가능하ë„ë¡ ìŠ¤í¬ë¦°ì´ 분리ë˜ì—ˆë‹¤ëŠ” ì ê³¼ TVì˜ ê°€ìž¥ í° ì• ë¡œì‚¬í•­ì¸ ì–‘ë°©í–¥ ì¸í„°íŽ˜ì´ìŠ¤ì˜ 문제를 비êµì  쉽게 í•´ê²°í•  수 있다는 ë° ìžˆìŠµë‹ˆë‹¤. 하지만 ê·¸ ë‘ ê°€ì§€ 문제가 ì •ë§ í•´ê²°ëœ ê²ƒì¼ê¹Œìš”. 첫 번째 문제ì—ì„œ ë©”ì¸ ìŠ¤í¬ë¦° 시청 방해는 세컨드 스í¬ë¦°ì—ì„œë„ ë§ˆì°¬ê°€ì§€ë¡œ ì¼ì–´ë‚  수 있습니다. ì´ë²ˆì—” í™”ë©´ì„ ë°©í•´í•˜ëŠ” ê²ƒì´ ì•„ë‹ˆë¼, ì‹œì„ ì„ ë°©í•´í•©ë‹ˆë‹¤. 아래 ê·¸ë¦¼ì„ ë³´ì‹œì£ .

Second Screen

세컨드 스í¬ë¦°ì„ 보기 위해서는 TVì—ì„œ ì‹œì„ ì„ ë–¼ì•¼ 합니다. TVì—ì„œ ì‹œì„ ì„ ê³ ì •í•˜ê¸° 위해 ì—„ì²­ë‚œ ë…¸ë ¥ì„ í•˜ëŠ” í˜„ìž¬ì˜ ë°©ì†¡ í¬ë§·ì€ 세컨드 스í¬ë¦°ê³¼ ê¶í•©ì´ 그리 잘 맞지 않는다고 ìƒê°í•©ë‹ˆë‹¤. 특히 ìƒëŒ€ì ìœ¼ë¡œ ëª°ìž…í˜•ì¸ ë“œë¼ë§ˆ ê°™ì€ ê²½ìš°ë¼ë©´, 세컨드 스í¬ë¦°ìœ¼ë¡œì˜ 시선 단절, 즉 비디오 ìŠ¤íŠ¸ë¦¼ì˜ ë‹¨ì ˆì€ ìš©ë‚©ë˜ì§€ ì•Šì„ ê²ƒìž…ë‹ˆë‹¤. ì´ê²ƒì€ 고스란히 ë‘ ë²ˆì§¸ ë¬¸ì œì— ì˜í–¥ì„ ì¤ë‹ˆë‹¤. 세컨드 스í¬ë¦°ì˜ ì–‘ë°©í–¥ ì¸í„°íŽ˜ì´ìŠ¤ê°€ 아무리 잘 갖춰진들, 주목ë˜ì§€ 않으면 무슨 ì†Œìš©ì´ ìžˆê² ìŠµë‹ˆê¹Œ.

물론 ìž ê¹ ì–¸ê¸‰í–ˆë“¯ì´, í˜„ìž¬ì˜ ë°©ì†¡ í¬ë§·ì´ 세컨드 스í¬ë¦°ì„ 전혀 고려하지 않기 ë•Œë¬¸ì— ê·¸ë ‡ìŠµë‹ˆë‹¤. ì´ê±¸ 바꿔 ë§í•˜ë©´, 미래 방송 í¬ë§·ì´ 세컨드 스í¬ë¦°ì„ 고려하여 ì œìž‘ë  ìˆ˜ 있다면, 시선 ë¶„ë°°ì˜ íƒ€ì´ë°ê³¼ ì–‘ë°©í–¥ì˜ ì»¨í…트 ì œê³µì´ ìœ ê¸°ì ìœ¼ë¡œ ì´ë£¨ì–´ì§ˆ ìˆ˜ë„ ìžˆì„ ê²ƒìž…ë‹ˆë‹¤. 컴ìºìŠ¤íŠ¸ì™€ ì§€ë°•ìŠ¤ì˜ ì˜ˆÂ ê°™ì€ ë°©ì†¡ì‚¬ì™€ 세컨드 스í¬ë¦°ì˜ 제휴가 앞으로 ë”ìš± 심화하여, 프로그램 제작 단계ì—까지 긴밀한 협조를 하게 ëœë‹¤ë©´ 가능한 ì–˜ê¹ë‹ˆë‹¤.

 

ì •ë³´ ìŠ¤íŠ¸ë¦¼ìœ¼ë¡œì„œì˜ ê°€ëŠ¥ì„±

그렇게 프로그램과 완벽히 ì—°ë™ë˜ëŠ” 세컨드 스í¬ë¦°ì„ 가정해 봅시다. 그럼 비디오 ìŠ¤íŠ¸ë¦¼ì˜ ë‹¨ì ˆê³¼ ì–‘ë°©í–¥ì„±ì˜ ê·¹ëŒ€í™”ê°€ ìžì—°ìŠ¤ëŸ½ê²Œ ì¼ì–´ë‚ ê¹Œìš”. ì¼ë¶€ ìž¥ë¥´ì˜ í”„ë¡œê·¸ëž¨ì—서는 ì´ê²Œ 효과ì ìœ¼ë¡œ ìž‘ìš©í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. 예를 들어 시청ìžì˜ 실시간 참여로 ì´ë¤„지는 퀴즈 í”„ë¡œê·¸ëž¨ì„ ìƒìƒí•´ë³´ë©´, 사회ìžê°€ “ìž, 지금 ë‹µì„ ëˆŒëŸ¬ì£¼ì„¸ìš”!â€ë¼ëŠ” êµ¬ë ¹ì— ë§žì¶° 시청ìžë“¤ì´ 세컨드 스í¬ë¦°ì„ ì¼ì œížˆ 터치하는 ê²Œìž„ì— ì°¸ì—¬í•  수 ìžˆì„ ê²ƒìž…ë‹ˆë‹¤. 하지만 ëŒ€ë‹¤ìˆ˜ì˜ ë°©ì†¡ì€ ì—¬ì „ížˆ ì¼ë°©ì ì¸ 비디오 ìŠ¤íŠ¸ë¦¼ì˜ í¬ë§·ì„ 벗어나지 ì•Šì„ ê²ƒìž…ë‹ˆë‹¤. 시청ìžê°€ TVì— ê¸°ëŒ€í•˜ëŠ” 바가 그렇기 때문입니다. ì‚¬ëžŒë“¤ì˜ ì‹œì²­ 행태가 ì–´ëŠ ë‚  ê°‘ìžê¸° 린-ë°±(lean-back)ì—ì„œ 린-í¬ì›Œë“œ(lean-forward)ê°€ ë  ê²ƒì´ë¼ëŠ” 순진무구한 ì „ë§ì— 대한 신빙성 있는 근거는 ì–´ë””ì—ë„ ì—†ìŠµë‹ˆë‹¤.

TVì—ì„œì˜ ì†Œë¹„ëŠ” ì–‘ë°©í–¥ì´ ì•„ë‹ˆë¼ ì»¨í…트 ìŠ¤íŠ¸ë¦¼ì˜ ìˆ˜ë™ì  시청ì´ë¼ëŠ” ë” ìžì—°ìŠ¤ëŸ¬ìš´ ë³¸ëŠ¥ì  ì†Œë¹„ì— ì´ˆì ì„ 맞춰야 합니다. 그런 ì˜ë¯¸ì—ì„œ, 세컨드 스í¬ë¦°ì˜ ì„œë¹„ìŠ¤ë„ â€˜ì •ë³´ 스트림’ì´ë¼ëŠ” 컨셉으로 접근해 보는 ê²ƒì€ ì–´ë–¨ê¹Œ ìƒê°í•´ 봅니다. 세컨드 스í¬ë¦°ì€ TVì˜ ë³´ì¡° 스í¬ë¦° ê°œë…으로, TV ì•ž íƒìž ì •ë„ì— ì„¸ì›Œì ¸ TV 스í¬ë¦°ì— ë°©í•´ë˜ì§€ 않게 ì ì ˆížˆ ì‹œì„ ì„ ë¶„ë°°í•˜ëŠ” ìœ„ì¹˜ì— ìžˆê³ , ê±°ê¸°ì— ì‚¬ìš©ìžê°€ êµ³ì´ (양방향으로) 무슨 ëª…ë ¹ì„ ë‚´ë¦¬ì§€ ì•Šì•„ë„ í”„ë¡œê·¸ëž¨ê³¼ 완벽히 ì—°ë™ëœ 관련 ì •ë³´ê°€ 방송 ìœ„ì¹˜ì— ì‹±í¬ë˜ì–´ ìžë™ìœ¼ë¡œ í르는 것입니다.

Aux Screen

ì´ ì •ë³´ ìŠ¤íŠ¸ë¦¼ì€ í”„ë¡œê·¸ëž¨ê³¼ ê´€ë ¨ëœ ì •ë³´ë¥¼ 간략한 형태로, 예를 들면 키워드나 헤드ë¼ì¸ 수준ì˜-í° í°íŠ¸ë¡œ í‘œí˜„ëœ ì •ë³´ë¥¼ ê°€ë…성 있게 ë³´ì—¬ì¤ë‹ˆë‹¤. 특정 ë°°ìš°ê°€ 나오는 장면ì—ì„  최근 ê·¸ ë°°ìš°ì˜ ë‰´ìŠ¤ 헤드ë¼ì¸ì´, 특정 ìƒí’ˆì´ 나오는 장면ì—ì„  해당 ìƒí’ˆì˜ 브랜드와 가격ì´, ê´‘ê³  시간ì—는 í¬ë¡œìŠ¤ 스í¬ë¦°-TV 스í¬ë¦°ê³¼ 세컨드 스í¬ë¦° ì–‘ìª½ì„ ìœ ê¸°ì ìœ¼ë¡œ 활용한- ê´‘ê³  캠페ì¸ì„ 진행합니다. 물론 열애설 헤드ë¼ì¸ì— ê¹œì§ ë†€ë¼ íƒœë¸”ë¦¿ì„ í„°ì¹˜í•´ ìžì„¸í•œ 뉴스를 ë³¼ ìˆ˜ë„ ìžˆê² ì£ . ì–‘ë°©í–¥ì„±ì´ ë°°ì œëœ ê²ƒì´ ì•„ë‹ˆë¼ ì–µì§€ë¡œ 드러내지 ì•Šì„ ë¿ìž…니다. ë˜í•œ, 새로운 ê´‘ê³  ì¸ë²¤í† ë¦¬ê°€ 창출ë˜ëŠ” íš¨ê³¼ë„ ìžˆìŠµë‹ˆë‹¤. ì •ë³´ ìŠ¤íŠ¸ë¦¼ì˜ ë¹ˆ ìŠ¬ë¡¯ì— ê´‘ê³ ê°€ 채워질 수 있다는 ì–˜ê¹ë‹ˆë‹¤.

조금 ë” ì§„ë„를 나가 봅시다. ‘정보 ìŠ¤íŠ¸ë¦¼â€™ì„ ìœ„í•œ TVì˜ ë³´ì¡° 스í¬ë¦°ìœ¼ë¡œì„œ 세컨드 스í¬ë¦°ì„ 사용하는 대신ì—, TV ìžì²´ì˜ í¼íŒ©í„°ê°€ ë³´ì¡° 스í¬ë¦°ì„ 수용하는 방향으로 발전하면 어떨까 ìƒìƒí•´ 봅니다. ì´ëŸ° ì‹ìœ¼ë¡œìš”.

Dual Screen

TV 스í¬ë¦°ì˜ ì˜†ì— ë³´ì¡° 스í¬ë¦°ì„ 장착하는 ê²ë‹ˆë‹¤. ì‹œì„ ì˜ ë‹¨ì ˆê°ì´ 훨씬 ì ê³ , í™”ë©´ë„ í¬ê¸° ë•Œë¬¸ì— ë” ë§Žì€ ì •ë³´ë¥¼ 표현할 수 있는 장ì ì´ 있습니다. TV 옆으로 확장하는 것ì´ë¼ 잘 안 ë³´ì¼ ìˆ˜ë„ ìžˆìœ¼ë‹ˆ ê°ë„를 êº¾ì„ ìˆ˜ 있게 만들면 ë” ì¢‹ê² ì£ ?

ì—¬ëŸ¬ë¶„ì˜ ìƒê°ì€ 어떠신가요?

출처:http://digxtal.com/idea/20130627/second-screen-info-stream/

Proudly powered by WordPress | Theme: Yoko by Elmastudio

Top