2014년 4월 5일 토요일

[튜토리얼/한글화] Build with Chrome: LEGO® 벽돌을 멀티디바이스 웹으로 옮기기(Build with Chrome: Bringing LEGO® bricks to the Multi-Device Web)

HTML5Rocks에 +Hans Eklund의 'Build with Chrome: LEGO® 벽돌을 멀티디바이스 웹으로 가져오기(Build with Chrome: Bringing LEGO® bricks to the Multi-Device Web)' 한글 튜토리얼이 업데이트되었습니다.

Build with Chrome은 Chrome 브라우저에 실행되며 LEGO® 벽돌들을 이용하여 구조물을 만들어낼 수 있으며 이를 Google Maps와 연동하여 전세계의 지도 위에 위치시킬 수 있는 인터랙티브 3D 컨텐츠입니다. 이 튜토리얼은 Build with Chrome이 2014년 다시 런칭하며 적용하였던 모바일 및 터치 지원 과정에서 발생한 주요 이슈에 대한 사례연구를 담고 있습니다. (저자인 Hans Eklund가 일하고 있는 North Kingdom은 그동안 '호빗 체험'이나 'RO.ME'과 같은 프로젝트를 만들어온 회사입니다. 포트폴리오도 재밌는 것이 많으니 한번 살펴보시기 바랍니다.)

"Build with Chrome이 2014년에 터치 스크린 및 모바일 디바이스를 지원하도록 적용하는 과정에서 발생한 성능, 터치 그리고 멀티 스크린 대응과 같은 주요 문제들은 다른 인터랙티브 3D 컨텐츠에서도 반복되는 문제입니다. 만약 비슷한 컨텐츠 개발을 계획 중이라면 읽어보시기 바랍니다."



TL;DR;


데스크탑 크롬용으로 개발되었던 Build with Chrome은 다시 릴리즈되는 과정에서 모바일 디바이스들을 지원하는 기능이 새로 추가되었습니다. 이 과정에서의 가장 큰 이슈들은 사용자 경험과 디자인에 대한 해결이었으며 기술적인 도전은 많은 화면 크기, 터치 이벤트 그리고 성능 이슈들을 관리하는 것이었습니다. 터치 디바이스 상에서의 WebGL 쉐이더 사용에 대한 몇가지 도전과제들이 있었지만 이는 기대했던 것보다 꽤나 잘 동작했습니다. 디바이스들은 점점 더 강력해지고 있으며 WebGL 구현들은 빠르게 개선되고 있으므로 가까운 시일 내에 더 많은 디바이스에서 WebGL을 더 많이 사용할 수 있을 것이라고 예상할 수 있습니다.

> 반응형 프론트엔드


터치와 마우스 입력을 사용하는 디바이스 모두를 지원해야 했으나, 작은 터치 스크린 상에서 동일한 UI를 사용하는 것은 공간 제약을 제대로 해결할 수 없었고 사용자의 손가락이 상호작용을 하는 동안 작은 스크린의 많은 부분을 커버하였으므로 픽셀들보다 물리적인 스크린 사이즈에 대해 정말 고려하고 실제 컨텐츠에 전념할 수 있도록 가능한 많은 공간을 확보하는 것이 중요합니다.

Build with Chrome의 경우 터치 디바이스에서 자연스럽게 느끼도록 만들고 정말 터치 입력을 의도한 것처럼 느끼도록 하기 위해 미디어쿼리를 이용하여 2가지의 UI 변경 버전을 개발하였습니다.

  • 마우스와 터치를 지원하는 큰 화면
    • 큰 화면 버전은 마우스를 지원하는 모든 데스크탑 컴퓨터와 큰 화면을 가진 터치 디바이스에 제공되며 터치 지원과 몇가지 제스쳐가 추가된 오리지널 데스크탑 버전과 유사합니다.
  • 터치만 지원하는 작은 화면
    • 이 모바일 디바이스들과 작은 태블릿용 버전은 멀티-터치를 요구하며 화면 상의 공간을 최대화하기 위한 대부분의 작업은 잘 사용하지 않는 UI 요소들을 최소화하거나 멀티 터치 제스쳐로 변경하고 풀스크린 모드를 지원하는 것이었습니다.


> WebGL 성능과 지원


현재의 터치 디바이스들은 꽤 강력한 GPU들을 가지고 있지만 여전히 데스크탑의 상대가 되기는 어려우므로 성능, 특히 동시간에 많은 구조물을 렌더링할 필요가 있는 3D 탐색 모드에 대해 텍스쳐, 구조물 로딩이나 구조물들의 애니메이션 및 렌더링 등 많은 것들이 동시에 처리되어 GPU와 CPU 모두를 크게 요구했으므로 모바일 디바이스에서는 구조물에 꽤 가깝게 줌하도록 하여 동시에 많은 구조물을 렌더링할 필요가 없도록 하는 접근을 취했습니다. 다만, WebGL 기능이 없는 디바이스의 경우 WebGL의 사용없이 빌드와 3D 탐색 기능을 유사하게 동작할 수 있는 충분히 훌륭한 해결방법을 찾지는 못했습니다.


> 화면 방향 관리하기


모바일 디바이스에 적용을 시작할 때 세로 모드(Portrait mode)에서 가로 모드(Landscape mode)에 대해 고려할 필요가 있습니다. Build with Chrome의 경우 컨텐츠의 흐름을 유지하고 편안한 방식의 상호작용을 제공하면서 가로와 세로 방향으로 모두 동작하는 대신 가로 모드만을 지원하기로 하였습니다.

대부분의 컨텐츠 레이아웃은 CSS에 의해 제어되지만 방향과 관련된 것은 자바스크립트에서의 구현을 필요로 하였으며 이를 위해 window.orientation을 사용하는 것은 좋은 크로스-디바이스 솔루션이 아니라는 것을 확인하였으므로 window의 .innerWidth와 .innerHeight의 비교하였습니다.


> 터치 지원 추가하기


웹 컨텐츠에 대한 터치 기능의 추가 지원은 합리적이며 올바른 것입니다. 마우스와 터치를 동시에 지원하기 위한 포인터 이벤트는 W3C에 표준으로 제출되었습니다만 아직 인터넷 익스플로러에서만 구현되어 있습니다. 따라서 터치 이벤트들 또한 다루는 것이 필요할 것입니다. 이 글은 이 이벤트들을 어떻게 사용하는지에 대한 기초들을 다루고 있습니다.

  • 멀티터치 제스쳐
    • 핀치(Pinch)와 회전 제스쳐를 관리하기 위해 두번째 손가락이 화면에 얹어질 때마다 두손가락 사이의 거리와 각도를 저장했습니다.
  • 마우스와 터치의 동시 지원
    • 오늘 날에는 마우스와 터치 입력을 둘 다 지원하는 디바이스가 있으므로 터치 지원의 검출만으로 마우스 입력을 무시하는 대신 동시에 전부를 지원하지 않는다면 몇가지 예상치 못한 동작을 발생할 수 있습니다.
  • 마우스, 터치 그리고 키보드 입력 처리
    • 이벤트 핸들러 내에서의 입력을 변수에 저장하고 requestAnimationFrame의 렌더 루프에서 입력에 반응하도록 하여 렌더링 성능 등의 오버헤드를 최대한 회피하고 마우스 입력 등으로의 확장을 보다 용이하도록 합니다.
    • 또한 각 이벤트 핸들러에서 event.preventDefault()는 브라우저가 스크롤이나 전체 페이지의 스케일을 조정하는 것과 같은 예상치 못한 동작을 발생할 수 있는 터치 이벤트의 지속적인 처리를 막을 수 있습니다.




