Monthly Archives: 7ì›” 2013
2013ë…„ 7ì›” 9ì¼
by admin
0 comments
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는 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 ëª…ë ¹ì–´ë¡œ 실행한다.
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ì—ì„œ 구ë™í• 수 있기 때문ì—, 앞으로 ë§Žì€ ë ˆí¼ëŸ°ìŠ¤ê°€ 확보ë 것으로 ë³´ì¸ë‹¤.
ì°¸ê³ ìžë£Œ
- “Main Manual” http://vertx.io/manual.html
- “Installation Guide” http://vertx.io/install.html
- “The C10K problem” http://www.kegel.com/c10k.html
- 김성박, 송지훈 “ìžë°” I/O & NIO ë„¤íŠ¸ì›Œí¬ í”„ë¡œê·¸ëž˜ë°”, 한빛미디어 2004
2013ë…„ 7ì›” 1ì¼
by gdkim
0 comments
by gemong on 2013/06/27
최근 TVì˜ ë¶€ê°€ 서비스 스í¬ë¦°ìœ¼ë¡œì„œ ì•„ì´íŒ¨ë“œ 등 ëª¨ë°”ì¼ ë‹¨ë§ê¸°ë¥¼ 세컨드 스í¬ë¦°ìœ¼ë¡œ 활용하는 서비스가 ë§Žì´ ë“±ìž¥í•˜ê³ ìžˆìŠµë‹ˆë‹¤. 지박스(Zeebox), ìƒ¤ìž (Shazam), 넥스트가ì´ë“œ(NextGuide), 코넥티비(ConnecTV), 와치위드(Watchwith) 등 여러 서비스가 활발한 ì‚¬ì—…ì„ ì „ê°œí•˜ê³ ìžˆê³ , 심지어 ’세컨드 스í¬ë¦° 소사ì´ì–´í‹°(2nd Screen Society)‘ë¼ëŠ” 단체까지 ë§Œë“¤ì–´ì ¸Â ìžˆìŠµë‹ˆë‹¤.
보통 ì´ëŸ° ì„œë¹„ìŠ¤ë“¤ì€ í•œêµì—ì„œ ì œëŒ€ë¡œ 사용해 ë³¼ 기회가 ê±°ì˜ ì—†ê¸° ë•Œë¬¸ì— ë‰´ìŠ¤ 기사를 통한 ê°„ì ‘ ê²½í—˜ì— ì˜ì¡´í•˜ì—¬ 대략ì ì¸ ê²½í–¥ì„ ì‚´íŽ´ë³´ë©´ ì´ë ‡ìŠµë‹ˆë‹¤. 오디오 ì¸ì‹ 등으로 현재 방송 프로그램(ë˜ëŠ” ê´‘ê³ ) 위치를 ìžë™ìœ¼ë¡œ ì •í™•í•˜ê²Œ 파악하여 프로그램과 ì—°ë™ëœ ê´€ë ¨ ì •ë³´ë¥¼ ì„œë¹„ìŠ¤í•˜ê³ , ë°˜ì‘, 소셜 등 참여를 ì ê·¹ ìœ ë„하는 ì–‘ë°©í–¥ 서비스를 ê°•ì¡°í•˜ê³ ìžˆìŠµë‹ˆë‹¤. 특히 마케터들ì—ê² TVì— íš¨ê³¼ì 으로 ì–‘ë°©í–¥ ê´‘ê³ ë¥¼ ì§„í–‰í• ìˆ˜ 있는 솔루션으로 í° ê¸°ëŒ€ë¥¼ í•˜ê³ ìžˆìŠµë‹ˆë‹¤.
세컨드 스í¬ë¦°ì˜ 가장 í° ë¬¸ì œì ì€ ë¹„ë””ì˜¤ ìŠ¤íŠ¸ë¦¼ì˜ ë‹¨ì ˆ
세컨드 스í¬ë¦°ì˜ ìž ìž¬ë ¥ì€ ë©”ì¸ ìŠ¤í¬ë¦°ì˜ 비디오 ì˜ì—ì„ ë°©í•´í•˜ì§€ ì•Šê³ ë¶€ê°€ì ì¸ ë””ìŠ¤í”Œë ˆì´ê°€ 가능하ë„ë¡ ìŠ¤í¬ë¦°ì´ 분리ë˜ì—ˆë‹¤ëŠ” ì ê³¼ TVì˜ ê°€ìž¥ í° ì• ë¡œì‚¬í•ì¸ ì–‘ë°©í–¥ ì¸í„°íŽ˜ì´ìŠ¤ì˜ ë¬¸ì œë¥¼ 비êµì 쉽게 í•´ê²°í• ìˆ˜ 있다는 ë° ìžˆìŠµë‹ˆë‹¤. 하지만 ê·¸ ë‘ ê°€ì§€ ë¬¸ì œê°€ ì •ë§ í•´ê²°ëœ ê²ƒì¼ê¹Œìš”. 첫 번째 ë¬¸ì œì—ì„œ ë©”ì¸ ìŠ¤í¬ë¦° ì‹œì² ë°©í•´ëŠ” 세컨드 스í¬ë¦°ì—ì„œë„ ë§ˆì°¬ê°€ì§€ë¡œ ì¼ì–´ë‚ 수 있습니다. ì´ë²ˆì—” í™”ë©´ì„ ë°©í•´í•˜ëŠ” ê²ƒì´ ì•„ë‹ˆë¼, ì‹œì„ ì„ ë°©í•´í•©ë‹ˆë‹¤. 아래 ê·¸ë¦¼ì„ ë³´ì‹œì£ .
세컨드 스í¬ë¦°ì„ 보기 위해서는 TVì—ì„œ ì‹œì„ ì„ ë–¼ì•¼ 합니다. TVì—ì„œ ì‹œì„ ì„ ê³ ì •í•˜ê¸° 위해 ì—„ì²ë‚œ ë…¸ë ¥ì„ í•˜ëŠ” í˜„ìž¬ì˜ ë°©ì†¡ í¬ë§·ì€ 세컨드 스í¬ë¦°ê³¼ ê¶í•©ì´ 그리 잘 맞지 ì•ŠëŠ”ë‹¤ê³ ìƒê°í•©ë‹ˆë‹¤. 특히 ìƒëŒ€ì 으로 ëª°ìž…í˜•ì¸ ë“œë¼ë§ˆ ê°™ì€ ê²½ìš°ë¼ë©´, 세컨드 스í¬ë¦°ìœ¼ë¡œì˜ ì‹œì„ ë‹¨ì ˆ, 즉 비디오 ìŠ¤íŠ¸ë¦¼ì˜ ë‹¨ì ˆì€ ìš©ë‚©ë˜ì§€ ì•Šì„ ê²ƒìž…ë‹ˆë‹¤. ì´ê²ƒì€ ê³ ìŠ¤ëž€ížˆ ë‘ ë²ˆì§¸ ë¬¸ì œì— ì˜í–¥ì„ ì¤ë‹ˆë‹¤. 세컨드 스í¬ë¦°ì˜ ì–‘ë°©í–¥ ì¸í„°íŽ˜ì´ìŠ¤ê°€ 아무리 잘 갖춰진들, 주목ë˜ì§€ 않으면 무슨 ì†Œìš©ì´ ìžˆê² ìŠµë‹ˆê¹Œ.
ë¬¼ë¡ ìž ê¹ ì–¸ê¸‰í–ˆë“¯ì´, í˜„ìž¬ì˜ ë°©ì†¡ í¬ë§·ì´ 세컨드 스í¬ë¦°ì„ ì „í˜€ ê³ ë ¤í•˜ì§€ 않기 ë•Œë¬¸ì— ê·¸ë ‡ìŠµë‹ˆë‹¤. ì´ê±¸ 바꿔 ë§í•˜ë©´, 미래 방송 í¬ë§·ì´ 세컨드 스í¬ë¦°ì„ ê³ ë ¤í•˜ì—¬ ì œìž‘ë 수 있다면, ì‹œì„ ë¶„ë°°ì˜ íƒ€ì´ë°ê³¼ ì–‘ë°©í–¥ì˜ ì»¨í…트 ì œê³µì´ ìœ ê¸°ì 으로 ì´ë£¨ì–´ì§ˆ ìˆ˜ë„ ìžˆì„ ê²ƒìž…ë‹ˆë‹¤. 컴ìºìŠ¤íŠ¸ì™€ ì§€ë°•ìŠ¤ì˜ ì˜ˆÂ ê°™ì€ ë°©ì†¡ì‚¬ì™€ 세컨드 스í¬ë¦°ì˜ ì œíœ´ê°€ 앞으로 ë”ìš± 심화하여, 프로그램 ì œìž‘ 단계ì—까지 긴밀한 협조를 하게 ëœë‹¤ë©´ 가능한 ì–˜ê¹ë‹ˆë‹¤.
ì •ë³´ ìŠ¤íŠ¸ë¦¼ìœ¼ë¡œì„œì˜ ê°€ëŠ¥ì„±
ê·¸ë ‡ê²Œ 프로그램과 완벽히 ì—°ë™ë˜ëŠ” 세컨드 스í¬ë¦°ì„ ê°€ì •í•´ 봅시다. 그럼 비디오 ìŠ¤íŠ¸ë¦¼ì˜ ë‹¨ì ˆê³¼ ì–‘ë°©í–¥ì„±ì˜ ê·¹ëŒ€í™”ê°€ ìžì—°ìŠ¤ëŸ½ê²Œ ì¼ì–´ë‚ 까요. ì¼ë¶€ ìž¥ë¥´ì˜ í”„ë¡œê·¸ëž¨ì—서는 ì´ê²Œ 효과ì 으로 ìž‘ìš©í• ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. 예를 들어 ì‹œì²ìžì˜ 실시간 참여로 ì´ë¤„지는 퀴즈 í”„ë¡œê·¸ëž¨ì„ ìƒìƒí•´ë³´ë©´, 사회ìžê°€ “ìž, 지금 ë‹µì„ ëˆŒëŸ¬ì£¼ì„¸ìš”!â€ë¼ëŠ” êµ¬ë ¹ì— ë§žì¶° ì‹œì²ìžë“¤ì´ 세컨드 스í¬ë¦°ì„ ì¼ì œížˆ 터치하는 ê²Œìž„ì— ì°¸ì—¬í• ìˆ˜ ìžˆì„ ê²ƒìž…ë‹ˆë‹¤. 하지만 ëŒ€ë‹¤ìˆ˜ì˜ ë°©ì†¡ì€ ì—¬ì „ížˆ ì¼ë°©ì ì¸ ë¹„ë””ì˜¤ ìŠ¤íŠ¸ë¦¼ì˜ í¬ë§·ì„ 벗어나지 ì•Šì„ ê²ƒìž…ë‹ˆë‹¤. ì‹œì²ìžê°€ TVì— ê¸°ëŒ€í•˜ëŠ” 바가 ê·¸ë ‡ê¸° 때문입니다. ì‚¬ëžŒë“¤ì˜ ì‹œì² í–‰íƒœê°€ ì–´ëŠ ë‚ ê°‘ìžê¸° 린-ë°±(lean-back)ì—ì„œ 린-í¬ì›Œë“œ(lean-forward)ê°€ ë 것ì´ë¼ëŠ” 순진무구한 ì „ë§ì— 대한 ì‹ ë¹™ì„± 있는 근거는 ì–´ë””ì—ë„ ì—†ìŠµë‹ˆë‹¤.
TVì—ì„œì˜ ì†Œë¹„ëŠ” ì–‘ë°©í–¥ì´ ì•„ë‹ˆë¼ ì»¨í…트 ìŠ¤íŠ¸ë¦¼ì˜ ìˆ˜ë™ì ì‹œì²ì´ë¼ëŠ” ë” ìžì—°ìŠ¤ëŸ¬ìš´ 본능ì ì†Œë¹„ì— ì´ˆì ì„ ë§žì¶°ì•¼ 합니다. 그런 ì˜ë¯¸ì—ì„œ, 세컨드 스í¬ë¦°ì˜ ì„œë¹„ìŠ¤ë„ â€˜ì •ë³´ 스트림’ì´ë¼ëŠ” 컨셉으로 ì ‘ê·¼í•´ 보는 ê²ƒì€ ì–´ë–¨ê¹Œ ìƒê°í•´ 봅니다. 세컨드 스í¬ë¦°ì€ TVì˜ ë³´ì¡° 스í¬ë¦° ê°œë…으로, TV ì•ž íƒìž ì •ë„ì— ì„¸ì›Œì ¸ TV 스í¬ë¦°ì— ë°©í•´ë˜ì§€ 않게 ì ì ˆížˆ ì‹œì„ ì„ ë¶„ë°°í•˜ëŠ” ìœ„ì¹˜ì— ìžˆê³ , ê±°ê¸°ì— ì‚¬ìš©ìžê°€ êµ³ì´ (양방향으로) 무슨 ëª…ë ¹ì„ ë‚´ë¦¬ì§€ ì•Šì•„ë„ í”„ë¡œê·¸ëž¨ê³¼ 완벽히 ì—°ë™ëœ ê´€ë ¨ ì •ë³´ê°€ 방송 ìœ„ì¹˜ì— ì‹±í¬ë˜ì–´ ìžë™ìœ¼ë¡œ í르는 것입니다.
ì´ ì •ë³´ ìŠ¤íŠ¸ë¦¼ì€ í”„ë¡œê·¸ëž¨ê³¼ ê´€ë ¨ëœ ì •ë³´ë¥¼ 간략한 형태로, 예를 들면 키워드나 헤드ë¼ì¸ 수준ì˜-í° í°íŠ¸ë¡œ í‘œí˜„ëœ ì •ë³´ë¥¼ ê°€ë…성 있게 ë³´ì—¬ì¤ë‹ˆë‹¤. íŠ¹ì • ë°°ìš°ê°€ 나오는 장면ì—ì„ ìµœê·¼ ê·¸ ë°°ìš°ì˜ ë‰´ìŠ¤ 헤드ë¼ì¸ì´, íŠ¹ì • ìƒí’ˆì´ 나오는 장면ì—ì„ í•´ë‹¹ ìƒí’ˆì˜ 브랜드와 가격ì´, ê´‘ê³ ì‹œê°„ì—는 í¬ë¡œìŠ¤ 스í¬ë¦°-TV 스í¬ë¦°ê³¼ 세컨드 스í¬ë¦° ì–‘ìª½ì„ ìœ ê¸°ì 으로 활용한- ê´‘ê³ ìº íŽ˜ì¸ì„ 진행합니다. ë¬¼ë¡ ì—´ì• ì„¤ 헤드ë¼ì¸ì— ê¹œì§ ë†€ë¼ íƒœë¸”ë¦¿ì„ í„°ì¹˜í•´ ìžì„¸í•œ 뉴스를 ë³¼ ìˆ˜ë„ ìžˆê² ì£ . ì–‘ë°©í–¥ì„±ì´ ë°°ì œëœ ê²ƒì´ ì•„ë‹ˆë¼ ì–µì§€ë¡œ 드러내지 ì•Šì„ ë¿ìž…니다. ë˜í•œ, 새로운 ê´‘ê³ ì¸ë²¤í† 리가 창출ë˜ëŠ” íš¨ê³¼ë„ ìžˆìŠµë‹ˆë‹¤. ì •ë³´ ìŠ¤íŠ¸ë¦¼ì˜ ë¹ˆ ìŠ¬ë¡¯ì— ê´‘ê³ ê°€ 채워질 수 있다는 ì–˜ê¹ë‹ˆë‹¤.
조금 ë” ì§„ë„를 나가 봅시다. â€˜ì •ë³´ ìŠ¤íŠ¸ë¦¼â€™ì„ ìœ„í•œ TVì˜ ë³´ì¡° 스í¬ë¦°ìœ¼ë¡œì„œ 세컨드 스í¬ë¦°ì„ 사용하는 ëŒ€ì‹ ì—, TV ìžì²´ì˜ í¼íŒ©í„°ê°€ ë³´ì¡° 스í¬ë¦°ì„ 수용하는 방향으로 ë°œì „í•˜ë©´ 어떨까 ìƒìƒí•´ 봅니다. ì´ëŸ° ì‹ìœ¼ë¡œìš”.
TV 스í¬ë¦°ì˜ ì˜†ì— ë³´ì¡° 스í¬ë¦°ì„ 장착하는 ê²ë‹ˆë‹¤. ì‹œì„ ì˜ ë‹¨ì ˆê°ì´ 훨씬 ì ê³ , í™”ë©´ë„ í¬ê¸° ë•Œë¬¸ì— ë” ë§Žì€ ì •ë³´ë¥¼ í‘œí˜„í• ìˆ˜ 있는 장ì ì´ ìžˆìŠµë‹ˆë‹¤. TV 옆으로 확장하는 것ì´ë¼ 잘 안 ë³´ì¼ ìˆ˜ë„ ìžˆìœ¼ë‹ˆ ê°ë„를 êº¾ì„ ìˆ˜ 있게 만들면 ë” ì¢‹ê² ì£ ?
ì—¬ëŸ¬ë¶„ì˜ ìƒê°ì€ ì–´ë– ì‹ ê°€ìš”?
최근 답글