자세한 내용은 튜토리얼을 참조하시기 바랍니다.

번역 링크

2014년 3월 27일 목요일

[튜토리얼/한글화] WebRTC 시작하기(Getting started with WebRTC)

HTML5Rocks에 +Sam Dutton의 'WebRTC 시작하기(Getting Started With WebRTC)' 튜토리얼의 한글 버전이 업데이트되었습니다. 이번 번역은 이원제(+nuri nam)님께서 수고해주셨습니다. :)

"말그대로 WebRTC는 웹을 위한 실시간 통신 규격입니다. 이는 오디오나 비디오 스트림을 P2P로 송수신하는 것뿐만이 아니라 데이터 전달을 위한 메커니즘을 포함하고 있습니다. 대다수의 서비스들은 클라언트-서버 간의 데이터 통신을 통해 기능을 제공하고 있지만 어떤 경우는 클라이언트 간의 빠른 데이터 교환이 주요 기능 구현 사항이 되기도 합니다. 바로 이러한 경우 WebRTC는 중요한 기반 기능을 제공합니다. 뒤집어 얘기하자면 서버를 중계할 이유가 없으며 클라이언트 간의 데이터를 빠르게 송수신하고자 한다면 WebRTC는 좋은 선택이 될 수 있습니다. WebRTC의 다양한 구현 사례를 보기 전에 이 튜토리얼을 통해 WebRTC가 어떠한 것이고 어떻게 사용하는지를 확인해보시기 바랍니다."


TL;DR;


현재 웹의 주요 도전 과제 중에 남은 하나는 실시간 대화(Real Time Communication, RTC) 가능하게 하는 것입니다. 많은 웹서비스들이 이미 실시간 통신을 사용하고 지만 네이티브 앱이나 플러그인들의 다운로드가 필요했습니다. 이제 HTML5에서 플러그인 없는 실시간 통신을 위한 규격인 WebRTC는 현재 크롬, 오페라, 파이어폭스에서 가능하며 WebKitGTK+ 와 Qt 네이티브 프레임워크에도 통합되어 있습니다.

WebRTC 어플리케이션이 취하는 일반적인 기능은 다음과 같습니다.

  • 스트리밍 오디오, 비디오 또는 데이터의 획득
  • 네트워크 정보의 획득 및 다른 WebRTC 클라이언트들과 정보 교환
  • 에러들의 보고, 세션 초기화/종료를 위한 Signal 통신 관리
  • 미디어와 클라이언트의 지원 기능(해상도와 코덱 등)에 대한 정보 교환
  • 스트리밍 오디오, 비디오, 데이터의 송수신



apprtc.appspot.com의 WebRTC 통신 및 일반 통신

스트리밍 데이터를 얻고 통신하기 위해 WebRTC에서는 다음과 같은 API를 제공합니다.

  • (getUserMedia라고도 하는) MediaStream - 카메라/마이크 등 데이터 스트림 접근
  • RTCPeerConnection - 암호화 및 대역폭 관리 및 오디오 또는 비디오 연결
  • RTCDataChannel - 일반적인 데이터 P2P통신


> MediaStream


MediaStream API는 미디어의 동기화된 스트림들을 말합니다. 예를 들어, 카메라와 마이크의 입력에서 받아온 스트림은 오디오와 비디오 트랙들로 동기화 됩니다. getUserMedia()는 반드시 로컬 파일 시스템이 아닌 서버에서 사용되어야 합니다.


> 시그널링(Signaling)


WebRTC 클라이언트로 사용되는 웹 브라우저들 사이에 스트리밍 데이터를 주고 받기 위해 RTCPeerConnection를 사용하며 통신을 조율하고 조장할 메세지를 주고 받기 위해 시그널링(Signaling)으로 알려진 일련의 과정이 필요합니다. 시그널링(Signaling)은 RTCPeerConnection API에 포함되지 않지만 WebRTC 개발자들은 SIP, XMPP 또는 적절한 쌍방통신 채널 등 자신들에게 편한 방식을 선택할 수 있습니다.


> RTCPeerConnection


RTCPeerConnection은 Peer들 간의 데이터를 안정적이고 효율적으로 통신하게 처리하는 WebRTC 컴포넌트입니다. JavaScript 측면에서 보면 RTCPeerConnection는 WebRTC에서 사용되는 엄청나게 많은 일들을 개발자가 신경쓰지 않을 수 있도록 많은 기능을 백그라운드에서 지원하고 있습니다. 실제로 WebRTC는 서버가 필요하지만 단순합니다.


> RTCDataChannel


오디오와 비디오처럼, WebRTC는 실시간으로 다른 형태의 데이터 통신도 지원합니다. RTCDataChannel API는 피어와 피어간 임의의 데이터 교환을 빠른 반응속도와 높은 처리량으로 가능하게 합니다. 이 API를 이용하여 게임이나 원격 데스크탑 어플리케이션, 실시간 채팅, 파일 전송, 분산 네트워크 등으로의 응용이 가능합니다.

RTCDataChannel API는 RTCPeerConnection의 대부분의 기능들을 활용하여 강력하고 유연한 P2P통신을 가능하게 하는 몇가지 기능을 가지고 있으며 통신은 브라우저간 직접 연결됩니다 , 그래서 RTCDataChannel은 WebSocket보다 매우 빠릅니다. 심지어 방화벽과 NAT의 방해로 '구멍내기'가 실패하여 중계(TURN) 서버와 연결이 되더라도 빠릅니다.


> 보안


실시간 통신 어플리케이션이나 플러그인에서 보안 문제가 발생하는 경우가 몇가지가 있습니다. WebRTC는 이 문제들을 피할 수 있는 몇가지 기능들을 가지고 있습니다:


  • WebRTC는 DTLS와 SRTP등의 보안 프로토콜을 사용하여 구현되었습니다. 따라서 암호화는 Signlaing 메커니즘을 포함한 모든 WebRTC Components의 필수 조건입니다.
  • WebRTC는 플러그인이 아니므로 컴포넌트들은 브라우저의 샌드박스위에서 실행되고 별도의 프로세스로 나눠지지 않습니다.
  • 카메라와 마이크에 접근은 반드시 허가를 통합니다.


WebRTC에 대한 자세한 내용은 튜토리얼을 참조하시기 바랍니다.

번역 링크


참조 링크

[튜토리얼/한글화] HTML5에서 오디오 및 비디오 캡쳐하기(Capturing Audio & Video in HTML5)

HTML5Rocks에 +Eric Bidelman의 'HTML5에서 오디오 및 비디오 캡쳐하기(Capturing Audio & Video in HTML5)' 한글 튜토리얼이 업데이트되었습니다.

그동안 웹에서 오디오와 비디오의 캡쳐는 재생과는 전혀 다른 범주의 기능처럼 인식되어 왔습니다. HTML5는 다른 많은 기능과 마찬가지로 오디오 및 비디오의 재생뿐만이 아니라 오디오나 비디오 입력 스트림의 처리를 가능하도록 그 기능을 확장하였습니다. 이 튜토리얼은 이 기능들을 다루기 위한 기초적인 설정 방법부터 몇가지 일반적인 구현 사례를 설명합니다.

이번 번역은 이원제(+nuri nam)님께서 수고해주셨습니다. :)

"오랜 기간동안 웹 환경은 개발자에게 플래시나 실버라이트와 같은 플러그인을 이용하여 오디오와 비디오 캡쳐를 구현하도록 강요해왔습니다. HTML5는 이러한 플러그인 종속성을 없애고 이들 장치에 대한 입력 스트림을 직접 제어할 수 있도록 기능을 제공하고 있습니다. 입력 스트림을 제어한다는 것은 여러분의 웹 앱을 생각보다 더 크게 확장할 수 있습니다. WebRTC의 일반적인 사례처럼 비디오 컨퍼런스 서비스를 구현할 수도 있지만 조금만 더 아이디어를 덧붙인다면 네이티브에서 구현해왔던 얼굴/모션의 검출 등으로 얼마든지 확장할 수 있습니다."



TL;DR;


지난 세월동안 오디오와 비디오 캡쳐는 외부 플러그인들을 사용할 수 밖에 없었습니다. HTML5는 다양한 하드웨어에 대한 접근을 표준 규격으로 정의하고 있으며 오디오와 비디오의 캡쳐 역시 예외는 아닙니다. 이와 관련해서 그동안 다양한 규격들이 W3C에서 시도되어 왔지만 현재 getUserMedia()를 통해 대다수의 작업을 할 수 있도록 정리되었습니다. 이제 여러분은 getUserMedia()를 통해 사용자의 카메라와 마이크를 웹앱에서 접근할 수 있습니다.

> 멀티미디어 디바이스의 접근


사용자의 멀티미디어 디바이스의 입력 스트림을 제어하기 위해서 다음과 같은 기능들이 필요할 것입니다.


  • 미디어에 대한 권한 요청
    • 웹캠과 마이크에 접근하기 위해서는 먼저 어떤 디바이스에 어떠한 방식으로 접근하는지에 대한 권한을 getUserMedia()를 이용하여 요청해야 합니다.
  • 미디어 기능 요구사항 설정
    • 필요하다면 getUserMedia()의 호출 시 접근하고자 하는 미디어 스트림에 대해 필요한 요구사항들(해상도, 비트레이트 등)을 설정할 수 있습니다.
  • 미디어 소스의 검색과 선택
    • 크롬의 경우 버전 30 이후부터는 getUserMedia()에서 입력 스트림으로 사용가능한 소스를 검색할 수 있도록 MediaStreamTrack.getSources() API를 지원합니다.
    • 이 API를 이용하면 현재 디바이스에 지원하고 있는 접근 가능한 입력 스트림 소스에 대한 리스트를 액세스할 수 있으며 이를 통해 적합한 디바이스를 선택할 수 있습니다.


getUserMedia()를 사용할 때 일부 브라우저는 카메라와 마이크에 대한 접근에 대한 사용자 허가를 요청하는 상태바를 표시할 수 있으며 getUserMedia()가 지원되지 않거나 API 호출이 실패하였을때 다른 형태의 미디어로 대체하는 과정이 필요할 수 있습니다.


> 입력 스트림을 통한 몇가지 구현 사례들

디바이스의 입력 스트림에 성공적으로 접근한 뒤에 <video>나 <audio> 태그의 소스로 사용할 수도 있지만 이를 통해 다음과 같이 추가적인 기능을 구현할 수도 있습니다.


  • 사진 찍기
    • <canvas> API의 ctx.drawImage()를 이용하여 입력 스트림을 정적인 사진 이미지 형태로 활용하여 사진 촬영 기능으로 사용할 수 있습니다.
  • 효과 적용
    • CSS Filters를 사용해서 <video>에 대한 효과를 적용할 수 있습니다.
    • 비디오 스트림을 WebGL Texture로 이용할 수 있습니다.
    • 크롬의 경우 getUserMedia()의 스트림을 Web Audio API로 연결하여 오디오를 직접 제어할 수 있습니다.


이제 웹앱의 범주를 확장하기 위한 다양한 시도들 중의 하나인 getUserMedia()를 이용하여 다양한 어플리케이션의 개발을 시도해보시기 바랍니다. 자세한 내용은 튜토리얼을 참조하세요.



번역 링크

참고 글


2014년 3월 7일 금요일

[튜토리얼/한글화] 자바스크립트 성능 수수께끼를 해결하기 위한 과학적인 검출 방법 사용하기(Use forensics and detective work to solve JavaScript performance mysteries)

HTML5Rocks에 +John McCutchan의 '자바스크립트 성능 수수께끼를 해결하기 위한 과학적인 검출 방법 사용하기(Use forensics and detective work to solve JavaScript performance mysteries)' 한글 튜토리얼이 업데이트되었습니다.

당연한 얘기지만 모든 최적화는 문제가 되는 지점을 개선하는 작업입니다. 당연한 얘기겠지만 이러한 이유로 성능 병목 지점을 찾는 것이 가장 첫번째 단계입니다. 문제의 원인을 찾으면 여러가지 테크닉 중 어떤 것을 선택해서 해결할 수 있는지에 대한 방법을 결정할 수 있을 것입니다. 이 튜토리얼은 Find Your Way to Oz의 개발 과정에서 성능 문제를 개선하기 위해 병목 지점들을 찾는데 사용된 방법을 다루고 있는 사례 연구이기도 하며 실질적인 가이드라인이기도 합니다.

이번 번역은 +Jae-Hoon Kim님께서 수고해주셨습니다. GDG Seoul 2월 밋업에서의 발표 후 얼마 안되서 바로 참여해주셨는데 감사드립니다. :)

"가비지 콜렉션이나 로직 오버헤드, 렌더링 오버헤드  혹은 리소스 로딩으로 인한 jank 등 하나의 어플리케이션에서 성능에 영향을 주는 요인은 굉장히 많습니다. 점진적으로 하나씩 개선해나가는 방식도 좋지만 가능하다면 가장 큰 요인 중 가장 쉽게 해결할 수 있는 것들부터 찾아나가거나 다른 기준에 의해 성능을 개선할 수도 있을 것입니다. 만약 이러한 방식을 원하신다면 그 무엇보다도 우선시되어야 할 작업은 최적화가 아닌 진단입니다."



TL;DR;


최근 몇 년 동안 자바스크립트 가상 머신 기술의 놀라운 진보에도 불구하고, 최근 한 연구는 Google 어플리케이션이 그들의 시간 중 50~80%를 V8에서 보내고 있음을 증명하였습니다. CPU 사이클은 하나의 제로-썸 게임입니다. 시스템 리소스를 더 적게 사용하도록 하는 것은 더 높은 성능을 보여주는 방법이며 고성능 실시간 어플리케이션에서 무엇보다 중요합니다.

성능 문제를 해결하는 것은 범죄를 해결하는 것과 유사합니다. 여러분은 조심스럽게 증거를 조사하고 의심되는 원인들을 확인하고 다른 해결책들을 실험하는 것이 필요합니다. 이러한 과정 내내 문제를 실제로 고쳤는지 확인할 수 있도록 반드시 측정된 결과들을 문서화해야 합니다.

이 튜토리얼은 Find Your Way to Oz의 모호한 성능 문제를 찾아내고 자바스크립트를 최적화와 프로파일링한 방법들을 다루고 있습니다. Oz의 경우 가설을 통해 최종적으로 선택된 두 개의 용의자가 있었으며 이를 V8 엔진의 로그와 V8 내부의 최적화에 관련된 추적을 통해 정확한 문제점을 도출하고 자바스크립트 for-in 구문의 수정을 통해 성능을 개선하였습니다.

> 자바스크립트의 로그를 이용한 성능 요인 검출 방법


V8 자바스크립트 엔진은 내장된 로깅 시스템을 가지고 있습니다.

터미널에서 "--no-sandbox --js-flags="--prof --noprof-lazy --log-timer-events" 인자들을 이용하여 크롬을 실행하고 어플리케이션을 구동한 뒤 종료하면 현재 디렉터리 안에 v8.log 파일이 생성됩니다. 이렇게 생성된 로그는 tick processor와 plot-timer-event를 통해 분석할 수 있습니다.


> V8 최적화의 추적


V8의 자바스크립트 성능 관련 팁들에서 언급된 바 있듯이 V8은 높은 성능을 위해 실행 시간에 자바스크립트에 대한 많은 최적화를 수행합니다. 만약 이 과정에서 의심되는 문제가 있다면 터미널에서 "--js-flags="--trace-deopt --trace-opt-verbose" 인자를 통해 크롬을 실행하여 상세 로그를 확인할 수 있습니다.


자세한 내용은 튜토리얼을 참조하시기 바랍니다.


번역 링크

참고 글

[튜토리얼/한글화] 여러분의 Gruntfile을 강력하게: 빌드 설정 쥐어짜기(Supercharging your Gruntfile: How to squeeze the most out of your build configuration)

HTML5Rocks에 +Paul Bakaus의 튜토리얼 'Gruntfile을 강력하게: 빌드 설정 쥐어짜기(Supercharging your Gruntfile: How to squeeze the most out of your build configuration)'의 한글 버전이 업데이트되었습니다.

Node.js가 등장한 이후 이를 이용한 다양한 모듈과 서비스들 쏟아져 나왔습니다. 아마 Ben Alman이 만든 Grunt 역시 그 중의 하나이며 가장 사랑받는 모듈 중의 하나일 것입니다. Grunt는 프론트엔드 웹 개발 및 배포 환경의 많은 부분을 자동화할 수 있도록 강력한 빌드 기능을 제공합니다. 특히 JavaScript를 통해 이러한 부분이 제어될 수 있다는 점 역시 프론트엔드 개발자들에게 Grunt가 사랑받는 이유 중의 하나일 것입니다.

그러나 대부분의 프론트엔드 개발 프로젝트는 강력해진 기능만큼이나 복잡한 개발 및 테스트, 배포 환경을 필요로 하게 되었고 부피가 커진 만큼이나 다루기가 어려워져 가고 있습니다. Grunt도 이 부분에서는 예외가 아닙니다.

이 튜토리얼은 프로젝트가 커질 수록 더 유용해지는 몇가지 Grunt 플러그인들과 Grunt의 빌드 프로세스 자체를 개선할 수 있는 핵심적인 내용을 살펴볼 것 입니다.


"Grunt는 개발자가 커스터마이징할 수 있는 강력한 빌드 환경을 제공합니다. 하지만 복잡하고 거대해진 프로젝트 빌드 환경을 관리하는 것은 프로그래밍과는 또다른 영역의 작업들을 수반합니다. Gruntfile을 얼마나 깔끔하게 관리할 수 있는지, 빌드를 얼마나 신속하게 끝낼 수 있는지, 빌드의 완료나 문제에 따른 알림 처리를 통해 작업에 빠르게 복귀할 수 있는지에 대한 문제는 프로젝트가 커질 수록 더 중요해집니다. 과거의 (물론 현재도) Makefile이 그랬듯이 큰 프로젝트를 관리하는 것은 프로페셔널의 또 다른 모습일 것입니다."


TL;DR;


프로젝트가 커질 수록 깔끔하게 정리되고 빠르고 선택적인 처리, 무언가가 잘못되었을 때 알림을 발생하는 빌드 시스템은 언제나 개발자에게 유용합니다. 이 튜토리얼은 최근 프론트엔드 개발에서 널리 쓰이고 있는 Grunt의 빌드 프로세스 자체를 다음 관점에서 살펴봅니다.

  1. 어떻게 Gruntfile을 산뜻하고 깔끔하게 유지할 수 있는가,
  2. 어떻게 빌드 시간을 극적으로 개선할 수 있는가,
  3. 빌드 시 발생한 이벤트들을 어떻게 전달받을 수 있는가.


> Gruntfile의 체계적인 정리


Gruntfile 체계화하는 것은 지속적인 빌드 설정의 관리와 유지 보수 측면에서 매우 중요합니다.  Gruntfile 내에 수많은 Grunt 플러그인이나 수동 태스크들을 깔끔하게 정리할 수 있는 플러그인들은 다음과 같습니다.

  • Grunt 플러그인의 자동로딩
    • load-grunt-tasks는 package.json 파일을 분석할 것이며 이 태스크가 어떠한 Grunt 플러그인들에 대한 의존성들을 가지는지에 따라 이들 모두를 자동으로 로딩합니다.
  • Grunt 설정의 파일 단위 분리
    • load-grunt-config은 Gruntfile 설정을 작업 단위로 분리하며 load-grunt-tasks 및 그 기능들을 캡슐화해줍니다.


> 빌드 시간의 최소화


웹 앱의 실행 성능은 사업적으로 중요한 의미를 가지지만 빌드 성능은 개발의 반복에 대한 생산성을 담보합니다. 빌드 성능을 개선하기 위한 방법은 다음과 같습니다.

  • 변경 파일들만의 빌드
    • grunt-newer는 실제 파일 변경 정보를 저장하는 로컬 캐시를 통해  변경된 파일들에 대해서만 태스크를 실행합니다.
  • 다중 태스크의 동시 실행
    • grunt-concurrent는 CPU 단위의 스레드를 이용하여 동시에 여러개의 태스크를 실행합니다.
    • 서로에 대해 독립적이며 큰 실행 시간을 필요로 하는 다량의 태스크들을 가지고 있을 때 유용합니다.
  • 빌드 시간의 측정
    • 작업 단위별로 실행 요구 시간을 측정하기 위해 time-grunt를 사용할 수 있습니다.
    • 이는 다른 최적화와 마찬가지로 각 작업에 대한 최적화 지점을 찾을 수 있도록 합니다.


> 자동화된 시스템 알림


만약 다음 빌드가 가능하다던지 빌드 중의 오류를 개발자에게 알려주는 것은 자동화된 프로세스만큼이나 개발자에게 유용할 수 있습니다. 이런 기능이 필요하다면 grunt-notify는 Grunt 에러와 경고 전부에 대해 자동화된 알림을 제공하는 방법으로 사용할 수 있습니다.


보다 자세한 내용은 튜토리얼을 참고하시기 바랍니다.


번역 링크

참고 링크

2014년 2월 27일 목요일

[Summit/Summary] Google Developers Summit 후기

세미나나 컨퍼런스에 참가하는 것은 언제나 즐거운 일입니다. :) 어제(26일)도 코엑스 그랜드볼룸에서 Google Developers Summit이 있었습니다. 이번 서밋은 처음과 끝의 세션들은 서비스 관점에서의 내용들이 위주였고 중간 트랙 부분만 기술 관점의 세션들로 구성되어 있었습니다. 어제 들으며 요약해 놓은 내용을 공유합니다. 선발 신청 형태였음에도 많은 분들이 오셨더군요. 서밋 준비로 +Soonson Kwon님과 구글 코리아에서 고생하셨을 것 같습니다. 박수를~~ 보내드리며 후기 시작합니다. :)


  • 일시: 2월 26일 수요일 오후 1시 ~ 오후 6시 30분
  • 장소: 삼성역 코엑스 그랜드 볼룸 104호, 105호

아래는 제가 들은 세션의 스케쥴입니다.

시간주제 및 발표TL;DR
13:10 ~ 13:50Avoiding Pitfalls on Android App Quality and Visibility at Google Play (Ryosuke Matsuuchi)Your success with Android App depends on several quality characteristics of your app and good publishing techniques. In this session we'll discuss about how you can avoid common pitfalls on the app quality and publishing.
14:00 ~ 14:40다시 한번 안드로이드 디자인 가이드라인 (양찬석)
15:00 ~ 15:40Chrome WebView Essentials (Alex Danilo)Android 4.4 KitKat introduces a new WebView based on Chromium. The new WebView brings wonderful HTML5 APIs as well as lots of enhanced functionality. This session introduces the Chrome WebView, it's capabilities, debugging features and backward compatibility enhancements. Best practices for using the new WebView in existing applications will also be explained.
15:50 ~ 16:30Increasing user engagement in your apps with YouTube APIs (Yoshifumi Yamaguchi)In the past year, YouTube has made it easier for anyone to live stream content to the world as well as improved mobile video playback. Learn how you can utilize YouTube APIs to increase user engagement in your apps. We will show you examples of apps that have done this and walkthrough the technical implementation.
16:40 ~ 17:20크롬캐스트와 구글 캐스트 (미키김(김현유), 조시형)작년에 미국에서 출시한 크롬캐스트는 N 스크린과 스마트 TV 시장에 새로운 화두를 던지고 있으며 타임지가 뽑은 2013년도의 제품을 선정되기도 했습니다. 이번 세션에서는 크롬캐스트에 대한 소개 및 구글 캐스트 SDK에서 대해서 이야기하고 개발자가 가질 수 있는 기회에 대해서 다룹니다.

아래는 들으면서 적어둔 각 세션에 대한 요약 로그입니다.


Session.1: Avoiding Pitfalls on Android App Quality and Visibility at Google Play - +Ryosuke Matsuuchi 


료스케 마츠우치씨는 구글 플레이에서의 가이드라인에 대한 내용을 "구글 플레이에서 안드로이드 앱 품질과 가시성에 대한 위험 회피하기"라는 제목으로 세션을 진행했습니다. 일단 앞부분은 제가 딴짓 하느라 살짝 놓쳤는데 어쨌던 구글 플레이에서의 모든 노출 알고리즘은 영역에 상관없이 동일한 방식을 따른다더군요.

아래는 회피해야할 위험(Pitfall)들로 묘사된 슬라이드에 대한 내용입니다. 일반적인 내용도 많지만 참조해보시길.

> #1 나쁜 사용자 평가


일반적으로 4개에서 5개의 별을 받은 어플리케이션이 3개를 받은 어플리케이션의 매출 수준에 비해 2.8배의 매출을 보인다고 합니다. 근본적으로 사용자 평가를 관리하는 품질 관리, 운영 및 지원의 근본적 원인이겠죠.

> #2 높은 언인스톨율


가짜 스크린샷이나 잦은 알림(Notificaiton) 등으로 인한 언인스톨들이 많이 발생하며 이러한 언인스톨율이 높은 경우의 문제의 가장 일반적인 경우 중 하나는 프로모션을 통해 빠르게 랭킹에 진입한 뒤 언인스톨율이 높으면 빠르게 랭킹에서 사라지는 현상입니다.

그렇다면 랭킹에서의 drop율은 언인스톨율에 의해 가속될 수 있는 것인가? 라는 의문이 들었는데 질문 시간에 유사한 질문이 있어 따로 질의를 하지는 않았습니다. 랭킹 시스템 등은 일반적으로 비밀이기도 하고 해서 자세한 답변은 하지 않은 것 같더군요.

또다른 질의는 "개별 국가에서의 언인스톨이 영향을 주는가?" 였는데 결론적으로는 '직접적인 영향은 주지 않지만 다른 국가에 대한 간접적인 영향은 준다.'였습니다. 시스템적으로도 그런 것인지는 좀 불분명한데…기회가 되면 확인해보시고 공유해주시면 감사하겠습니다. :)

> #3 낮은 성능


소프트웨어 개발쪽에서는 '성능은 언제나 문제(Performance is always problem)'이라는 말을 쓰는 경우들이 많은데요. -저만 자주 들었나요? 제가 이쪽에 관심을 두고 있어서 그런 것 같기도 합니다만...:)-

아무튼 이에 대한 UX 관점에서의 권장 사항을 얘기하더군요.


  • 스크롤/애니메이션에 대해 20FPS 이상 유지
  • 터치에 대한 200ms 내의 반응성
  • 웹과는 다른 사용자 경험 
    • 웹과는 다르다기 보다는 멀티태스킹이나 시스템 자원 활용이 비교적 자유로운 네이티브 앱의 특성 상 프리패치나 백그라운드 태스크, 캐싱 등에 대한 지원을 통해 성능을 높이라는 얘기입니다.
  • 디버그 모드에서 Strict 상태에서의 “Red Flash”는 제거
    • 제가 안드로이드를 별로 안해봐서 정확하게는 모르지만 기억으로는 렌더링 오버헤드가 일어나는 영역에 빨간색 박스를 쳐주는 기능이 있었던 것 같은데요. 이를 응용해서 성능 최적화를 하라는 얘기로 생각합니다.


> #4 - 태블릿 사용자


일단 스마트폰과 대비했을 때 1.7배의 사용자가 앱을 구매한다고 하더군요. 그리고  13.1%의 안드로이드 디바이스가 높은 해상도를 가지고 있으므로 고해상도에 대한 대응을 반드시 해달라고 합니다.

  • 다양한 해상도를 지원하는 앱으로 제작
    • 안드로이드의 경우 Fragment를 사용하면 되겠고 하이브리드 웹앱의 경우는 반응형이나 뷰 분리같은 것들이 해당되겠죠.
  • 가급적 태블릿 버전을 별도로 분리하지 말 것
  • Google Play에서 “폰을 위해 디자인된 앱” 레이블링을 피할 것
    • 2013/11/22부터 구글 플레이에서 태블릿을 위해 디자인 된 앱에 대한 리스트를 보여주므로 사실은 태블릿을 지원한다는 것이 더 좋은 마케팅 포인트로 보입니다.


> #5 기존 디바이스 사용자를 타겟팅한 개발


매우 강조하던 부분 중의 하나인데 기존 디바이스에 비해 신규 단말의 사용자가 2.2배의 구매율을 보이므로 사실은 신규 단말을 대상으로 하라는 얘기입니다.


  • SDK Ver.19 이상으로 설정하여 “Menu button of shame”을 회피할 것
  • 2.x 버전에 대한 지원 패키지도 있으니 최신 UI/UX 가이드라인을 따를 것
  • 구글 게임 플레이 서비스 및 컨트롤러 등의 최신 기술에 대해 사용을 고려할 것

이 부분은 아무래도 최신의 안드로이드 플랫폼과 기술을 확산시키려는 구글의 의지가 반영된 내용이라고도 보입니다. 물론 UX 가이드라인은 지원 패키지가 있으니 하는게 Look & Feel에서 맞다고 보여집니다.


> #6 일반적인 배포 실수들


간단하게 정리하겠습니다.

  • 통신 사업자 및 호환 스크린 등에 대한 사용과 같은 좁은 범위의 대상으로 배포하는 것을 회피
  • 고해상도의 앱 런칭 아이콘을 제공. XXXHDPI까지 얘기를 하는 것을 보면 나름 TV 부분에 대한 니즈도 있는 것 같다는 생각이 듭니다.
  • 스팸이나 잘못된 정보 기재 조심
  • 소개 비디오는 가급적이면 삽입할 것
  • 해외 사용자를 위한 번역에도 신경쓸 것


> #7 끔찍한 권한 요청들


이 부분은 저도 동의하는 바입니다만, 가끔 퍼미션을 필요한 것보다 과도하게 넣는 경우들이 있는데 이건 좀 피해줬으면 좋겠습니다. 요즘 같이 정보 보안에 민감한 시대에 아무래도 걱정되는 부분들이 사용자 입장에서는 있으니까요. 예를 들어 게임에서 사용하지 않는 경우에도 사진 촬영 퍼미션을 넣는다던지 하는 경우죠. 권한이 필요하다면 왜 쓰는지 깔끔하게 정리해서 설명하는 것이 좋습니다.

게임에서 주로 잘못된 권한 요청의 예는 다음과 같습니다. -가만 보면 가끔 게임에서 쓰는 것들은 있기는 합니다.-

  1. WiFi 설정 변경
  2. 부팅 완료 노티
  3. 실행 태스크들에 대한 쿼리
  4. 현재 위치 정보
  5. 시스템 로그 접근
  6. 직접적인 전화 연결
  7. 연락처 및 캘린더 접근
  8. 북마크 접근
  9. 시스템 수준의 경고 출력
  10. SMS 송수신


> #8 IA 결제 API에 대한 잚못된 사용



  • Version 3 API를 사용하세요! - 구버전을 사용하는 경우가 많은가 봅니다.
  • 메모리 부족에 대해 반드시 테스트할 것
    • 생각보다 많은 프로그램이 결제 중 메모리 문제로 셧다운이 일어나서 사용자에게 결제 처리 여부에 대한 고민을 하게 되므로 사용자에게 결제가 진행되지 않았으면 이를 다시 시작한다는 것을 명확하게 처리
  • 구매 토큰을 반드시 서버에 저장할 것!!!!!
    • 어쨌던지 사용자의 불만 제기에 대해서 대응 시에도 이러한 부분은 필요하다는 것이 주요한 내용입니다. 생각보다 많은 사람들이 서버 없이 해서 그런가 싶기도 하네요.
  • 서버측 인증서 검증 기능을 구현할 것
    • java.security.Signature.verify()를 믿지 말고 서버에서 할 것.
    • …이건 뭐지…싶었는데 실제로는 가짜 신용카드나 결제 정보를 이용하여 구매를 해킹하는 경우가 많은 듯 합니다.
  • 사용자 구매 정보, 커스텀 리포트 등을 이용하여 잘 운영할 것


전반적으로 이 세션은 개괄적인 구글 플레이의 가이드라인임과 동시에 향후 구글이 준비하거나 진행 중인 서비스/플랫폼에 대한 최신화 유지에 대한 의지를 약간 느낄 수 있었던 듯 합니다.


Session.2: 다시 한번 안드로이드 디자인 가이드라인 - +Chansuk Yang


이번 세션은 구글코리아 Dev Relation의 안드로이드 담당이신 양찬석님의 발표였습니다. 간단하게 정리하자면 구글에서 제공하는 안드로이드 디자인 가이드라인에 따라 앱과 플랫폼의 UX를 일관성있게 가져가자는게 주요 내용입니다. - 사이트에도 있는 내용이라 일부만 텍스트로 정리했습니다. :)

그리고 킷캣 관련 수정 사항에 대한 얘기가 좀 있었는데요. 기본적인 내용은 개발자 블로그를 참고하셔도 될 듯 합니다.

그 외에도 풀스크린 모드가 있었는데 제가 안드로이드 개발을 안해서 2가지 모드가 있는지도 모르고 살았네요. :(


  • Lean Back - 일반적인 비디오 관련 재생과 유사한 풀스크린 처리 모델
  • Immersive - 화면 밖으로부터의 스와이프 인/아웃을 통해 풀스크린 뷰를 제어하여 일반적인 터치에는 메뉴 화면 등으로 전환 등이 반응하지 않는 형태의 뷰입니다. 많이 사용할 것 같은 기능이더군요. 안드로이드 개발자분들은 어떻게 생각하시는지 조금 궁금하네요.


그외에는 안드로이드 디자인에 대한 내용이 있었는데 정리하면 네비게이션과 관련된 UI 및 액션들은 안드로이드 공식 지원 패키지를 사용하여 작업하고 알림(Notification) 바의 각 알림이 중첩될 경우는 하나의 알림에 업데이트하는 것 등에 대한 가이드가 있었습니다. 마지막은 정말 동의!!!! 하는 바이고 웹에서도 그렇습니다!!!! 제발 좀!!!! ;(

또, 반응형 디자인에 대한 얘기가 있었는데 간략하게 정리하자면 만드는게 좋고 이유는 태블릿이나 고해상도 단말에 대한 이슈이기도 합니다. Pitfalls에서도 같은 내용이 있었죠. 웹이라고 예외는 아니니 요즘 시대의 앱이나 서비스는 반응형이던 분리형 뷰를 다루던 디테일한 접근이 필요한 것은 사실입니다.


Session.3: Chrome WebView Essentials - +Alex Danilo 


킷캣에서부터 안드로이드 크롬 웹뷰는 많은 변화가 있었습니다. 가장 중요한 것 중의 하나는 크롬과의 코드 베이스를 공유하게 된 것이죠. 최신 웹 기술의 반영 속도가 이제 중요한 이슈 중의 하나인 것을 반증하는 것이기도 합니다. 다시 정리하면 안드로이드 웹뷰는 크로미움 30 버전의 스냅샷을 각 앱들이 사용하는 것이나 마찬가지이고 Chrome for Android 역시도 코드 베이스는 같습니다. (그렇다고 모든 기능이 똑같이 적용되지는 않습니다. 이쪽도 포팅과 검증은 필요하니까요.)



이미 많이 다뤄진 내용이기도 하고 안드로이드 공식 문서에서도 있던 내용들이라 간략하게만 살펴보자면 HTML5 지원 점수가 284점 > 424점으로 크게! 향상되었고 IndexDB, Web Socket, requestAnimationFrame, SVG Filters and effects, H/W 가속 그래픽스(Canvas 포함)들이 새로 지원되었습니다.

디버깅 인터페이스가 정리되서 웹뷰에서도 데스크탑 크롬의 "chrome://insepct"를 사용해서 원격 디버깅을 할 수 있습니다. 그리고 개발자도구가 완전하게 동작하는 이유는 데스크톱 크롬과 동일한 버전이라는 설명도요. 자세한 내용은 여기를 참조하세요. :)

Hybird Web App에 대한 언급도 있었는데 Look & Feel의 통일을 위해서 네이티브 컨트롤로 앱의 UI를 구성하고 실제 컨텐츠만 웹뷰를 통해서 사용하는 것도 좋은 방법이라는 얘기가 있었습니다. Cordova에서도 그런 시도들이 있었는데 실제로는 자바스크립트와 네이티브 클라이언트 개발이 둘 다 필요해서 팀 단위의 프로젝트에서 적용은 해볼만 할 것 같습니다. (개인적으로도 몇달 전에 그러한 형태로 적용한 프로젝트가 있는데 약간의 시나리오 구상은 필요합니다.)

그리고 모르던 내용이었는데 웹뷰가 하위 호환을 위한 기능을 지원하고 있습니다. - targetSDKVersion이 19 미만일 경우 호환모드로 동작하도록 되어 있다고 합니다.-

UA String이 Chrome 30.0.0.0으로 변경된 것은 알고 계실테고 멀티스레드 관련해서 웹뷰와 인터페이스를 사용할 경우 기본적으로 mainUIThread에서 웹 컨텐츠 연동 기능을 호출하는 것이 시스템의 흐름 상 옳은 방법이지만 멀티스레드가 필요할 경우는 runOnUiThread() 사용하라고 합니다. (이는 웹에서의 자바스크립트 로직이 메인 UI 스레드 상에서 동작하는 이유로도 옳은 방법으로 보입니다.)

커스텀 URL 핸들링은  RFC 3986 기반의 URL Scheme 지원하고 있고 많이들 활용하시니 따로 언급은 필요없을 것 같고 뷰포트 관련하여 target-densitydpi는 지원되지 않고 실제 화면이 작을 때만 줌인으로 동작되며 다중 뷰포트 메타 태그는 지원되지 않는 부분은 주의하셔야 합니다. 메타 태그의 뷰포트 관련한 내용은 한번 정리를 해봐야 할 것 같네요. 아! 그리고 기본 줌 엔진은 deprecated되었습니다

그리고 스타일링 관련하여 변경으로 인한 주의 사항이 좀 있는데 예를 들자면 background 축약 표현(Shorthand)은 긴 표현(Longhand)을 오버라이딩하므로 아래와 같이 사용해야 합니다.

// 'background' will reset 'background-size'
.some-class {
  background-size: contain;
  background: url('images/image.png') no-repeat;
}

// fixed
.some-class {
  background: url('images/image.png') no-repeat;
  background-size: contain;
}


뷰포트 내에서의 CSS에서의 픽셀 단위는 window.outerWidth와 window.outerHeight를 기준으로 동작합니다.

지금까지의 내용을 기준으로 간략하게 3가지의 사례를 보자면 다음과 같습니다.

  • targetSDKVersion
  • <application android:hardwareAccelerated="true">
  • WebView.setWebContentsDebuggingEnabled(true);


향후 계획과 관련하여 WebRTC가 마침내 다음 버전의 크롬 웹뷰에 탑재될 예정이라고 하고, WebGL은 안드로이드의 기존 렌더링 시스템과의 문제 해결을 진행 중이며  그리고 자동 업데이트에 대한 이슈들을 풀기 위해 많은 개발자들이 노력 중이하고 하네요.

개인적인 질의 사항으로 현재 크롬의 경우 CSS3 Animation 및 Transition 엔진이 이미 웹 애니메이션 규격의 네이티브 엔진으로 대체되었는데 이에 대한 Chrome for Android 및 WebView에서의 현재 현황과 계획에 대해 물었습니다.

답변을 정리하자면 아마도 다음 웹뷰에서 Web Animation Engine이 탑재될 것이고 올해 내에는 JS API도 만나볼 수 있지 않을까라고 하네요. 정말 그랬으면 좋겠습니다! :)


Session.4: Increasing user engagement in your apps with YouTube APIs - +Yoshifumi YAMAGUCHI


유튜브가 gData API 이외에도 많은 API를 제공하고 있는데 오늘 세션에서 주로 다뤄진 내용은 유튜브에 비디오를 생성할 수 있는 기능을 포커스하여 발표가 진행되었습니다.

> 유튜브 API를 통해 무엇을 얻을 수 있는가? 바이럴???


'왜 사용해야 하는가?'에 대한 얘기로 세션이 시작되었는데 나온 예 중의 하나를 들자면 90% 이상의 게이머들이 게임 트레일러 영상을 봤다고 합니다. -일주일에 7시간 이상 게임을 플레이하는 13~35세의 게이머를 대상으로 한 조사라서 대략 하드코어 유저군이긴 합니다만 트레일러가 중요한 홍보 수단 중의 하나이니 틀린 말은 아니라고 봅니다.-

> Youtube API


유튜브 API는 구독 위젯, 라이브 스트리밍 API 등으로 구성되어 있고 이 모든 기능을 합치면  YouTube와 기능 상으로는 동치 관계에 가깝다네요. APIs들은 재생과 관련된 Playback API 외에도 Upload, Explore, Live Stream, 채널/비디오, 사용자 동작 및 플레이리스트 등의 오프사이트 API와 채널, 커스텀 리포트, Metric과 관련된 분석 기능들이 제공됩니다.

> 개발자 생태계와 사례


개발자 생태계에 대해서는  정리하자면 어쨌던 사용자의 게임 플레이와 같은 동작에 대해 앱 내에서 직접 레코딩 후 유튜브로 업로드하는 방법을 통해 바이럴 커뮤니티를 만들어 낼 수 있다는 것이 핵심이라고 볼 수 있을 것 같고 github.com/youtube 에서 관련 라이브러리를 확인할 수 있습니다. 물론 OAuth2를 사용하여 인증하는 과정이 필요합니다. 개인적으로는 Builder를 통해 API Interface 객체를 만드는 과정은 맘에 쏙 들었습니다. :)

Elgato, XSplit 같은 제게는 생소한 게임과 서비스로 예제를 들었는데 잠깐 딴짓하느라 자세하게는 못들었습니다. 제가 https://code.google.com/p/youtube-direct-lite/를 기록해두었는데 일단은 샘플 데모입니다만 왜 여기에 적어두었는지 도저히 생각이 안나네요. ;;

> Youtube Streaming API


Youtube Streaming API에 대한 이야기도 있었는데 자세한 내용은 개발자 사이트를 참조하시고 간단하게 다음 3가지의 요소로 구성되어 있는데 Boradcast가 일종의 중계 센터가 되는 개념이고 bind()를 통해 각 Peer가 스트리밍 데이터 연결되며 insert()를 통해 스트리밍 송신 채널 생성할 수 있도록 하는 개념을 가지고 있다고 보시면 되겠습니다.

> 한글 개발자 문서와 질의


아 그리고 얼마전에 YouTube 개발자 센터의 한글 문서가 오픈되었는데 아직 전부가 번역된 것은 아니지만 퀄리티가 좋더군요. 관심있으시면 방문하셔서 한글로 언어 선택을 하고 보시면 되겠습니다.

질의 시간에는 "Make Less With NO Budget"이라는 문구로 혼동이 있어 질의가 갔는데 결론적으로는 "Write Less Do More"와 비슷하게 비디오를 만들어 올리는데는 약간의 노력만 있으면 되고 실제 공유에 관련된 API 사용에 대한 어떠한 비용도 청구되지 않는다는 뜻이라고 합니다. 그리고 개인화된 미디어를 유튜브에 업로드하는 경우에 대한 질의가 있었는데 기본적으로 유튜브가 비디오 공유 서비스이므로 같은 API를 가진 개인화 서비스인 드라이브 API를 추천한다는 것으로 발표가 마무리 되었습니다.


Session.5: 크롬캐스트와 구글 캐스트 - +Mickey Kim+Chansuk Yang 


작년에 크롬캐스트에 대해 많은 관심들이 있었는데 이번에 +Mickey Kim님이 세션에서 이에 대한 소개를 하고 +Chansuk Yang님이 다시 등장해서 개발 환경을 살펴보는 시간을 가졌습니다.  일단 구글 TV는 이제 별도로 사용하지 않고 안드로이드 플랫폼으로 통합 운영되게 되었고 랩탑이나 안드로이드 디바이스로부터 스크린 캐스트가 가능한 서비스 형태로 제공됩니다. Android, iOS, ChromeApps  API가 개발 환경으로 배포된 상태이고 자세한 내용은 개발자 사이트에서 참조할 수 있습니다. 국내 출시 예정에 대한 질의가 있었는데 올해 출시를 목표로 준비 중이라네요. 나머지 질문은 개발자 사이트에서 확인할 수 있는 내용이라 생략합니다. :)

#

마지막 세션은 제가 GDG Seoul에서 발표가 있어서 못듣고 미리 나왔네요. 기념품이 노트북 파우치라는 소식을 전해듣고 땅을 칠 뻔 했지만 대신 커뮤니티에서 즐거운 시간을 가진 하루였습니다. ㅎㅎㅎ

2014년 2월 25일 화요일

[튜토리얼/한글화] WebRTC 데이터채널: 고성능 데이터 교환을 위한 WebRTC 데이터 채널(WebRTC data channels: WebRTC data channels for high performance data exchange)

HTML5Rocks에 +Dan Ristic의 'WebRTC 데이터채널: 고성능 데이터 교환을 위한 WebRTC 데이터 채널(WebRTC data channels: WebRTC data channels for high performance data exchange)' 튜토리얼의 한글 버전이 업데이트되었습니다.

이번 번역은 한순보님께서 수고해주셨습니다. :)

"WebRTC는 종종 화상 회의와 같은 미디어 통신을 위한 규격처럼 인식되는 경우가 있으나 그렇지 않습니다. 화상회의와 같은 것은 WebRTC의 P2P 통신과 mediaCapture()이 결합된 좋은 사례 중 하나일 뿐이죠. WebRTC는 근본적으로 P2P를 기반으로 하는 데이터 전송 메커니즘입니다. 이는 파일 전송뿐만이 아니라 P2P를 기반으로하는 멀티플레이어 게임에도 유용합니다. RTCDataChannel은 파일 공유, 멀티플레이어 게임, 콘텐츠 전송을 위한 앱을 만드는 새로운 방식이며 이를 사용하여 낮은 지연 시간을 가지는 고성능 네트워크 어플리케이션을 제공할 수 있습니다. RTCDataChannel의 출현은 브라우저에서 데이터의 통신 방식 중 많은 부분들을 바꾸게 될 것입니다."


TL;DR;


커뮤니케이션, 게임, 혹은 파일 전송을 위한 두 브라우저 간의 데이터 전송은 상당히 복잡한 과정일 수 있습니다. 우리에게는 WebSocket, AJAX, 그리고 Server Sent Events가 있지만 근본적으로 서버를 통한 통신 모델로 디자인되었습니다. 데이터를 중계(relay)하기 위해 서버를 설정하고 비용을 내야 하며, 아마도 이를 여러 데이터 센터로 확장할 필요가 있습니다. 이 시나리오는 높은 지연 시간(latency)의 가능성이 있고, 데이터를 비공개로 유지하는 것이 어렵습니다.

한 피어(peer)에서 다른 곳으로 직접 데이터를 전달하기 위해 WebRTC의 RTCDataChannel API를 사용하는 것은 P2P(peer-to-peer) 연결을 가능하게 하여 중개 서버가 없고 '홉(hops)'이 적어 지연 시간을 더 줄일 수 있습니다.

> WebRTC DataChannel의 특성


RTCDataChannel API는 웹소켓을 완전히 모방하여 디자인되었을 뿐만 아니라  문자열, Blob, ArrayBuffer 그리고 ArrayBufferView와 같은 일부지만 유용한 자바스크립트 바이너리 타입을 지원합니다. RTCDataChannel은 다음과 같이 UDP와 유사한 '신뢰성 없는 모드'와 TCP과 유사한 '신뢰성 있는 모드' 둘 중 하나로 동작할 수 있습니다.

[출처: +Ilya Grigorik 'High Performance Browser Networking']
신뢰성 있는 방식은 메시지 전송과 메시지가 전달되는 순서를 보장하지만 추가적인 오버헤드가 있으며 신뢰성 없는 방식은 모든 메시지가 상대편에 도달하는지와 어떤 순서로 도달하는지를 보장하지 않는 대신 오버헤드를 제거합니다

시그널링이 일어난 전후에 이미 설정한 피어 연결로부터 dataChannel 오브젝트를 생성하고 옵션을 설정하여 데이터 채널의 신뢰성 등을 설정할 수 있습니다. RTCDataChannel은 연결이 되거나, 끊기거나, 에러가 발생할 때와 다른 피어에서 메시지를 받았을 때 이벤트를 발생하도록 할 수 있습니다.

> 안전성


암호화(Encryption)는 WebRTC 요소의 기본 사항입니다. RTCDataChannel을 사용하면 모든 데이터가 데이터그램 전송 계층 보안 (Datagram Transport Layer Security, DTLS)을 사용하며 WebRTC를 지원하는 모든 브라우저가 DTLS를 내장하고 있으므로 추가적인 구현없이도 안전한 데이터 송수신을 가능하게 합니다.


이 튜토리얼은 WebRTC 데이터 채널을 설정하고 사용하는 기본적인 방법뿐만 아니라 오늘날 웹에서의 일반적인 사용 사례를 다루고 있습니다. 자세한 내용은 튜토리얼은 참조하시기 바랍니다. :)

번역 링크


참조 링크