브라우저의 HTML5 오디오포맷 지원 여부

Posted in 모바일/HTML5 // Posted at 2010. 9. 2. 11:59
728x90

[HTML5] Video & Audio 글에서 HTML5의 비디오, 오디오 지원에 대해 알아 보았다
코덱의 비표준화 문제로 각 브라우저마다 지원되는 포맷이 상이한 문제도 다루었었다
자신의 브라우저가 어떤 오디오 포맷을 지원하는지 테스트 해 볼 수 있는 사이트를 소개한다

xguru 님 트위터에 소개된, 브라우저의 오디오 지원 테스트 페이지!http://textopia.org/androidsoundformats.html

이 사이트에서는 각 오디오 포맷별로 HTML5 의 <audio> 태그를 사용하여 정의해 두었다.
위 주소로 접속하면 현재 브라우저가 어떤 포맷을 지원하는지 시각적으로 확인 할 수 있다

현재 나의 데스크탑에 설치된 4대 브라우저를 테스트 해 봤다. 각 브라우저와 버전은 다음과 같다
1) 크롬, 버전 5.0
2) 사파리, 버전 5.0
3) 파이어폭스, 버전 3.6.8
4) 오페라, 버전 10.61


테스드 대상 오디오 포맷은 다음과 같이 총 7개이다
- ogg, mp3, 3gp, m4a, wav, amr, mp4

4대 브라우저에서 테스트를 해 보니 아래와 같은 결과가 나왔다

크롬

사파리


파이어폭스


오페라

그리고 아이폰 3 사파리로 테스트한 결과, 데스크탑 사파리와 동일한 결과가 나왔다



정리 해 보면, 각 브라우저 별로 지원되는 오디오 포맷은 다음과 같다
크롬: ogg, mp3, m4a, mp4
사파리: mp3, 3gp, m4a, wav, amr, mp4(아이폰 3GS, 모바일 사파리 동일)
파이어폭스: ogg, wav
오페라: ogg, wav

'모바일 > HTML5' 카테고리의 다른 글

[HTML5] Cross Document Messaging  (3) 2010.09.03
HTML5 템플릿 제공 사이트 소개  (0) 2010.09.03
[HTML5] Server-Sent Events  (4) 2010.08.31
[HTML5] Notifications (알림)  (2) 2010.08.30
[HTML5] 웹 양식(Web Form)의 개선, 폼 태그  (4) 2010.08.26

[HTML5] Server-Sent Events

Posted in 모바일/HTML5 // Posted at 2010. 8. 31. 16:54
728x90
웹에서 서버 푸시(Sever Push) 구현
그 동안 웹에서 서버 푸시(Server Push) 구현을 위해 얼마나 많은(?) 노력이 있어 왔던가?

서버 푸시란 서버에서 클라이언트로 데이터를 (능동적으로) 전송해 주는 통신 방식 즉 통신의 방향과 관계되는 용어이다. 즉 서버 푸시란 데이터 전송 방향이 '서버 -> 클라이언트' 가 되는 것이다

이와 반대되는 개념을 클라이언트 폴링(Polling) 방식이라 한다
클라이언트 폴링은 클라이언트에서 서버로 질의를 하고 서버는 이에 응답만 하는 구조이다
폴링의 데이터 전송 방향은 '클라이언트 -> 서버' 가 된다

TCPIP 한 계층위에 존재하는 HTTP 프로토콜에 기반한 웹 통신은 비연결 지향적 성격을 가지고 있다.
클라이언트는 서버로 요청(Request)을 하고 서버는 이에 응답(Response)을 하고 이후 연결은 닫힌다

물론 HTTP 1.1 부터는 KeepAlive 라는 개념이 추가되어 HTTP 연결을 일정 시간 이상 유지하도록 하는 매커니즘이 추가되었다. 그러나 이것은 매번 새로운 연결(Connection)에 따른 오버헤드를 줄이기 위한 목적이지 소켓 통신과 같은 완전한 연결 유지, 상태유지, 양방향 통신을 위한 것은 아니다
HTTP 연결유지와 관련해서는 다음의 글을 참고하자
[HTTP 프로토콜] Stateless
[HTTP 프로토콜] 연결 유지가 능사인가?

응용 프로그램에서 서버푸시 방식이 필요한 경우가 매우 많다.
가장 이해하기 쉬운 예가 채팅 서비스 이다.
채팅은 서버와 클라이언트가 실시간으로 그리고 지속적으로 데이터를 주고 받아야 한다. 자신의 메시지를 즉시 서버로 전송해야 하며 서버는 이 메시지를 다른 사람에게 바로 전달해야 한다. 즉 서버가 채팅 메시지들를 중계하여 각각의 사용자(클라이언트)들에게 실시간으로 데이터를 뿌려 주는 구조 즉 서버푸시 구조의 대표적인 사례라 하겠다

웹에서도 이러한 서버 푸시의 요구사항은 늘 있어 왔다.
그러나 통신 구조의 한계로 인해 직접적인 서버푸시 구현은 힘들며 대안으로써의 여러 기법이 이용되어 왔다

웹이 서버푸시를 위해 선택한 여러 대안들
순수 웹 기술로는 서버푸시를 구현한다는 것은 현재까지도 불가능 한 것이 사실이다

이전 세이클럽과 같은 웹 사이트에서 제공하는 채팅 서비스는 순수 웹 기술로 구현된 것이 아니라
자바 애플릿과 같은 플로그인 기술로 구현된 것이다. 플러그 인 기술은 추가 실행 엔진을
설치해야 하며 구동되는 환경은 웹이 아니라 별도의 런타임이기에 소켓통신이 가능하다
결국 세이클럽의 채팅은 HTTP가 아니라 소켓 통신을 이용한 서비스 인 것이다


이처럼 지금까지 가장 많이 사용된 대안은 웹 플러그 인 기술을 사용하는 것이었다

플러그 인을 사용하지 않고 서버푸시를 흉내내기 위해서는 앞서 설명한 폴링(Polling) 기법이 이용되었다.숨긴 frame, iframe 을 이용하거나 Ajax 등을 이용하여 주기적으로 매번 서버로 질의를 하는 형태이다

그러나 이와같은 방식은 가장 큰 문제점은 구현이 깔끔하지 못하다는 것과 대역폭의 낭비가 심하다는 것이다. 서버에서 전달할 데이터가 있건 없건 클라이언트는 계속 질의해 보는 수 밖에 없다

서버 푸시는 전달할 데이터가 있을 때에만 클라이언트로 전송하면 되지만,폴링은 서버의 상태를 알지 못하니 계속 호출해 볼 수 밖에 없는 것이다.
그러나 순수 웹 기술로는 서버푸시를 구현할 수 없기에 폴링 방식을 이용해서 푸시 효과를 흉내 낼 수 밖에 없는 것이다

마지막으로 순수 웹 기술로 서버 푸시 효과를 구현하는 비교적 최적의 기술인 Comet 이 있다
Comet는 요청에 대한 연결을 응답시 까지 유지시켜 웹에서의 서버푸시를 효과적으로 구현하기 위한 기술을 일컫는데 사실 나도 Comet 를 실제로 다루어 보지는 않아서 딱히 구체적으로 언급할 것은 없다
다만 Comet이 서버 푸시를 구현하는 통신 구조와 Server-Sent Events가 이것을 표준화 한 하나의 형태라는 것은 알고 넘어가자. 참고로
위키사전과 HTML& API 입문 서적에 정의한 Comet를 옮겨 본다
위키사전>
In web development, Comet is a neologism to describe a web application model in which a long-held HTTP request allows a web server to push data to a browser, without the browser explicitly requesting it

HTML&API 입문>
Comet은 HTTP에서 의사푸시를 구현하는 기술입니다. 클라이언트로부터의 요청에 대해 서버는 응답이 완료되었음을 알려주지 않고 연결을 유지하므로 계속 클라이언트에게 응답을 보낼 수 있습니다
그러나 서버 자원과 대역폭을 효율적으로 사용하려면 서버는 일정 간격마다 응답을 완료하고, 클라이언트는 재접속할 필요가 있습니다.(이 때문에 Comet를 Long-polling이라 부리기도 합니다)


Long-polling 과 기존 polling 의 통신 구조 차이를 다음 그림으로 이해하자



웹에서 서버 푸시를 위한 HTML5의 표준안: Sever-Sent Events
HTML5 의 Server-Sent Events(SSE) 스펙은 웹 환경에서 서버푸시를 구현하기 위해 제안된 
표준 기술이다. 앞서 설명한 의사서버푸시기술인 Comet 을 표준화한 기술이라고도 한다

Java.net 에서 소개하는 Server-Sent Events 설명을 보면 더욱 명확하다

HTML5 also applies the Comet communication pattern by defining Server-Sent Events (SSE), in effect standardizing Comet for all standards-compliant web browsers - java.net

Server-Sent Events 는 서버 푸시를 구현을 위한 심플한 자료구조와 인터페이스, 통신 매커니즘을 정의하고 있으며 일반적인 DOM 이벤트 형태로 수신 데이터를 처리 할 수 있는 등 서버푸시 구현이 매우 간단해 진다

Server-Sent Events 가 완전한 서버푸시?
SSE를 더 알아보기 전에 한가지 집고 넘어가고자 한다
SSE가 완전한 서버푸시인가? 즉 SSE가 소켓통신과 같이 서버->클라이언트로의 능동적인 통신 방식인가? 하는 문제이다. 답은 그렇지 않다

SSE 역시 (이전 다른 대안들처럼) 서버푸시 효과를 내기 위한 기술이다
SSE는 (폴링과 유사하게) 클라이언트에서 서버로 반복적으로 질의를 하는 방식 즉 '클라이언트 -> 서버' 로의 통신 방향이며 소켓통신과 같은 완전히 능동적인 서버푸시 기술은 아니라는 점이다

그렇다고 SSE를 무시할 수는 없다
일단 SSE는 웹 서버푸시를 구현을 위해 귀결되는 표준 기술로 자리매김 할 것이며 간단하고 명료한
프로그래밍 모델과 API 그리고 효과적인 통신을 위한 데이터 포맷 지원 등 여러 장점을 제공 해 준다


브라우저 지원 현황

HTML5 Server-Sent Events 를 지원하는 브라우저 현황을 살펴 보자


그림1. 브라우저별 Server-Sent Events 지원 현황 (출처: http://caniuse.com/)

위 표를 보면 사파리, 크롬 그리고 부분적으로 오페라가 지원한다고 나와있다
그러나 실제 테스트를 해 보면 사파리 에서만 정상 동작한다(아이폰 사파리 포함)

오페라 브라우저의 경우 위 표 하단의 설명처럼 과거 스펙을 지원한다고 나와있다
현재의 SSE 스펙은 정상 동작하지 않는 것을 확인하였다. 오페라에서 과거 스펙의 SSE를 구현하는 예는 다음의 글에서 확인할 수 있다 -> Event Streaming to Web Browsers

Server-Sent Events 다루기

이제부터 SSE를 실제로 다루기 위한 기본적인 개념들을 알아 보도록 하자

EventSource
EevnetSource 객체는 SSE 구현을 위한 핵심 객체이다
이 객체를 통해 자동으로 서버 요청이 주기적으로 일어나며 데이터 수신 이벤트를 정의할 수 있다
즉 EventSource는 서버 요청을 위한 출발점이며 또한 데이터 수신을 위해 정의되는 일종의 EndPoint 라고도 할 수 있다. EventSource 는 요청 대상이 되는 서버 URL을 매개변수로 취하며 객체가 생성되는 순간 이벤트 스트림이 열리게 된다


다음 코드처럼 EventSource 객체를 생성하는 것만으로 주기적인 서버 호출이 일어난다 
var eventSource = new EventSource("server.asp");


데이터 수신 이벤트
서버로 부터 전달받는 데이터를 처리하기 위해 수신 이벤트를 정의한다
이 이벤트 역시 EventSource 객체를 통해 정의하면 된다

다음에 알아볼 서버 데이터 포맷에 특별한 이벤트 이름이 지정되지 않은 경우 기본 값인 message 이벤트로 처리하며 된다. 다음 코드는 EventSource 객체에 message 이벤트를 정의한 것이다
이벤트로 전달되는 data 속성으로 수신 데이터를 액세스 할 수 있다
eventSource.addEventListener("message",
    function(e){          
      alert(e.data);
    }
,false);


서버 데이터 포맷과 규칙
서버측에서 클라이언트로 전달하는 데이터는 일반적인 텍스트 형태이지만 그 포맷이 정해져 있으며 몇 가지 규칙을 따라야 한다

- MIME 타입: 서버 데이터는 text/event-stream 라는 MIME 타입으로 제공되어야 한다
- 문자 인코딩: 서버 데이터의 문자 인코딩은 UTF-8 형식이어야 한다

- 빈줄은 이벤트를 구분하는 역할을 한다
- 주석은 :(콜론)으로 시작한다

- 데이터는 '필드 명: 필드 값' 형식이어야 한다(콜론과 필드 값 사이에 공백 하나를 포함할 수 있다)
  필드 설명> 필드 명에 해당하는 필드 설명을 보자
   data : 서버가 전달할 실제 데이터를 정의한다
   retry: 반복 주기를 설정한다(단위: millisecond)
   event: 이벤트 이름을 지정한다(지정하지 않으면 기본값인 message 가 된다)
   id: 이벤트 id를 지정한다. 클라이언트에서 마지막 이벤트 번호를 저장하기 위해 사용된다

다음은 서버 데이터를 규칙에 맞게 구성한 하나의 예이다. 2초의 반복주기를 가지도록 하며 두 개의 이벤트를 정의하고 있다. 그리고 하나의 이벤트에는 각각 두개의 데이터를 정의하고 있다
retry: 2000

event: firstEvent
data: 이벤트1,데이터1
data: 이벤트1,데이터2

event: secondEvent
data: 이벤트2,데이터1
data: 이벤트2,데이터2
 
실제 환경에서는 데이터가 동적으로 변화하기 마련인데 asp.net 이나 asp,php 등으로 데이터를 적절히 구성하면 된다. 다만 서버데이터 포맷과 규칙을 지키기만 하면 된다

반복 주기
요청을 반복하는 주기는 서버 데이터 포맷에 정의된 retry 시간을 기준으로 한다
retry 2000 이면 2초마다 반복 호출하게 된다
단 서버 데이터 포맷에 retry 정의가 없다면 브라우저 기본 값을 따른다
데스크탑 사파리의 경우 기본 값이 3초이다

개인적으로 가장 특이하고 효과적으로 보이는 것이 바로 이 retry 부분이다
주기적인 호출을 위한 반복 시간을 클라이언트가 아닌 서버에서 지정한다는 것이 매우 고무적이다
이는 서버입장에서 반복 시간을 컨트롤 할 수 있다는 의미이며 기존 폴링 방식에 비해 통신 구조를 보다 효과적으로 설계할 수 있다는 장점을 가져다 준다


Server-Sent Events 데모 만들어 보기
이제 실제 Server-Sent Events 를 이용한 서버푸시 데모를 제작해 보자

서버 데이터 준비
먼저 클라이언트가 수신하게 될 서버 데이터를 규칙에 맞도록 정의한다
서버 데이터를 반환하는 것은 asp,php,asp.net, cgi 등 어떤 것이든 규칙에만 맞으면 된다
이 데모에서는 ASP 기술을 이용하여 server.asp 를 다음과 같이 정의한다
2초 반복 주기와 두개의 이벤트, 한 이벤트에 각각 두개의 데이터를 정의했다
<% Response.ContentType = "text/event-stream" %>
retry: 2000

data: 이벤트1,데이터1
data: 이벤트1,데이터2

data: 이벤트2,데이터1
data: 이벤트2,데이터2

클라이언트 구현
서버 데이터를 수신할 클라이언트를 정의한다
EventSource 객체를 통해 송,수신을 처리하며 기본이름은 message 이벤트로 수신데이터를 처리한다
<!DOCTYPE html>
<html>
<head></head>
<body>
  <button onclick="start();">Start</button>
  <div id="message"></div>   
</body>
</html>
<script type="text/javascript">  
function start(){
  var eventSource = new EventSource("http://mkexdev.net/test/server.asp");      

  eventSource.addEventListener("message",
    function(e){
      var data = e.data.split("\n");
      var one = data[0];
      var two = data[1];
     
      document.getElementById("message").innerHTML += one + two + "<br>";
    }
  ,false);
}
</script>


실행화면
아래 그림은 데스크탑 사파리에서 데모를 실행한 화면이다
한번 호출에 총 두개의 이벤트 데이터가 표시되며 2초 간격으로 반복 호출 된다
아래 그림은 6초 동안 총 3번 server.asp를 호출한 것이며 총 6개의 데이터가 출력된 모습이다
(사파리)


참고> 이벤트 명을 명시하여 클라이언트가 지정 이벤트만을 수신하도록 할 수 있다
앞의 데모에서는 이벤트명을 지정하지 않아 기본값인 message 이벤트를 처리하여 전체 데이터를 수신하도록 하였지만 이벤트 명을 지정하게 되면 클라이언트에서는 특정 이벤트 데이터만 수신할 수 있다

- server.asp
<% Response.ContentType = "text/event-stream" %>
retry: 2000

event
: firstEvent

data: 이벤트1,데이터1
data: 이벤트1,데이터2

event: secondEvent
data: 이벤트2,데이터1
data: 이벤트2,데이터2


- 클라이언트 코드(명시적으로 특정 이벤트명일 지정하여 이벤트 수신합)
function start(){
  var eventSource = new EventSource("http://mkexdev.net/test/server.asp");     
  eventSource.addEventListener("secondEvent",
    function(e){
      var data = e.data.split("\n");
      var one = data[0];
      var two = data[1];
     
      document.getElementById("message").innerHTML += one + two + "<br>";
    }
  ,false);
}

- 실행화면
실행을 해 보면 secondEvent로 정의된 이벤트 데이터만 표시되는 것을 확인할 수 있다


다만 이렇게 특정 이벤트만을 명시적으로 지정하여 수신하더라도 서버데이터는 일부가 아닌 전체가 다운로드 된다. 즉 서버데이터는 모두 가져온 후 클라이언트에서 특정 이벤트만 필터하는 것이다
아래 그림은 이 시나리오에서 Fiddler 로 응답 데이터를 캡쳐한 화면이다




참고 자료>
http://dev.w3.org/html5/eventsource/
http://today.java.net/article/2010/03/31/html5-server-push-technologies-part-1

[HTML5] Notifications (알림)

Posted in 모바일/HTML5 // Posted at 2010. 8. 30. 17:57
728x90
데스크탑 알림 창
응용프로그램에서 알림창은 (응용프로그램) 자신의 상태나 변화를 실시간으로 알려주기 위한 장치이다
대표적인 예로 메신저에서 메시지 수신이나 친구 로그인 등의 알려주는 것을 들 수 있다


이러한 알림창은 응용프로그램이 비활성화 되어 있더라도,
사용자에게 중요한 정보를 시각적으로 즉시 알려 주기 위한 유용한 장치이다

HTML5 의 Notifications 은 웹 페이지에서도 이와 같은 데스크탑 알림창을 구현하기 위한 스펙이다

기존 윈도우 응용프로그램의 알림창과 같이, 데스크탑 화면 우측 하단에 작업표시줄 근처에 풍선말 형태로 출력된다. 즉 웹 페이지 범위를 벗어난 영역에 알림창이 표시되며 웹 페이지가 최소화 되어 있거나 비활성화 되어 있어도 상관없이 알림창은 동작한다

아래 화면은 Notifiactions 로 띄운 알림창을 구글 크롬에서 실행한 화면이다
(크롬)


지원되는 브라우저

현재 Notifications 는 Draft 상태로 HTML5 정식 스펙에 포함되지는 않은 듯 하다
구글이 제시한 스펙으로써 지원되는 브라우저 역시 구글 크롬에 한정되어 있다

따라서 현재 시점에 이 기술을 실 서비스에 접목시키기는 어려울 수 있으나 이 글에서는 간단한 사용법 정도를 숙지하는 것으로 하겠다

다시 말하지만, Notifactions 는 현재 구글 크롬 브라우저만 지원되고 있다


if(!!window.webkitNotifications) {
     alert("현재 브라우저는 Notifications를 지원합니다")
}
else{
      alert("현재 브라우저는Notifications를 지원하지 않습니다")
}


Notifications 이 자동알림의 전부는 아니다
간혹 HTML5의 Notifications 에 대한 오해가 있는 듯 하여 집고 넘어가고자 한다
Notification 이 알림창을 띄우는 것이다 보니 이 자체가 자동 알림을 구현하는 전부인 듯 오해를 하기 쉽다. 물론 이 기술이 응용되는 궁극적인 모습은 자동 알림인 것은 사실이지만, Notifications 만으로 자동알림을 구현할 수는 없다는 것을 말하고 싶다

이는 마치 오프라인 웹 응용프로그램 구현이 어플리케이션 캐시와 밀접하게 연관되어 있지만
Web Storage 나 Web SQL Database와 같은 로컬 저장소 기술과 접목해야한 제대로 된 오프라인 웹 응용프로그램이 될 수 있는 개념과 유사하다

다시 말해 웹 서비스에 있어, 알림 대상이 되는 내용 및 이벤트의 대부분은 웹 서버측에서 내려주는 시나리오가 많으며 이럴 경우 Ajax 를 통한 반복적인 비동기 폴링(polling)이나 HTML5의 새로운 스펙인 Server-Sent Events 와 같은 기술이 접목될 때 비로써 제대로 된 자동알림 구현이 가능하다는 것이다

물론 클라이언트의 데이터, 이벤트만을 기준으로 알림창을 띄우는 것이라면 Notifications와 적절한 스크립트의 조합만으로 가능하겠지만 대부분의 시나리오에서는 알림 대상이 되는 이벤트는 서버를 기준으로 발생하기 마련이다

따라서 'Notifications + 적절한 반복 스크립트 + 서버이벤트 감지' 기술 이 복합적으로 구현될 때 자동 알림이 완성된다고 할 수 있겠다


Notifications 다루기
그럼 지금부터 Notifications 의 기술적 구현을 간단히 살펴보자
Notifications 로 데스크탑 알림을 구현할 경우 다음의 절차를 따르는 것이 좋다

Notificatins API 지원 여부 확인 -> 사용자 승인 여부 확인 -> Notificatins 인스턴스 생성

Notificatins API 지원 여부 확인 
이 부분은 앞서 '브라우저 지원 현황' 에서 알아 본 것이다
window 전역 객체에 webkitNotifications 객체가 존재한다면 해당 브라우저는 Notificatins API를 지원 하고 있는 것이다

사용자 승인 여부 확인
사용자가 브라우저를 통해 웹 사이트를 볼 때 성가시거나(?) 보안에 위험이 있는 요소들은 사용자 승인과정을 따르게 되어 있다. 예를 들어 쿠키(Cookie)나 팝업 창의 경우 사용자가 활성화 여부를 결정할 수 있으며 HTML5 에서는 위치 정보 확인(Geolocation)과 같은 개인 정보 취득시 사용자 승인을 받도록 되어 있다. Notifications 역시 알림창을 띄울 것인지에 대한 사용자 승인 과정이 필요하다

이는 webkitNotifications 객체의 checkPermission() 함수로 확인 가능하다
이 함수의 반환 값은 0,1,2 중 하나인데 다음과 같다
0: 승인 됨, PERMISSION_ALLOWED
1: 승인 하지 않음, 승인 전, unknown, PERMISSION_NOT_ALLOWED
2: 거부 됨, PERMISSION_DENIED

Notificatins 인스턴스 생성
브라우저 지원 여부와 사용자 승인 여부의 확인 이후,
실제로 데스크탑 알림창을 띄우기 위해 Notificatins 인스턴스 생성해야 한다

Notificatins 인스턴스는 두 가지 버전으로 생성이 가능하다
createNotification(in DOMString iconUrl, in DOMString title, in DOMString body);
: 일반 텍스트 형식의 알림 창. 알림 창에 표현될 아이콘, 제목, 내용을 설정한다

createHTMLNotification(in DOMString url)
: HTML 형식의 알림 창. 알림 창에 표현될 유효한 웹 주소를 설정한다


Notifications 이벤트
Notifications 에는 알림창과 관련한 몇 가지 이벤트를 제공하고 있다
이 이벤트들을 이용하면 알림창이 표시될 때, 닫힐 때 특정 로직을 수행할 수 있다
Display 이벤트
: 알림창에 표시될 때 발생한다
  notification.ondisplay = function() { setTimeout(notification.cancel(), 15000); }

Close 이벤트
: 알림창에 닫힐 때 발생한다
  notification.onclose = function() { cancelReminders(event); }

Error 이벤트
 : 알림창과 관련한 오류가 있을 시 발생한다
   notification.onerror =function(e){ alert('error')};


Notifications 데모
Notifications 구현 절차에 따른 간단한 데모를 제작해 보자
두 가지 버전의 Notificatins 인스턴스를 생성하여 알림창을 동시에 띄우는 예제이다
그리고 브라우저 지원 여부와 사용자 승인 여부를 확인하고 알림 창을 띄우고 있다

<!DOCTYPE html>
<html>
<head></head>
<body>
  <button onclick="showNotification();">알림실행</button>
</body>
</html>
<script type="text/javascript">   
function showNotification(){
  if(!!window.webkitNotifications) { //브라우저 지원현황 확인하기
    if(window.webkitNotifications.checkPermission() == 0 ){ //사용자 승인 여부 확인하기 
      var picture = 'http://mkexdev.net/img/mkex.jpg';
      var titleStr = 'MKEX의 HTML5';
      var bodyStr = 'HTML5 Notification 데모입니다';     
      var noti1 = window.webkitNotifications.createNotification(picture, titleStr, bodyStr);
      var noti2 = window.webkitNotifications.createHTMLNotification("http://m.mkexdev.net");
      noti1.show();
      noti2.show();     
    }
    else{
     requestPermission(showNotification);
   }   
  }
  else{
    alert("현재 브라우저는Notifications를 지원하지 않습니다");
  }
}
function requestPermission (callback) {
  window.webkitNotifications.requestPermission(callback);
}
</script>



데모를 실행하면 최초 알림을 활성화 할지를 묻는 사용자 승인과정을 거친다
(이 데모는 mkexdev.net 도메인에서 서비스 되도록 하였다. 아래 승인에 해당 도메인에 대한 알림 승인 여부를 묻고 있다)


사용자가 승인하면 아래와 같이 데스크탑 우측 하단, 작업 표시줄 영역에 알림 창이 두개 생성된다
(구글 크롬)


참고: 한번에 표시되는 알림창의 갯수
데모에서 '알림실행' 버턴을 계속 클릭하면 그 만큼 알림창이 생성된다
그러나 한정된 화면을 가진 데스크탑에서 이것을 다, 한번에 표현하기는 힘들다

크롬 브라우저에서는 최대 5개까지 알림창을 동시에 띄우며 6개부터는 큐에 보관하여
다른 알림창에 숨겨졌을 때 하나씩 표시된다


참고: 트위터 최신 글 알림창
HTML5 Notifications 를 소개하는 외국 블로그를 보면 대부분 관련 데모로 트위터 최신글에 대한 알림창을 구현하고 있다.

트위터는 오픈API를 제공해 외부 개발자가 트위터 대부분의 기능을 사용할 수 있도록 하고 있다
데모에서는 트윝의 오픈 API를 이용해 Notifications 와 연동하는 구조이다

데모 URL: http://html5.firejune.com/demo/notification.html

소스의 핵심 부분을 잠깐 살펴 보자
function readTweets() {
  var username = document.getElementById('username').value;
  if (username == 'username') {
    alert('Enter a username first');
    return;
  }
  var script = document.createElement("script");
  script.src = 'http://twitter.com/statuses/user_timeline/'+ username+'.json?
                   count=1&callback=fetchTweets';
  document.body.appendChild(script);

}
function fetchTweets(data) {
  var tweet;
  var i = data.length;
  while (i--) {
    tweet = data[i];
    if (window.webkitNotifications.checkPermission() == 0) {      
      window.webkitNotifications.createNotification(tweet.user.profile_image_url,
                                                                      tweet.user.name, tweet.text).show();
    } else {      
      alert('You have to click on "Set notification permissions for this page" first to be able to
               receive notifications.');
      return;         
    }
  }
}

트위터에 특정 계정에 대한 최신 글을 불러오는 오픈 API를 다음과 같이 호출하고 있다
(사용자 계정 mkex , 글 수 1, 수신 콜백 함수 fetchTweets 지정)
script.src = 'http://twitter.com/statuses/user_timeline/mkex.json?count=1&callback=fetchTweets'; 

이렇게 호출하면 트위터 오픈 API는 JOSN 포맷의 데이터를 반환한다. 대략 다음과 같은 구조이다
[{"in_reply_to_screen_name":null,
 ....
"created_at":"Mon Aug 30 06:26:11 +0000 2010",
 ....
"source":"web","place":null,"contributors":null,
"geo":null,"retweeted":false,"coordinates":null,
"user":{
  "statuses_count":35,"profile_sidebar_border_color":"87bc44",
  "description":"Programmer ","screen_name":"mkex",
  ......  "profile_image_url":"http://a0.twimg.com/profile_images/1037935868/mkex_naver.com_9652dc86_normal.bmp",
  "id":161155360,"listed_count":6,"utc_offset":null,"followers_count":30,
  "url":"http://mkexdev.net"
  },
  "favorited":false,"id":22502412596,
  "text":"HTML5 \ub3d9\uc601\uc0c1 \ud45..... ....4\ub8cc\ub85c \uc804\ud658\u2026\uc65c? http://is.gd/eJgps"
}]


그리고 Notifications를 이용해 트위터 내용을 알림 창에 표시하고 있다
트위터 오픈API가 반환한 JSON 구조에서 프로필이미지와 이름, 글 내용을 알림창에 표시한다
window.webkitNotifications.createNotification(tweet.user.profile_image_url,tweet.user.name, tweet.text).show(); 


참고 자료>
http://dev.w3.org/2006/webapi/WebNotifications/publish/#requirements
http://html5.firejune.com/doc.html#notification
http://www.chromium.org/developers/design-documents/desktop-notifications/api-specification
http://www.html5rocks.com/tutorials/notifications/quick/

[HTML5] 웹 양식(Web Form)의 개선, 폼 태그

Posted in 모바일/HTML5 // Posted at 2010. 8. 26. 17:31
728x90

웹 양식(Web Form)의 개선
웹 양식을 지원하는 태그를 폼 태그(Form Tag)라 한다
보통 회원가입이나 게시판 글쓰기 같은 UI를 만들 때 사용되는 태그로
input 박스, select 박스, button, checkbox , radio 버턴 등이 있다

이러한 폼 태그는 HTML 문서에서 사용자 입력을 위해 제공되는 양식 태그이다
물론 폼 태그는 HTML5 이전에도 제공되어 왔다. 다만, HTML5 에서는 기존 폼 태그와 더불어 대폭 개선된 형태를 새로 추가하였다

기존 폼 태그는 텍스트, 버턴, 선택박스, 체크박스 등 단순한 형태의 입력 양식만을 제공했지만 HTML5에서는 달력양식, Range 양식, email 등 새롭고 실용적인 양식이 추가 되었으며 입력 보조 수단이나 입력 값 검증 등 기존에는 스크립트에 의존할 수 밖에 없었던 기능적 요소도 폼 태그에 추가 되었다
이러한 향상된 웹 폼을 Web Forms 2.0 이라 한다


이러한 다양하고 실용적인 양식 태그들이 추가됨으로써 좀더 쉽고 빠르게 개발을 할 수 있게 된 것이다

브라우저 지원 현황

아직까지 대부분의 브라우저에서는 모든 폼 태그를 지원하지는 않는 것 같다
각 브라우저가 폼 태그의 부분적인 것을 지원하며 그 부분적인 것은 브라우저마다 조금씩 상이하다
예를 들어 range input 요소의 경우 크롬에서는 지원되지만 파이어폭스에서는 지원되지 않는다

일단 caniuse.com 에서 제공하는 지원표를 보도록 하자



그림1. 브라우저별 새 폼 태그 지원 현황 (출처: http://caniuse.com/)

위의 표에서도 알 수 있듯이 대부분의 브라우저가 부분적으로 새 폼 태그를 지원하고 있다
다만 오페라는 모두 지원한다고 나와 있는데 확인해 볼 일이다

현재 시점에 브라우저 지원현황은 부분적이며 일관적이지도 않아 만족스럽지 못하기는 하다
(브라우저 호환성을 확보하기 힘드니 실 서비스 적용이 꺼려지는 것이다)
그러나 머지 않은 시기에  모든 요소가 지원되지 않을까 하고 기대 해 본다

Google's WebForms2 라이브러리
http://code.google.com/p/webforms2/

HTML5 의 Canvas를 지원하지 않는 IE8 이전 버전을 위해
ExplorerCanvas(http://code.google.com/p/explorercanvas/) 라이브러리가 제공되듯이
HTML5 확장 폼을 지원하지 않는 브라우저의 경우 WebForm2 라이브러리를 사용할만 하다

라이브러리를 다운받고 아래와 같이 라이브러리를 참조한다
<script type='text/javascript' src='webforms2.js'></script>

WebForms2 라이브러리는 HTML 폼 확장에 대해 각 브라우저마다 다르게 동작하는 문제점을 극복하기 위해 제공되며 Cross Broswer HTML5 Form 구현을 가능하도록 해 준다.
이와 관련한 다음의 글을 참고해 보기 바란다
http://nz.pe.kr/wordpress/programming/html5/번역-지금-바로-cross-browser-html5-form-만드는-방법


웹 양식 다루기
그럼 이제 HTML5 에서 추가되거나 개선된 웹 양식을 하나 씩 살펴보자
참고로 브라우저마다 웹 양식의 지원 범위가 다르기 때문에 각 요소를 설명할 때 지원되는 브라우저를 각각 달리하여 테스트 할 것이다(예제 실행 화면 옆에 브라우저를 명시한다)

새로운 입력 양식(새로 추가된 i
nput 타입)
input 태그에 다양한 타입이 새로 추가되었다.
기존에 제공되었던 text, button,checkbox 등은 여전히 유효하며 다음과 같은 양식이 추가되었다

1) range
일정한 범위의 숫자를 입력 받기 위한 양식이다
min, max 속성에 범위의 최소, 최대값을 지정하고 step 으로 범위 이동 크기를 지정한다
아래 예는 0 ~ 10 까지의 범위를 가지는 2칸식 이동 가능한 Range 컨트롤이다(기본값은 2)

<input type="range" min=0 max=10 step=2 value=2>

(크롬)

2) number
숫자를 입력 받기 위한 양식이다
range 양식과 마찬가지로 min, max, step 속성을 가진다

<input type="number" min=1 max=10 step=1 value=5>

(오페라)

3) date
날짜를 입력 받기 위한 양식이다. 날짜 선택을 위한 달력이 표시된다
역시 min, max, step 속성이 제공된다

<input type="date" min="2001-01-01" max="2010-08-31" step=1 value="2010-08-26">

(오페라)

날짜와 시간관련 양식은 data 외에데 몇 가지가 더 있다. 다음을 참고하자

<input type="datetime"><input type="datetime-local"><input type="month">
<input type="week"><input type="time">




4) 기타 새로운 타입들
검색을 위한 search 타입, 전화번호 입력을 위한 tel 타입, 리소스 주소 입력을 위한 url 타입, 이메일 입력을 위한 email 타입, 색상 입력을 위한 color 타입 등이 새로 추가되었다
현재 데스크탑 브라우저들에서는 이들 타입이 지원되지 않거나 평범한 text 타입처럼 보이기 때문에
설명으로만 대체하겠다

다만 특이한 점은 이러한 타입이 아이폰과 같은 모바일 기기에서는 해당 타입에 맞춰 UI가 다르게 보이기도 한다. 아래 글을 참고 바란다

iPhone의 모바일 Safari 브라우저에서는 이러한 새 유형을 일부 사용하여 사용자에게 표시되는 키보드 유형을 변경한다. 예를 들면, 이메일 유형과 함께 @ 기호와 .com 단축 아이콘이 표시된다. 또한, Opera에서는 숫자 유형을 선택할 수 있는 스피너와 날짜 관련 유형을 선택할 수 있는 날짜 선택도구와 같은 다양한 제어를 구현하는 데 필요한 새로운 위젯을 일부 제공한다
- IBM Developer Works HTML5 컬럼 중... -

참고: 새로운 입력(input) 양식에 대한 다음 글을 참고하기 바란다
http://www.w3schools.com/html5/html5_form_input_types.asp

개선된 폼 양식
새로운 양식의 추가는 물론이고 기존 양식의 기능적 요소들도 상당 부분 개선되었다
 
1) 입력 보조 수단
새로운 양식의 추가 이외에도 자동 포커싱이나 PlaceHolder 와 같은 입력 보조 수단도 제공된다
자동 포커싱은 페이지가 로딩될 때 특정 양식으로 포커스를 주는 것이며 PlaceHolder은 텍스트기반 입력양식이 비어있을 경우 표시하는 텍스트를 지정할 수 있도록 한다
중요한 것은 이전 환경에서 이들 기능을 구현하려면 자바스크립트에 의존했어야 했지만 HTML5는 양식태그의 속성만으로 해결해 준다

<input type='search' autofocus>
<input type='email' placeholder="이메일 주소 입력">
<input type='tel' placeholder="전화번호 입력">

 

(크롬)


2) 파일 선택 양식의 개선
웹 페이지에서 서버로 파일을 업로드 하기 위해서 사용되던 것이 파일 input 박스이다
이는 이전에도 제공되는 것이지만 HTML5 에서는 기능적으로 보다 개선되었다

- 다중 파일 업로드(multiple 속성)
HTML5 이전 환경에서는 하나의 파일 박스에는 하나의 파일만 선택 가능했었다
다중 파일을 업로드 하기 위해서는 여러개의 파일박스를 두거나 서드파티업체의 제품을 이용했어야 했다. 그러나 HTML5 에서는 하나의 파일박스에 여러개의 파일을 지정할 수 있도록 개선되었다

<input type='file' multiple>

- 파일 필터링(accept 속성)
파일 선택 창에서 파일 형식을 제한할 수 있다
기본적으로 모든 파일 형식이지만 MIME 타입을 지정하여 특정 형식으로의 제한이 가능하다

<input type='file' accept="image/gif">

- 파일 정보 액세스(files 속성)
선택된 파일(들)의 정보를 조회하려면 파일박스 DOM 객체의 files 속성을 이용하면 된다
files 속성은 선택된 파일(들)의 정보를 배열형태로 담아 두고 있다. 각 배열의 요서가 특정 한 파일의 정보가 되며 name 및 size 속성등으로 파일 정보를 액세스 할 수 있다

<script type="text/javascript">
  var selectedFiles = document.getElementById("file").files;
  selectedFiles[0].name; //파일이름
  selectedFiles[1].size; //파일사이즈 
</script>


3) submit(폼 전송) 버턴의 개선

input 타입 중 submit , image 는 폼 전송을 수행하는 버턴이다
폼을 전송하기 위해 전송할 곳(action), 전송방식(get or post),enctype 등을 명시해야 하는데
이전 환경에서는 <form> 태그에 이들 속성을 지정하였다
HTML5 에서는 폼 전송 버턴인 submit, image 버턴에도 이들 속성을 지정할 수 있게 되었다

<form>
    <input type="submit" formmethod="POST" formaction="/formOk.html">
</form>

만일 <form> 과 submit 버턴 둘 다 action 이 지정되면 submit 에 지정된 action 값이 우선 적용 된다
(현재 오페라 브라우저에서만 정상 동작함)

 
추가된 폼 양식
input 타입에 새로운 양식이 추가된 것과 더불어 새로운 폼 요소들도 몇 가지 추가되었다

1) Progress 요소
진행 상태를 알려 주는 프로그레스 바를 나타낸다
max, value 를 이용하여 진행량의 최대값과 초기값을 지정할 수 있으며 position 속성을 참조하여 진행률을 계산할 수 있다. 현재 시점에 progress 요소를 지원하는 브라우저는 없다

<progress max="1" value="0"></progress>


2) Output 요소
새로 추가된 폼 출력요소이다. Input 요소가 폼 입력을 담당한다면 Output 요소는 폼 출력을 담당한다
보기에는 단순한 텍스트처럼 보이지만 실제로 폼 전송시 Output 요소의 값도 같이 전송된다. 이런 의미에서 눈에 보이는 히든 요소라는 표현도 있다. 읽기전용 폼 전송 요소를 정의한다고 보면 된다

<output name="sum">100</output>


3) DataList 요소
input (입력) 양식에 대한 옵션 리스트를 제공한다
즉 입력 양식에 들어갈 내용을 미리 제공하여 input 박스에 포커스가 오면 이 리스트를 보여준다
input 박스의 list 속성에 datalist id를 지정하여 둘을 매핑 시킨다

<input type="url" list="url_list" />
  <datalist id="url_list">
  <option label="모바일플랫폼" value="http://m.mkexdev.net" />
  <option label="MKEX의닷넷" value="http://www.mkexdev.net" />
  <option label="Microsoft" value="http://www.microsoft.com" />
  </datalist>

(오페라)

4) Keygen 요소
암호 키를 생성해 주는 폼 요소이다.
공개키기반의 키 쌍을 생성하며 폼 전송 시 공개키가 서버로 전송된다
다음은 RSA 키를 생성하는 코드이며 브라우에 이 요소가 표시될 때 키의 길이를 선택하도록 표시된다

<keygen name="key" keytype="rsa"></keygen>

(크롬)


5) Meter 요소
디스크 사용량과 같은 용량과 임계치가 존재하는 상황에서 현재 사용량을 보여주는 UI를 표시한다
min, max 로 최소값과 최대값(임계치)를 설정하며 현재 사용량의 정도(낮음, 높음, 적정)을 나타내는 low, high, optimum 속성이 제공된다. 현재 시점에 progress 요소를 지원하는 브라우저는 없다

<meter min="0" max="10"></meter>


폼 유효성 검사(입력값 검증)
HTML5 의 폼은 자체적으로 입력 값 검증을 수행하도록 되어 있다
예를 들어 <input type=email>에 입력된 값이 이메일 패턴과 다를 경우 폼은 전송되지 않고 에러 메시지를 표시해 준다. 그리고 입력 양식에 required 속성을 부여하면 빈 값이 허용되지 않는다
또한 입력 양식에 pattern 속성으로 정규표현식으로 입력 패턴을 지정할 수 있다
지정한 패턴과 다른 형태의 값은 입력이 허용되지 않는다

ex) 우편번호 패턴
<input type="text" name="postCode" pattern="/^\d{3}-?\d{3}$/" title="123-123">

이전 환경에서는 이 모든 것을 스크립트 영역에서 별도로 처래해 줘야 했다

<form action="demo_form.asp" method="get">
  First name: <input type="text" name="fname" required /><br />
  Last name: <input type="text" name="lname"  /><br />
  E-mail: <input type="email" name="email" /><br />
  <input type="submit" />
</form>


(오페라)
 
이렇듯 폼이 자동으로 입력 값 유효성을 검사하는 것은 폼에 validate 가 기본적으로 활성화되었기 때문이다. 만일 폼의 자동 유효성 검사를 꺼두고 싶다면 폼에 novalidate 를 부여하면 된다

<form novalidate action="demo_form.asp" method="get">
   .....


개선된 폼 이벤트(Event)
HTML5 에서는 폼과 관련한 몇 가지 이벤트도 추가되었다
대표적으로 forminput 이벤트와 formchange 이벤트를 들 수 있다

이 이벤트들은 폼의 하위 요소가 아닌, 폼 자체에 걸 수 있는 이벤트로써 폼에 포함되어 있는 각종 요소들을 특정 이벤트로 연계시키기 좋은 구조를 제공한다

간단한 예를 보자
폼에 3개의 요소가 있고 특정 한 요소의 입력 변화를 감지해 다른 두 요소를 제어하는 샘플이다
<form onforminput="ta2.value = ta1.value;textLength.value=ta1.value.length;">
  <textarea id="ta1"></textarea> <br>
  글자 복사 ↓<br> 
</form

<textarea id="ta2"></textarea>
글자 수:<output id="textLength"></output>

폼에 forminput 이벤트를 구현하여 글이 입력될 때 마다 아래로 복사하고 글자 수를 표시하는 코드이다
참고로 코드에서는 폼에 하나의 요소(textarea)만 존재하지만, forminput 이벤트는 폼에 포함된 모든 요소의 변화를 감지한다. 아래는 실행화면이다
(오페라)

이렇듯 forminput, formchange 이벤트를 이용하면 폼의 각 요소를 쉽게 연계할 수 있다

'모바일 > HTML5' 카테고리의 다른 글

[HTML5] Server-Sent Events  (4) 2010.08.31
[HTML5] Notifications (알림)  (2) 2010.08.30
HTML5 관련 유용한 레퍼(참조) 사이트  (0) 2010.08.26
[HTML5] Video & Audio  (6) 2010.08.24
[HTML5] Canvas  (3) 2010.08.19

HTML5 관련 유용한 레퍼(참조) 사이트

Posted in 모바일/HTML5 // Posted at 2010. 8. 26. 11:28
728x90

HTML5 가 웹 개발의 새로운 지평을 열어 놓은 것만은 분명한 것 같다

이러한 흐름을 반영이라도 하듯이,
양질의 HTML5 레퍼 사이트가 속속 등장하고 굉장히 좋은 정보를 제공하고 있다.
아래 소개되는 사이트들을 참고하면 HTML5 를 보다 빨리 그리고 정확하게 습득할 수 있다

HTML5 학습 참조 사이트

W3C HTML5
소개: HTML5 표준화 작업을 진행하는 주체인 W3C에서 제공하는 HTML5 스펙 소개
URL: http://www.w3.org/TR/html5/

WHATWG(Web Hypertext Application Technology Working Group) HTML5
소개: HTML5 스펙을 실질적으로 주도하고 있는 워킹그룹에서 제공하는 HMLT5 사양서
URL: http://www.whatwg.org/specs/web-apps/current-work/multipage/

HTML5 ROCKS (구글)
소개: 구글에서 제공하는 HTML5 관련 학습 및 데모 제공 사이트
URL: http://www.html5rocks.com/
       http://playground.html5rocks.com/ (실제 데모 실습을 해 볼 수 있음, so cool~) 


HTML5 Showcase (애플)
소개: 애플에서 제공하는 HTML5 관련 학습 및 데모 제공 사이트
URL: http://www.apple.com/html5/
        http://developer.apple.com/safaridemos/

Mozilla 개발자 센터(MDC) HTML5
소개: 모질라에서 제공하는 HTML5 학습 사이트
URL: https://developer.mozilla.org/en/HTML/HTML5
        https://developer.mozilla.org/ko/HTML/HTML5 (한국어버전)

Opera 개발자 센터(Dev.Opera) HTML5
소개: 오페라에서 제공하는 HTML5 학습 사이트
URL: http://dev.opera.com/articles/tags/open%20web/

w3schools
소개: HTML, CSS, HTML5, JavaScript 와 같은 클라이언트 기술은 물론 asp,php 와 같은
        서버스크립트, 웹서비스, SVG, Flash 등 거의 모든 웹 관련 레퍼런스를 제공하는 사이트
URL: http://www.w3schools.com/

Dive Into HTML5
소개: Oreilly 출판사의 HTML5 Up and Running 라는 책의 근간이 되는 사이트
URL: http://diveintohtml5.org/

<html>5 doctor
소개: 몇몇 개발자들이 모여서 만든 HTML5 학습 사이트
URL: http://html5doctor.com/

html5demoes
소개: FF(Full Frontal) 컨퍼런스 모임에서 제공하는 HTML5 데모 사이트
URL: http://html5demos.com/

Caniuse
소개: HTML5, CSS, SVG 등의 브라우저 호환성 테이블 제공 및 데모사이트로의 연결 제공
URL: http://caniuse.com/

       
 IBM Developer Works 에 실린 HTML5 컬럼
- HTML5와 CSS3를 사용하여 최신 웹 사이트 구축하기
http://www.ibm.com/developerworks/kr/library/tutorial/wa-html5/index.html

- HTML5를 사용하여 모바일 장치 웹 애플리케이션 작성하기
https://www.ibm.com/developerworks/kr/library/wa-offlineweb/

- HTML 5로 모바일 웹 애플리케이션 작성하기
https://www.ibm.com/developerworks/kr/library/x-html5mobile1/

- HTML5를 사용하여 웹 애플리케이션 빌드하기
http://www.ibm.com/developerworks/kr/library/wa-html5webapp/


HTML5 로 제작된 사이트 소개


HTML Games

소개: HTML5 로 개발된 온라인 게임을 모아놓은 사이트, 일면 HTML5 게임 포탈
URL: http://html5games.com/

<html>5 gallery

소개: HTML5 로 개발된 사이트를 소개하는 사이트
URL: http://html5gallery.com/

mr.doob
소개: HTML5 , Javascript Deom
URL: http://mrdoob.com/

js do.it
소개: HTML5, Javascript, CSS 공유 사이트(일본)
URL: http://jsdo.it/


Darkroom
소개: HTML5 로 제작된 그래픽 툴
URL: http://mugtug.com/darkroom/

littlecoogie
소개: HTML5 로 제작된 쇼핑몰
URL: http://www.littlecoogie.com/

9elements.com
소개: HTML5 Canvas로 제작, HTML5 관련 데모 링크 제공
URL: http://9elements.com/io/projects/html5/canvas/

'모바일 > HTML5' 카테고리의 다른 글

[HTML5] Notifications (알림)  (2) 2010.08.30
[HTML5] 웹 양식(Web Form)의 개선, 폼 태그  (4) 2010.08.26
[HTML5] Video & Audio  (6) 2010.08.24
[HTML5] Canvas  (3) 2010.08.19
[HTML5] Web SQL Database  (0) 2010.08.17

[HTML5] Video & Audio

Posted in 모바일/HTML5 // Posted at 2010. 8. 24. 13:39
728x90

멀티미디어 지원
HTML 5 를 지원하는 브라우저는 비디오, 오디오와 같은 멀티미디어 형식을 자체적으로 지원한다
HTML 5 는 이러한 멀티미디어 파일을 웹 페이지에 삽입할 수 있는 태그를 정의하고 있으며 
재생과 관련한 각종 제어를 수행할 수 있는 스크립트 API가 제공된다
 
이전의 브라우저 환경
HTML 5가 등장하기 전, 브라우저 환경에서는 멀티미디어 재생을 자체적으로 할 수 없었다
대신 외부 기술, 즉 브라우저에 별도로 설치되는 플러그인(Plug in)의 힘을 빌어 멀티미디어를 표현할 수 있었다. 멀티미디어 재생을 위한 플로그인 기술로는 다음과 같은 것들이 있다
- 윈도우 미디어 플레이어
- 어도비 플래시 플레이어
- 애플 퀵타임 플레이어
- 마이크로소프트 실버라이트

이러한 플러그인이 브라우저에 따로 설치되어야만 멀티미디어 재생이 가능하였으며 이는 곧 표준과는 거리가 먼 개념이 되어 버렸다

웹 응용환경의 일관되고 표준적인 플랫폼을 지향하는 HTML5가 멀티미디어 재생을 위한 스펙이 마련된 것은 어찌보면 당연한 순리라 하겠다. 그 만큼 현재의 웹은 멀티미디어를 빼고 논할 수는 없는 것이다


브라우저 지원 현황
다른 HTML5 스펙과는 달리 비디오,오디오는 브라우저 별로 지원되는 코덱이 상이하다
즉 HTML 5 의 멀티미디어 구현은 지원하더라도 각기 다른 코덱을 지원하는 것이다
Video, Audio 스펙은 표준으로 정해졌지만 코덱은 아직 표준으로 정해진 것이 없기 때문이다

따라서 브라우저가 Video,Audio 를 지원하다고 해도 어떤 코덱을 지원하는 것인지 추가 확인이 필요하다. 우선 Video,Audio 를 지원하는 브라우저 현황을 살펴보자

Video, Audio 지원 현황
- Video 지원 현황



- Audio 지원 현황

출처: http://caniuse.com/

대부분의 최신 브라우저에서 Video, Audio를 지원하고 있다
또한 다음의 코드로 브라우저 지원 여부를 체크해 볼 수 있다

if(!!document.createElement('video').canPlayType) {
     alert("현재 브라우저는 비디오를 지원합니다")
}
else{
      alert("현재 브라우저는 비디오를 지원하지 않습니다")
}

이제 브라우저별로 각기 달리 지원되는 코덱에 대해 살펴보자

코덱 지원 현황
멀티미디어 형식에 대한 표준이 HTML5 사양에는 포함되지 않았다.
따라서 멀티미디어 재생을 위한 코덱의 비 표준화로 현재 브라우저 마다 동영상 재생 형식이 서로 다르다비디오 코덱으로는 H.264 Theora 가 있으며 오디오 코덱으로는 AAC,MP3 Vorbis 형식이 HTML5 용으로 사용되고 있다

모질라와 오페라는 라이선스가 없는 오픈 소스 Theora를 선호하며 애플과 구글은 H.264 코덱을 선호한다. 또한 마이크로소프트의 IE.9 에서는 H.264코덱만 지원한다고 발표한 바 있다

오디오 코덱 역시 라이선스가 없는
Vorbis형식과 특허로 제한되어 있는 MP3, ACC 형식으로 이분화 되어 있다. 그리고 또 하나의 변수로 최근 구글이 동영상 코덱 개발사인 On2를 인수해 VP8 코덱을 오픈 하기로 하였다. 이에 모질라 및 오페라 등이 동참하기로 하였지만 애플의 참여는 알 수 없는 상황이다.

따라서 표준이 정립되기 전까지는 두 형식에 대한 브라우저 호환성을 유지해야 하는 부담이 있다
아래 표는 브라우저 별 지원되는 비디오/오디오 코덱 정보이다

 

파일 형식

비디오 코덱

오디오 코덱

사파리

MP4

MPEG/H.264

AAC/MP3

크롬

Ogg/MP4

Theora/H.264

Vorbis/AAC/MP3

파이어폭스

Ogg

Theora

Vorbis

 (스마트폰 브라우저의 경우 해상도 및 초당 프레임 등 추가 제약사항이 있을 수 있음)
 출처: HTML5 & API 입문, 시라이시 슌페이 저)



Video & Audio 재생하기
웹 페이지에 멀티미디어 형식을 삽입하고 재생하고 컨트롤 하는 기본적인 태그에 대해 알아보자

<video> , <audio> 태그
비디오, 오디오를 단순히 재생한 시키고자 할 경우 간단한 마크업 만으로도 충분하다
비디오 재생을 위한 <video> 태그와 오디오 재생을 위한 <audio> 태그가 제공되며
각 태그에 멀티미디어 파일의 위치(소스)를 제공해 주기만 하면 된다

<!DOCTYPE html>
<html>
<head></head>
<body>
  <video controls autoplay loop     
       src="http://www.double.co.nz/video_test/transformers480.ogg"></video>
  <br>  
  <audio controls autoplay loop
       src="http://www.miaowmusic.com/audio/mp3/Miaow-07-Bubble.mp3"></audio>
</body>
</html>


구글 크롬 브라우저 실행화면

간단한 태그만으로 웹 페이지에 비디오,오디오 형식을 재생할 수 있다
예제에서 사용된 <video>,<audio> 태그의 속성은 다음과 같다
- src: 비디오, 오디오 파일(소스)를 지정한다
- controls: 재생을 컨트롤 하는 컨트롤 바를 보이게 한다
- autoplay: 자동으로 재생을 시작한다


대체 요소 출력
HTML5 의 비디오, 오디오가 지원되지 않는 브라우저를 위한 대체요소 출력이 지원된다
아래와 같이 <video>,<audio> 태그 사이에 대체요소를 정의하면 된다

<video src="http://www.double.co.nz/video_test/transformers480.ogg">
    HTML5 Video 를 지원하지 않는 브라우저 입니다
</video
<br>   
<audio src="http://www.miaowmusic.com/audio/mp3/Miaow-07-Bubble.mp3">
    HTML5 Audio 를 지원하지 않는 브라우저 입니다
</audio>

위 코드를 MS IE 8.0 이하 버전에서 실행해 보면 대체 텍스트가 표시될 것이다
 

Video & Audio 제어하기
HTML5 에는 비디오, 오디오의 재생과 관련한 다양한 스크립트 API를 정의하고 있다

재생과 관련된 제어라 함은 시작, 중지, 일시정지, 재생위치파악, 재생길이, 재생속도, 볼륨크기, 음소거 등이 있으며 재생 간 발생하는 각종 이벤트 처리를 일컫는다

스크립트 API를 통해 제어를 하기 위해서는 Video(Audio)의 DOM 객체를 대상으로 수행하면 된다

var video1 = document.getElementById("video1");
video1.play(); //비디오를 재생함

Video, Audio 를 위한 다양하고 많은 속성과 함수 그리고 이벤트들이 제공된다
다음이 url에서 멀티미디어 관련 API 들을 확인해 보기 바란다


몇 가지 주요한 API를 알아보고 관련 데모를 제작해 보도록 하자

주요 속성
- src: 멀티미디어 파일 소스 지정
- currentTime: 현재 재생 위치를 초 단위로 반환
- duration: 전체 재생시간을 초 단위로 반환
- paused: 일시정지 여부 반환
- ended: 재생 종료 어부 반환
- muted: 음소거 여부 반환
- volume: 볼륨 값(0.0 ~ 1.0 범위를 가짐)
- error: 에러 정보를 반환
- networkState: 멀티미디어 파일과 관련된 네트워크 상태 반환(접속전, 로딩 중, 완료, 로딩 실패 등)

주요 함수
- load(): 멀티미디어를 읽어 들임(재생하지는 않음)
- play(): 멀티미디어를 재생함
- pause(): 일시 정지

주요 이벤트
- play: 재생될 때 발생
- progress: 멀티미디어 파일을 로딩중에 지속적(그리고 간헐적) 발생
- timeupdate: 재생 중에 지속적 발생
- ended: 재생 종료시 발생
- error: 멀티미디어 로딩, 재생과 관련한 에러가 있을 시 발생

자주 응용 될 법한 주요 API에 대한 설명이다. 추가 API 설명은 반드시 관련 자료를 다로 보기 바란다


비디오 데모 만들어 보기
주요 속성과 함수, 이벤트 몇 가지를 응용하여 비디오 재생을 제어하는 간단한 데모를 만들어 보자

- 데모 실행 화면
아래 화면은 데모를 구글 크롬에서 실행한 화면이다.
progress 이벤트에서 구현한 데이터 로딩 부분이 정상 동작 하지 않는다(하단 undefined)
재생, 정지, 음소거, 볼륨 등은 모두 정상 동작한다
 

그리고 아래 화면은 파이어폭스에서 데모를 실행한 화면이다
파이어폭스의 경우 모든 기능이 잘 동작한다(데이터 로딩 부분 역시 정상 동작함)
그러나 볼륨을 위한 range input 컨트롤이 아직 지원되지 않는 것 같다


이렇듯 브라우저별로 몇 가지 상이한 동작을 하는 것은 HTML5 가 아직 표준화가 완료되지 않는 것을 의미한다. 이제 데모 코드를 살펴 보자
<!DOCTYPE html>
<html>
<head></head>
<body>
  <video id="video1" controls  
             src="http://www.double.co.nz/video_test/transformers480.ogg"></video>  
  <br>
  <button onclick="play()">재생</button>
  <button onclick="pause()">일시정지</button>
  <button onclick="mute()">음소거</button>
 
  볼륨:<input id="volumecontrol" type="range" max="1" step="any" onchange="updateVolume()">
 
  <div id="time"></div>
  <div id="downLoadState"></div>
</body>
</html>

<script type="text/javascript">
  var video1 = document.getElementById("video1");    
            
  //비디오 재생 
  function play(){
    video1.play();
    video1.volume = volumecontrol.value;   
  } 
  //비디오 일시정지
  function pause(){
    video1.pause();
  }    
  //음소거
  function mute(){
    video1.muted = !video1.muted;
  } 
  //볼륨조절       
  function updateVolume() {
    video1.volume = volumecontrol.value;
  } 
 
  //timeupdate 이벤트 구현(재생시간 현황 표시)
  video1.addEventListener("timeupdate",
    function(){       
      document.getElementById("time").innerHTML =
               Math.floor(video1.currentTime) + "/" + Math.floor(video1.duration) + "(초)";
    }
    , false
  );  
    
  //progress 이벤트 구현(비디오 다운로드 현황 표시)
  video1.addEventListener("progress",
    function(e){
      var downLoadState = document.getElementById("downLoadState");
     
      if(video1.networkState == 2){
        downLoadState.innerHTML = e.loaded + "/" + e.total + "byte";       
      }
      else if(video1.networkState == 3){
        downLoadState.innerHTML = "완료";
      }
    }
    , false
  );       
</script>


브라우저 호환성 확보
앞서 Video, Audio 에 대한 브라우저 지원 현황을 알아 보았다
Video, Audio 는 두 가지 지원 현황을 파악해야 한다고 했는데 요약하자면 다음과 같다
1) Video, Audio 지원 현황
2) 코덱 지원 현황

즉 브라우저가 Video, Audio 자체를 지원하다고 하더라도 지원되는 코덱이 서로 상이하기 때문에
브라우저가 지원하는 코덱정보를 정확히 알고 있어야 원활한 서비스가 가능하다는 것이다

HTML5 멀티미디어 구현을 위해 브라우저 호환성을 확보하기 위한 모든 방법을 알아 보자

1) Video 지원 여부 확인하기
앞에서 알아 본 방법이다.
if(!!document.createElement('video').canPlayType) ...
으로 브라우저가 Video 태그를 지원하는지 체크할 수 잇다

2) 대체 요소 출력
역시 앞에서 알아 본 방법이다. 태그 사이에 대체 요소를 출력한다
<video src="http://www.double.co.nz/video_test/transformers480.ogg">
    HTML5 Video 를 지원하지 않는 브라우저 입니다
</video> 

3) 코덱 호환성 확보
마지막으로 브라우저별로 상이한 코덱 지원을 검사하여 정상적인 동작을 보장해야 한다
예를들어 사파리의 경우 H.264 를 지원하고 파이어폭스의 경우 Theora를 지원하기 때문에
모든 브라우저에서 정상 동작 시키기 위해서는 각 브라우저가 지원하는 형식으로 서비스를 해야 한다

브라우저가 특정 코덱을 지원하는지 검사하려면 Video 의 canPlayType() 함수를 이용하면 된다
아래 코드는 theora 비디어코덱과 vorbis 오디오 코덱으로 구성된 ogg컨테이너 형식의 멀티미디어를
지원하는지 체크하는 코드이다
var video1 = document.getElementById("video1");
return video1.canPlayType('video/ogg; codecs="theora, vorbis"'


그리고 더 쉽게 코덱 호환성을 확보 할 수 있는 방법이 있는데,
바로 <video>,<audio> 태그 사이에 정의되는 <source> 태그를 이용하는 방법이다
<soruce> 태그는 멀티미디어 파일의 위치(소스)를 지정하는 src 속성의 역할과 동일하다

다만 이 태그는 여러개를 중복해서 정의할 수 있는데, 이 경우 멀티미디어 파일의 형식 즉 코덱정보를 명시하여 지정할 수 있다. 브라우저는 여러개의 <source> 태그를 차례대로 검사해서 자신이 지원하는 코덱과 일치하는 <source> 를 채택하여 재생시킨다

그리고 <source> 태그를 이용하면 HTML5 이전의 멀티미디어 환경 즉 플래시나 실버라이트와 같은
형식의 지정도 가능하다. 즉 브라우저가 HTML5 자체를 지원하지 않을 경우 플래시로 대체하는 코드 작성이 가능하다는 것이다(물론 각 버전에 맞는 동영상이 미리 준비되어 있어야 겠지만...)

결과적으로 <soruce> 태그를 이용하여 코덱과 관련한 브라우저 호환성을 쉽게 확보할 수 있는 것이다
아래 코드는 코덱 호환성 확보를 위한 몇 가지 샘플 코드이다
(출처: http://dev.opera.com/articles/view/everything-you-need-to-know-about-html5-video-and-audio/)
- ogv 와 mp4 지원
<video controls>
  <source src="video.ogv" type='video/ogg; codecs="theora, vorbis"'>
  <source src="video.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
video not supported
</video>

- ogv, applet 지원
<video controls>
<source src="video.ogv" type='video/ogg; codecs="theora, vorbis"'
         onerror="fallback(this.parentNode)">
<object type="application/x-java-applet" width="480" height="288">
  <param name="archive" value="cortado-ovt-stripped-wm_r51500.jar">
  <param name="code" value="com.fluendo.player.Cortado.class">
  <param name="url" value="video.ogv">
  video and Java not supported
</object>
</video>

- mp4, swf 지원
<video controls>
<source src="video.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'
         onerror="fallback(this.parentNode)">
<object data="videoplayer.swf">
  <param name="flashvars" value="video.mp4">
  video and Flash not supported
</object>
</video>

HTML Video, Audio 태그가 지원되지 않을 때 플래시나 윈도우 미디어로 대체하는 스크립트를
제공해 주는 다음의 사이트를 참고하기 바란다


마지막으로 Video, Audio 와 관련된 데브 오페라 사이트를 참고해 추가 학습하도록 하자
http://dev.opera.com/articles/view/everything-you-need-to-know-about-html5-video-and-audio/

'모바일 > HTML5' 카테고리의 다른 글

[HTML5] 웹 양식(Web Form)의 개선, 폼 태그  (4) 2010.08.26
HTML5 관련 유용한 레퍼(참조) 사이트  (0) 2010.08.26
[HTML5] Canvas  (3) 2010.08.19
[HTML5] Web SQL Database  (0) 2010.08.17
[HTML5] 오프라인 웹 어플리케이션  (0) 2010.08.12

[HTML5] Canvas

Posted in 모바일/HTML5 // Posted at 2010. 8. 19. 14:25
728x90
브라우저 위의 그림판
HTML5 의 많은 새로운 기능 중 가장 자주 언급되어 왔던 것이 아마 Canvas(캔버스) 일 것이다
Canvas 는 Web Workers 나 Web Storage와 같은 다른 HTML5 스펙보다 덜 기술적이며 보다 직관적이다.
개발자 뿐만 아니라 비개발자들 역시 Canvas의 개념을 쉽게 이해할 수 있고 흥미를 보여왔기 때문에 가장 먼저 그리고 가장 흔하게 소개된 HTML5 기술인 것이다

Canvas 는 말 그대로 그림을 그릴 수 있는 화폭, 즉 그림판과 같다
그것도 다른 곳에 아닌 브라우저 위에서 동작하는 그림판인 것이다

Canvas 위에 선, 도형, 텍스트, 이미지와 같은 그래픽을 표현할 수 있고 색깔, 그림자, 패턴과 같은 여러 효과를 적용할 수 있다. 그리고 기본적으로 Canvas 는 2차원 그래픽 표현을 위한 스펙이지만 추가로
WebGL를 기반으로 하는 3D 그래픽용 Canvas 의 스펙 개발이 진행중이다
참고: WebGL은 오픈 그래픽 라이브러리인 OpenGL(OpenGL ES 2.0)에 기반한 웹 표준 그래픽 라이브러리이다. WebGL을 이용하면 브라우저에 별도의 플러그 인 없이 완벽하게 하드웨어 가속되는 3D그래픽을 표현할 수 있게 된다. 주요 브라우저 벤더사인 애플, 구글, 모질라 및 오페라와 하드웨어 업체인 AMD 및 엔비디아 등이 WebGL Working Group 멤버로 활동하고 있다. 그리고 구글의 웹 용 3D API O3D 플러그 인 기술을 포기하고 WebGL 을 선택했다 


브라우저 지원 현황
브라우저 지원 현황 역시 다른 HTML5 기술보다 더 일반적이다
다시 말해 대부분의 브라우저에서 Canvas를 지원한다는 의미이다


그림1. 브라우저별 2D Canvas 지원 현황 (출처: http://caniuse.com/)

IE9 이전 버전에서 Canvas 지원하기
현재까지 출시된 IE8 까지는 HTML5 지원이 거의 되지 않는다
Canvas 역시 IE9 이전 버전에서는 동작하지 않는다
다만 구글에서 제공하는 크롬프레임을 설치하면 IE9 이전버전에서도 HTML5 를 동작시킬 수 있다

그러나 Canvas의 경우 더 쉽게 IE에 적용할 방법이 있다.
ExplorerCanvas 라이브러리를 이용하면 이전버전의 IE에서도 Canvas를 동작시킬 수 있게 된다
(ExplorerCanvas는 이전 버전의 IE에서 Canvas API가 동작할 수 있도록 해 주는 오픈소스 자바스크립트 라이브러리이다)
ExplorerCanvas 다운로드: http://code.google.com/p/explorercanvas/

다운받은 excanvas.js 스크립트 파일을 Canvas가 구현된 HTML 파일의 헤더 영역에 다음과 같이
정의하여 IE일 경우 이 스크립트가 적용되도록 처리하면 된다
<html>
<head>
 <!--[if IE]><script type="text/javascript" src="excanvas.js"></script><![endif]-->
  ...



Canvas 학습 지원 사이트
Canvas로 구현할 수 있는 것은 아주 많다
개념적으로 보편적인 기술인 만큼 그 응용 개발 역시 매우 다양하게 펼칠 수 있다
그러나 응용도 기본이 갖춰져야 제대로 되는 만큼 기본사용법의 정확한 숙지가 필요하다

이 글에서도 기본적인 사용법과 간단한 데모를 작성해 보겠지만,
그전에 Canvas 학습을 도와주는 훌륭한 사이트가 있어 소개한다

이 두 사이트에서 제공하는 Canvas 튜토리얼은 정확한 기본기를 갖추고 응용력을 기르는데 충분한 도움을 줄 것이다. Canvas를 적용할 서비스는 굉장히 많으며 특히 게임과 같은 동적이고 화려한 그래픽이 필요한 서비스에는 활용도가 무궁무진할 것이다. 잘 정리된 기본 학습 도구를 활용하는 것이 매우 중요하므로 위 사이트들을 꼭 참고하기 바란다


Canvas 다루기
지금부터 Canvas를 다루는 기본적인 방법에 대해 알아 보도록 하자

<canvas> 태그와 그리기 컨텍스트
그림을 그리기 위해서는 제일 먼저 브라우저에 화폭이 준비되어 있어야 한다
<canvas>라는 마크업 태그를 이용하여 브라우저에 캔버스 영역을 지정할 수 있다
<canvas id="cv" width="400" height="300"></canvas>

HTML 문서에 <canvas> 태그를 삽입하는 것 만으로 브라우저에 그림판이 준비된다
다만 캔버스는 기본적으로 테투리가 없기 때문에 위 코드만으로는 브라우저에서 캔버스를 눈으로 확인하기는 힘들다. 따라서 스타일을 적용해 캔버스의 테두리를 보이게 하는 것이 좋을 수 있다
<canvas id="cv" width="400" height="300"
    style="position: relative; border: 1px solid #000;"></canvas>

그리고 이 캔버스를 이용해 그리기를 수행하려면 '그리기 컨텍스트'를 얻어야 한다
그리기 컨텍스트는 앞서 정의한 <canvas> DOM 객체의 getContext 메서드로 얻을 수 있다
var canvas = document.getElementById("cv"); //canvas의 DOM 객체를 얻는다
var context = canvas.getContext("2d");         //DOM 객체로부터 2D 컨텍스트를 얻는다

이후 그리기 작업은 '그리기 컨텍스트'를 통해 이루어진다

캔버스의 좌표
캔버스에 각종 도형 및 선과 같은 2차원 그래픽 작업을 할 때 각 점의 위치를 지정해야 하는데
이는 캔버스의 2차원 좌표가 기준이 된다
사각형 모양을 하고 있는 캔버스는 제일 왼쪽 상단 꼭지점이 (0,0) 시작점이 된다
(0,0) 시작점을 기준으로 그리고자 하는 도형의 가로 위치 x 와 세로위치 y 좌표를 지정하면 된다

그림2. Canvas의 좌표 (출처: http://diveintohtml5.org/canvas.html)


그리기 작업

1) 사각형 그리기
그리기의 가장 기본이 되는 도형이다. Canvas API 에서 사각형을 위한 함수를 따로 제공하고 있다
아래와 같은 사각형 함수인데, 모두 같은 매개변수를 취하고 있다
x,y : 사각형의 시작점 좌표(왼쪽 위 모서리 지점), width,height: 사각형의 너비,높이

fillRect(x, y, width, height)       : 색으로 채운 사각형을 그린다
strokeRect(x, y, width, height) : 선만 있는 사각형을 그린다
clearRect(x, y, width, height)   : 사각형 영역을 지운다

아래 그림은 간단한 사각형 그리기 샘플이다
차례로 속이 찬 사각형과, 윤곽만 있는 사각형, 그리고 절반이 지워진 사각형이다
아래 결과 화면과 코드를 참고하기 바란다



<!DOCTYPE html>
<html>
<head></head>
<body>
  <canvas id="cv" width="400" height="300" style="position: relative; border: 1px solid #000;"></canvas
</body>
</html>
<script type="text/javascript">
  var canvas = document.getElementById("cv");
  var context = canvas.getContext("2d");          
 
  context.fillRect(10,10,100,100);    //색으로채운 사각형
  context.strokeRect(120,10,100,100); //윤곽만 있는 사각형
 
  context.fillRect(230,10,100,100);   //색으로 채운 사각형
  context.clearRect(230,10,50,50);    //앞 사각형의 절반을 지움
</script> 


2) 각종 도형 및 선 그리기
사각형과는 달리, 삼각형, 오각형, 육각형 및 원과 같은 도형은 선들을 연결하여 직접 그려줘야 한다
완성된 도형은 선들의 집합체이며 각각의 선들을 패스(Path) 라 한다
(엄밀히 말하자면 각 선은 서브패스이며 서브패스 전체를 가리켜 패스라 한다)

결국 도형을 그린다는 것은 각 선을 연결한다는 의미이며 이는 패스(Path)를 그리는 과정인 것이다

패스(Path)그리기 순서
첫째, 패스 그리기를 시작을 알린다
: beginPath() 함수로 canvas에 패스그리기를 알린다. 이전의 패스는 모두 초기화된다

둘째, 패스 경로 즉 시작점과 종료점을 지정한다
: moveTo(x,y) 함수로 패스의 시작점을 지정하고 lineTo(x,y) 함수로 패스가 이어질 점을 지정한다
 
셋째, 패스 경로를 따라 실제로 그린다
: 이전 과정까지는 패스 즉 경로에 대한 정보를 셋팅하는 것이다
  실제 지정된 패스를 따라 선을 그려야 하는데, 이는 stroke(), fill()과 같은 잉크(ink)함수가 이용된다

삼각형 그리기
간단한 삼각형 그리기 샘플을 보자.
아래와 같은 삼각형을 그리기 위해 패스그리기를 수행한 예이다


<script type="text/javascript">
  var canvas = document.getElementById("cv");
  var context = canvas.getContext("2d");          
 
  context.beginPath(); //패스 그리기 시작  
  context.moveTo(50,10); //패스 시작점 지정  
  context.lineTo(20 ,100); //패스 이동점 지정
  context.lineTo(80 ,100); 
  context.lineTo(50 ,10);  
  context.stroke();    //윤관선 그리기
  //context.fill();   //색 채우기
</script>

beginPath() 로 패스그리기의 시작을 알리고 moveTo()로 패스 시작점을 설정한다
그리고 lineTo() 를 이용하여 패스의 경로를, 그리는 방향 대로 이동한다
마지막으로 stroke()로 패스의 윤곽선을 그린다
주석처리된 fill() 함수로 패스를 그릴 경우 패스 속이 색(기존 검정색)으로 채워지게 된다 

이런식으로 삼각형은 물론, 사각형, 오각형,.. N각형의 도형을 맘껏 그릴 수 있다

원 그리기
앞서 살펴본 삼각형 그리기는 직선을 연결한 도형일 경우에는 적합하지만 곡선이나 원을
그릴 수는 없다. 즉 lineTo() 함수는 직선을 그리는 함수이다

원이나 곡선 역시 패스 그리기의 일종으로 앞서 살펴본 과정을 그대로 따른다
다만 직선을 그리는 함수인 lineTo() 대신 원을 그리는 함수인 arc() 나 배지곡선을 그리는 함수인 quadraticCurveTo() 함수를 이용하면 된다

간단한 원그리기 샘플을 살펴 보자


<script type="text/javascript">
  var canvas = document.getElementById("cv");
  var context = canvas.getContext("2d");          
 
  context.beginPath(); //패스 그리기 시작   
  context.arc(70,70,50,0, 2*Math.PI, true); //원그리기 
  context.stroke();    //윤관선 그리기
</script>


패스 닫기
패스를 이용해 도형을 마음껏 그릴 수 있으려면 관련 학습을 조금 더 해야 한다
패스와 관련된 추가 학습은 다른 사이트를 참고하도록 하며 이 글에서는 명시적으로 패스를 닫는 closePath() 함수에 대해 알아보면서 패스 정리를 마치고자 한다

closePath()는 패스를 명시적으로 닫는 역할을 한다
반드시 사용해야 하는 것은 아니지만 명시적으로 closePath()를 호출해 주면
마지막 패스의 좌표와 시작좌표를 자동으로 연결해 주기 때문에 편리하다

다음은 앞서 살펴본 삼각형 그리기 예에서 마지막 패스를 생략하고 closePath()를 대신 사용하였다
즉 마지막 lineTo() 함수가 없어도 자동으로 시작점과 연결해 주기 때문에 결과는 동일하다
<script type="text/javascript">
  var canvas = document.getElementById("cv");
  var context = canvas.getContext("2d");          
 
  context.beginPath(); //패스 그리기 시작 
  context.moveTo(50,10); //패스 시작점 지정 
  context.lineTo(20 ,100); //패스 이동점 지정
  context.lineTo(80 ,100); 
  context.closePath();     //마지막 패스 이동점 대신 패스를 명시적으로 닫는다
  context.stroke();    //윤관선 그리기
</script>


스타일 및 효과
캔버스에 그리기 작업을 할 경우 별다른 스타일을 지정하지 않으면 기본 스타일이 적용된다
앞서 살펴본 샘플에서 도형의 안,팎의 색이 검정색이었던 것은 기본값이기 때문이다
스타일을 적용하면 도형의 색 지정 뿐만 아니라 그라데이션 효과, 그림자 효과등을 줄 수 있다

색 지정
우선 간단히 색을 지정하는 예를 보자. 앞서 살펴본 사각형 그리기 예에서 색을 지정한다
채우기 스타일은 fillStyle 로 윤곽선 스타일은 strokeStyle 로 색을 지정하면 된다
색을 지정할 때 blue, red 와 같은 문자는 물론 #ffffff 혹은 rgb(255,0,0) 등 모든 CSS 컬러를 사용할 수 있다. 색을 지정하지 않았을 땐 기본값으로 #000000(검정색) 이 된다


<script type="text/javascript">
  var canvas = document.getElementById("cv");
  var context = canvas.getContext("2d");                 
 
  context.fillStyle = "blue";
  context.fillRect(10,10,100,100);    //파란색으로 채운 사각형
 
  context.strokeStyle = "red";
  context.strokeRect(120,10,100,100); //빨가색 윤곽선 사각형
</script>


그라데이션 효과
fillStyle 이나 strokeStyle를 통해 색깔 지정 뿐만 아니라 그라데이션 효과도 줄 수 있다
그라데이션은 선형그라데이션과 원형그라데이션 두 가지 종류가 있다

선형 그라데이션
: (x,y) 지점에서 (x1,y1) 까지 직선으로 색조가 변화한다
  createLinearGradient(x,y,x1,y1) 함수 이용

원형 그리데이션
: 중심이 (x,y), 반지름 r인 원에서 중심이 (x1,y1), 반지름이 r1 인 원 사이의 색조가 변화한다
  createRadialGradient(x,y,r,x1,y1,r1) 함수 이용

createXXXGradient 함수로 그라데이션의 형태를 지정한 후,
addColorStop(offset, color) 함수를 이용하여 각 지점에 이용될 색을 지정한다
offset는 0.0(시작점) 에서 1.0 (끝점) 사이의 위치 값을 나타내며 해당 위치의 색을 지정한다

사각형에 선형 그라데이션 효과를 준 예를 살펴 보자
두 사각형 모두 선형 그라데이션 효과를 준 것이며 직선 방향을 조정하여 가로,세로 효과를 줬다

(화살표는 색조 변화 방향을 나타냄)

<script type="text/javascript">
  var canvas = document.getElementById("cv");
  var context = canvas.getContext("2d");                 
 
  var gradient = context.createLinearGradient(0,0,100,0);
  gradient.addColorStop(0,"white");
  gradient.addColorStop(1,"blue"); 
  context.fillStyle = gradient;   
  context.fillRect(10,10,100,100); 
 
  gradient = context.createLinearGradient(0,0,0,100);
  gradient.addColorStop(0,"white");
  gradient.addColorStop(1,"red"); 
  context.strokeStyle = gradient;
  context.strokeRect(120,10,100,100);      
</script>


그림자 효과
선이나 도형에 그림자 효과를 줄 수 있다.
shadowOffsetX, shadowOffsetY 함수를 이용하여 원본 도형의 위치를 기준으로 그림자의 위치를 지정할 수 있으며 shadowColor 로 그림자 색상 shadowBlur로 그림자의 흐리기를 조정할 수 있다


<script type="text/javascript">
  var canvas = document.getElementById("cv");
  var context = canvas.getContext("2d");                 
    
  context.shadowColor = "green";
  context.shadowOffsetX = 5;
  context.shadowOffsetY = 5;
  context.shadowBlur = 2; 
 
  context.fillStyle = "blue";
  context.fillRect(10,10,100,100);  
</script>



이미지 및 텍스트 그리기
캔버스에는 선이나 각종 도형 이외에도 이미지 파일을 삽입하거나 텍스트를 직접 그릴 수도 있다
캔버스에 텍스트 그리기를 이용하면 글자에 각종 효과를 줄 수 있는 장점이 있다
그리고 이미지 역시 각종 이미지 처리를 할 수 있다는 장점이 있겠다

텍스트 그리기
우선 캔버스에 텍스트를 그리는 예를 살펴 보자
다른 도형 그리기와 마찬가지로 채워진 텍스트 혹은 윤곽선만 있는 텍스트를 그릴 수 있다


<script type="text/javascript">
  var canvas = document.getElementById("cv");
  var context = canvas.getContext("2d");                 
    
  var msg = "Hello, Canvas!"
 
  context.font = "20px '맑은 고딕'";
  context.fillText(msg, 10  ,50);
 
  context.font = "40px 'Tahoma'";
  context.strokeText(msg, 10  ,100);
</script>


이미지 그리기
drawImage 함수를 이용하여 캔버스에 이미지 파일을 삽입할 수 있다
주의할 점은 drawImage의 호출 시점이다. 이미지가 모두 로딩된 이후에 이 함수를 호출해야 한다
따라서 이미지 로딩이 완료될 때 발생하는 onload 이벤트에서 이 함수를 사용하는 것이 일반적이다

눈의 즐거움을 위해 손담비 사진을 이용해 샘플을 만들어 보자 ^.^
Image 객체의 onload 이벤트에서 drawImage 함수가 호출되는 것을 눈여겨 보기 바라며
이미지를 이용하여 사각형을 그릴 때 채우기 패턴으로 사용할 수도 있다
예에서는 손담비 이미지를 기반으로 패턴을 생성하여 사각형의 채우기 스타일로 사용하고 있다
그리고 회전효과도 가미했다(이미지 그리기와는 무관하지만...)


<script type="text/javascript">
  var canvas = document.getElementById("cv");
  var context = canvas.getContext("2d");                 
    
  var image = new Image();
 
  image.onload = function(){
    context.rotate(20*Math.PI/180);       //회전효과
   
    context.drawImage(image,30,10);   //이미지 그리기
   
    var pattern = context.createPattern(image,"repeat"); //반복패턴정의
    context.fillStyle = pattern;                                       //fill 패턴 지정
    context.fillRect(200,10,200,250);                                   //이미지로 사각형을 채운다     
  }
 
  image.src = "sondambi.bmp";
</script>


Canvas 초기화
그림을 그리다 모두 지우고 싶을 때가 있다
캔버스에 각종 그래픽 작업을 하다가 모든 것을 지우고 다시 시작하고 싶은,
일명 리셋(reset)을 하고 싶다면 매우 단순하게 초기화를 할 수 있다

캔버스의 너비나 높이 속성을 다시 설정하는 것만으로 캔버스는 완전 초기화 된다
캔버스에 그려진 내용 뿐만 아니라 그리기컨텍스트의 각종 속성도 기본값으로 돌아 온다

function resetCanvas(){
    canvas.width = canvas.width;       
  }


마무리 데모
이제 이 글을 마치기 전에 마무리 데모를 살펴 보자
사실 이 글에서 소개된 캔버스 다루기 내용은 극히 일부에 지나지 않는다.
2D 그래픽 처리와 관련한 다양한 기법과 API들이 존재한다.

반드시 관련 자료를 참고하여 추가 학습을 하길 권하며 3D 캔버스인 WebGL도 필요하다면 관련 자료를
찾아 보기 바란다

마지막 데모는 마우스로 그림을 그릴 수 있는 그림판이다
캔버스에 마우스를 데고 자유자재로 움직이면, 선이 마우스를 따라 그려지는 샘플이다

아래 데모 실행화면을 보자. 필자가 캔버스에 대고 그린 그림이다 -.-;


전체 소스
<!DOCTYPE html>
<html>
  <head>
    <title>Canvas Paint Example</title>      
    <!--[if IE]><script type="text/javascript" src="excanvas.js"></script><![endif]-->   
  </head>
  <body>
   <div id="container">
     <canvas id="drawCanvas" width="400" height="300"
            style=" position: relative; border: 1px solid #000;"></canvas>
</div>
</body>
</html>
<script type="text/javascript">   
if(window.addEventListener){
    window.addEventListener('load', InitEvent, false);
}
var canvas, context, tool;       
function InitEvent () {                                      
    canvas = document.getElementById('drawCanvas');
    if (!canvas) {
      alert("캔버스 객체를 찾을 수 없음");
      return;
    }
    if (!canvas.getContext) {
      alert("Drawing Contextf를 찾을 수 없음");
      return;
    }       
    context = canvas.getContext('2d');
    if (!context) {
      alert("getContext() 함수를 호출 할 수 없음");
      return;
    }
    // Pencil tool 객체를 생성 한다.
    tool = new tool_pencil();
    canvas.addEventListener('mousedown', ev_canvas, false);
    canvas.addEventListener('mousemove', ev_canvas, false);
    canvas.addEventListener('mouseup',   ev_canvas, false);
}
function tool_pencil ()                                  
{
    var tool = this;
    this.started = false;
    // 마우스를 누르는 순간 그리기 작업을 시작 한다.
    this.mousedown = function (ev)
    {
        context.beginPath();
        context.moveTo(ev._x, ev._y);
        tool.started = true;
    };
   // 마우스가 이동하는 동안 계속 호출하여 Canvas에 Line을 그려 나간다
    this.mousemove = function (ev)
    {
        if (tool.started)
        {
            context.lineTo(ev._x, ev._y);
            context.stroke();
        }
    };
   // 마우스 떼면 그리기 작업을 중단한다
    this.mouseup = function (ev)
    {
      if (tool.started){
            tool.mousemove(ev);
            tool.started = false;
      }
    };
}       
// Canvas요소 내의 좌표를 결정 한다.
function ev_canvas (ev)
{
    if (ev.layerX || ev.layerX == 0)
    { // Firefox 브라우저
      ev._x = ev.layerX;
      ev._y = ev.layerY;
    }
    else if (ev.offsetX || ev.offsetX == 0)
    { // Opera 브라우저
      ev._x = ev.offsetX;
      ev._y = ev.offsetY;
    }
    // tool의 이벤트 핸들러를 호출한다.
    var func = tool[ev.type];       
    if (func) {
        func(ev);
    }
}
</script>

'모바일 > HTML5' 카테고리의 다른 글

HTML5 관련 유용한 레퍼(참조) 사이트  (0) 2010.08.26
[HTML5] Video & Audio  (6) 2010.08.24
[HTML5] Web SQL Database  (0) 2010.08.17
[HTML5] 오프라인 웹 어플리케이션  (0) 2010.08.12
[HTML5] Web Storage  (1) 2010.08.11

[HTML5] Web SQL Database

Posted in 모바일/HTML5 // Posted at 2010. 8. 17. 17:05
728x90

브라우저에 데이타베이스?
HTML5 의 로컬 저장소는 이전에 알아본 Web Storage 이외에도 관계형 데이타베이스가 추가로
제공된다. 일명 Web SQL Database 가 그것이다
(Web SQL Database 를 지원하는 브라우저는 자체적으로 경량의 관계형 DB를 내장하고 있다)

Web Storage 의 경우 비교적 적은양의 간단한 데이터를 저장하기에 적합한 로컬 저장소인 반면
Web SQL Database 는 보다 구조적이고 체계화된 관계형 데이터를 대랑으로 저장하기에 적합하다
이것은 마치 파일이라는 저장소와 MS SQL 이나 Oracle 과 같은 관계형 데이타베이스의 차이라 하겠다

물론 Web SQL Database가 Oracle 와 같이 서버급, 대용량 DBMS의 면모를 모두 갖추지는 않았지만,
안정적이고 경량의 관계형 자료구조를 지원하고 표준 SQL 질의를 통해 데이터를 보다 유연하게 다룰 수 있다는 점과 클라이언트(브라우저)에 직접 내장되어 있다는 점에서 매우 유용한 기능이라 할 수 있다

Web SQL Database 는 아이폰과 같은 모바일 환경에 많이 채용된 경량의 무료 DB엔진인 SQLite를
기반으로 하고 있다


브라우저 지원 현황
아래 표는 http://caniuse.com/ 에서 제공하는 브라우저(버전)별 Web SQL Database 지원 표이다
(데스크탑 용 브라우저 기준이다)






위 표를 보면 사파리와 크롬, 오페라 브라우저는 Web SQL Database 를 지원한다
그러나 파이어폭스가 지원하지 않는것이 조금 의아하다
파이어폭스는 대부분의 HTML 5 신 기술을 채택하고 있는데 말이다
그리고 IE 9 역시 지원이 불투명하다. 조금 뒤에 그 이유를 알아 본다

참고로 아이폰의 사파리 역시 Web SQL Database를 지원한다

다음의 코드로 브라우저 지원 여부를 체크해 볼 수 있다

if(!!window.openDatabase) {
     alert("현재 브라우저는 Web SQL Database를 지원합니다")
}
else{
      alert("현재 브라우저는 Web SQL Database를 지원하지 않습니다")
}


Indexed Database
Indexed Database는 새로 등장한 또다른 로컬 저장소 스펙이다
2009년 말까지 사양 책정이 진행중이던 Web SQL Database 의 대안으로 탄생했다
즉 현재 Web SQL Database 는 사양 책정이 중지된 상태이며, IndexedDB 라는 새로운 스펙이
대안으로 떠오르고 있는 것이다

Indexed Database 는 자바스크립트 객체 단위의 데이터 저장이 용이하고 그 객체를 대상으로
인덱스를 걸 수 있어 간단한 구현과 효율적인 검색을 수행할 수 있다

관계형 데이타베이스의 경우 저장되는 데이터의 스키마의 유연성이 떨어질 수 있고 SQL 이라는 별도의 독립된 언어를 기반으로 하기 때문에 브라우저간 표준화및 호환성에 문제될 소지가 있다
(MS SQL과 오라클이 자체 비표준 SQL을 지원하는 것처럼 변형된 SQL이 발생할 수 있다는 것이다)

반면 Indexed Database 는 SQL 언어와는 무관하며 단순한 저장구조(Key-Value Storage)를 갖추고 있으며 간단한 자바스크립트 API 만으로도 데이터베이스 조작이 가능하여 보다 브라우저 친화적이고 표준화 작업을 쉽게 이끌 수 있다는 장점이 있다

결국 고가용성 환경이 아닌, 모바일 환경에서의 가벼운 로컬DB 컨셉은 관계형DB보다는
Indexed Database와 같은 객체기반의 비관계형 DB가 더 어울린다고 할 수 있겠다

앞서 파이어폭스와 IE9 브라우저가 Web SQL Database 를 지원하지 않는다고 하였는데,
그 이유가 바로 이들 브라우저에서는 Indexed Database 를 지원하는 것으로 방향을 잡았기 때문이다


데모 만들어 보기
Indexed Database 가 Web SQL Database 의 대안으로 그 사양 책정이 진행중이지만
Web SQL Database 역시 아직은 유효하고 효과적인 로컬 DB 이다

아이폰 및 데스크탑의 사파리 및 크롬에서 이를 지원하고 있기 때문에 무용지물은 아니다
간단한 데모를 만들어 봄으로써 사용법을 숙지하도록 하자

아래와 같이 코드를 작성하는 간략히 설명하자면,
myDB 라는 데이타베이스를 생성(오픈)하고 Test 라는 테이블을 만든다
Test 테이블에 id,name 이라는 두개의 컬럼을 가지도록 한다
이후 Test 테이블에 값을 저장하고 전체를 조회하는 데모이다

<!DOCTYPE html>
<html>
  <head>   
    <script type="text/JavaScript">
   
      var db;
      function createDB(){
        db = window.openDatabase("myDB","1.0", "테스트용DB", 1024*1024);
      }
     
      function createTable(){
        db.transaction(function(tx){
          tx.executeSql("create table Test(id,name)");
        });
      }
     
      function insertData(){
        db.transaction(function(tx){
          tx.executeSql("insert into Test values(?,?)",[txtID.value,txtName.value]);
        });
      }
     
      function selectData(){
        db.transaction(function(tx){
          tx.executeSql("select * from Test",[],
           
            function(tx,result){           
              for(var i = 0; i < result.rows.length; i++){
                var row = result.rows.item(i);
                document.getElementById('table1').innerHTML +=  "<tr><td>" + row['id'] + "</td><td>" + row['name'] + "</td></tr>";
              }           
                                  
            });
           
        });
      }
           
    </script>
  </head>
 
  <body>
 
    <button onclick="createDB()">DB 생성</button>
    <br>       
    <button onclick="createTable()">테이블생성</button>   
    <br> 
    ID: <input type="text" id="txtID"> , NAME: <input type="text" id="txtName">
    <button onclick="insertData()">데이터 입력</button>
    <br>   
    <button onclick="selectData()">데이타 조회</button>   
    <br>
    <table id="table1"></table>
  </body>
</html>


데모 실행 화면
구글 크롬 브라우저에서 데모를 실행한 모습이다
개발자 도구를 통해 로컬 DB의 정보를 확인 할 수 있다




기존에 MS SQL과 같은 DBMS와 연동해 본 경험이 있다면,
Web SQL Database의 API는 매우 친근하다는 것을 느낄 것이다
표준 SQL 질의가 그대로 적용되며 몇 가지 특징적 요소가 다를 뿐이다

DB 용량과 관련해서는 브라우저마다 설정이 다르므로 주의할 부분이다
또한 기존 생성한 테이블 스카마 변경 및 버전관리 부분은 관련 API를 찾아보도록 하자

그리고 Web SQL Database 는 기본적으로 비동기로 작업이 이루어진다
데이타베이스 관련 작업이 백그라운드에서 이루어지므로 UI에 영향을 최소화 한다
동기 API 구현방법도 스펙에 포함되어 있지만 현재 브라우저마다 지원여부가 다르며
굳이 동기형태의 구현이 필요해 보이지도 않는다. 관련 자료를 참고하도록 하자

마지막으로 Web SQL Database 역시 Web Storage 와 같이 도메인(사이트) 단위로 DB가 분리된다
즉 특정 도메인에서 생성한 DB는 다른 도메인에서는 접근할 수 없다는 것이다

참고>
http://www.html5rocks.com/tutorials/webdatabase/todo/

 

'모바일 > HTML5' 카테고리의 다른 글

[HTML5] Video & Audio  (6) 2010.08.24
[HTML5] Canvas  (3) 2010.08.19
[HTML5] 오프라인 웹 어플리케이션  (0) 2010.08.12
[HTML5] Web Storage  (1) 2010.08.11
[HTML5] 드래그 앤 드롭 (Drag & Drop)  (3) 2010.08.10

[HTML5] 오프라인 웹 어플리케이션

Posted in 모바일/HTML5 // Posted at 2010. 8. 12. 16:22
728x90

인터넷 연결 없이 웹 사이트를 사용한다?
인터넷에 연결이 되어 있지 않은 상황에서 웹 사이트를 이용하는 것을 상상해 본 적이 있는가?
웹 사이트는 인터넷 연결을 기반으로 하는 WWW 서비스이다
따라서 네트워크 저 넘어에 있는 웹 사이트에 접속하기 위해서는 인터넷 연결이 필수이다

그러나 HTML 5 는 이러한 웹의 룰(rule)을 깨(?) 버렸다

HTML 5 에서는 인터넷 연결 없이 웹 사이트 이용이 가능한 스펙들을 포함하고 있다
오프라인 웹 실현의 중심이 되는 스펙이 바로 어플리케이션 캐시(Application Cache) 이다

구글의 캘린더 서비스를 사용해 본 적이 있는가?
오프라인 웹 어플리케이션의 전형적인 예이기도 한 구글 캘린더는,
일정 관리를 제공해 주는 서비스인데 인터넷 연결 없는 오프라인 환경에서도 사용이 가능하다
(물론 읽기 전용으로만 사용이 가능하다)

 
 
   
구글 Gears 를 이용하여 오프라인 환경을 지원하는데, 인터넷이 연결되지 않은 상태에서도
캘린더 페이지를 실행할 수 있고 일정 목록을 조회할 수 있다 (오프라인 캘린더는 읽기 전용이다)
구글 캘린더 뿐만 아니라 구글 독스(Docs), Gmail 등이 오프라인 환경을 지원한다

웹 사이트가 혹은 웹 사이트의 어떠한 기능이,
오프라인에서 동작 가능하다는 것은 웹을 기반으로 하는 서비스 분야에 많은 장점을 가져다 준다

인터넷이 연결되어 있지 않아도 서비스를 이용할 수 있다는 확장성과 서버와의 통신을 줄여
네트워크 트래픽을 감소한다는 성능적 장점도 취할 수 있다

특히 이동성이 부각되는 모바일 환경에서는 더욱 매력적인 환경일 것이다
모바일 환경은 언제 네트워크가 끊길지 모르는 특징이 있으며 경량의 트래픽은 매우 중요한 이슈이다


어플리케이션 캐시(Application Cache) 개요
HTML 5 의 어플리케이션 캐시는 html, css, js 파일 및 이미지 파일, 폰트 파일 등
웹 페이지를 구성하는 각종 웹 리소스들을 클라이언트 단 다운로드 해서 캐싱해 둠으로써
인터넷 접속 없이 해당 리소스들을 이용할 수 있도록 하는 기술이다

매니페스트라는 일종의 구성파일에 캐시 될 웹 리소스를 (개발자가) 정의할 수 있으며
이 구성파일을 메인 페이지(혹은 서비스 되는 어떤 페이지)에 명시하는 것 만으로 
어플리케이션 캐시가 자동으로 동작한다. 매우 심플하다

매니페스트 파일에는 캐시될 리소스 이외에도 반드시 네트워크를 통해서만 접근 가능한
리소스를 별도로 지정할 수 있으며 존재 하지 않는 리소스 요청에 대한 대체 리소스 지정도 가능하다

또한 어플리케이션 캐시와 관련된 여러 유용한 자바스크립트 API를 제공해 주는데,
캐싱 상태 조회, 캐시 갱신, 각종 캐시 관련 이벤트 등이 있다

이러한 API를 이용하면 어플리케이션 캐시 동작을 보다 세세하게 제어할 수 있게 된다


임시 인터넷파일과 어플리케이션 캐시
HTML 5 이전 환경에서도 웹 브라우저에서 임시 인터넷파일이라는 장치를 두어
클라이언트에 웹 리소스를 다운로드 해 두고 인터넷이 아닌 하드디스크로부터
리소스를 액세스 하는 매커니즘이 제공된다.
이렇게 함으로써 동일한 웹 리소스 요청은 웹이 아닌 로컬 파일을 액세스 하게 되어
성능을 향상시킨다

아래 그림은 IE 의 임시 인터넷파일에 대한 설정 화면이다


뭔가... 어플리케이션 캐시와 유사한 느낌이지 않는가?
어플리케이션 캐시 역시 웹 리소스를 클라이언트에 다운로드 해서 웹이 아닌 로컬 자원을
사용하는 것이니 말이다

그러나 여기에는 핵심적인 차이가 있다
바로 '오프라인 사용이 가능한가?' 라는 것이다

임시 인터넷파일과 어플리케이션 캐시의 차이점을 살펴 보자

- 오프라인 사용이 가능한가?
어플리케이션 캐시의 가장 핵심적인 컨셉은 오프라인 어플리케이션이 가능하다는 것이다

기존 임시 인터넷파일이 비록, 웹 리소스를 클라이언트에 다운받아 두고 
이를 사용한다고 해도 오프라인 상황에서는 무용지물이라는 점이다

다시말해, 임시 인터넷파일도 html, css, js, 이미지 파일 등이 클라이언트에 캐시되지만
버전의 변경 체크를 위해 온라인을 통해 각 파일의 변경 여부를 매번 확인한다는 것이다
브라우저는 웹에 있는 리소스와 로컬에 있는 리소스를 비교하여 변경이 없으면 캐시된 리소스를
이용하고 변경되었으면 웹에서 다시 다운로드 받도록 한다

반면 어플리케이션 캐시는 최초 한번만 다운로드 되면 이후로는 각 파일의 변경 체크를 위해
온라인을 확인하지 않는다

결과적으로 어플리케이션 캐시는 인터넷 연결이 완전히 끊긴 상황에서도 잘 동작하지만
임시 인터넷파일은 온라인일 때에만 정상 동작하게 되는 것이다

- 모든 파일을 확인 하는가?
임시 인터넷파일이 경우 캐시된 모든 리소스에 대한 변경 사항을 체크 하지만
어플리케이션 캐시는 매니페스트 파일의 변경만 체크한다
따라서 캐시된 모든 파일을 확인하는 것보다 효과적이라 할 수 있다

- 캐시 항목의 설정이 자유로운가?
임시 인터넷파일이 경우 웹 브라우저가 알아서 리소스들을 캐시한다
이는 웹 사이트 설계자나 개발자가 개입할 여지가 별로 없다는 것이다
반면 어플리케이션 캐시는 캐시될 항목과 그렇지 않은 항목을 자유자재로 지정할 수 있다

- 기타 캐시 관련 세세한 조작이 가능한가?
앞서 살펴본대로, 어플리케이션 캐시를 위한 다양한 자바스크립트 API가 존재한다
이는 캐시와 업데이트, 캐시 발생 간 이벤트 제어 등이 가능하여 보다 세밀한 제어를 할 수 있다


몇 가지 차이점을 알아봤지만 궁긍적인 차이점은
오프라인 웹 어플리케이션이 가능한가 여부에서 판가름 난다고 할 수 있다


브라우저 지원 현황
어플리케이션 캐시를 지원하는 브라우저 현황을 살펴보자
아래 표는 http://caniuse.com/ 에서 제공하는 브라우저(버전)별 어플리케이션 캐시 지원 표이다




대부분의 브라우저에서 어플리케이션 캐시를 지원하고 있다

그리고 표 하단의 Note 에서도 나와 있듯이,
아이폰의 사파리에서 테스트를 해 보니 정상적으로 동작하는 것을 확인하였다

다음의 코드로 브라우저 지원 여부를 체크해 볼 수 있다

if( !!window.applicationCache ) {
    alert("현재 브라우저는 어플리케이션 캐시를 지원합니다")
}
else{
    alert("현재 브라우저는 어플리케이션 캐시를 지원하지 않습니다")
}



캐시 매니페스트(Cache Manifest) 파일
어플리케이션 캐시의 동작에 핵심이 되는 파일이다
이 파일의 특성과 작성 방식을 아는 것이 곧 어플리케이션 캐시를 아는 것과 다름이 없다

캐시 매니페스트는 실제로 캐시될 웹 리소스에 대한 정의를 포함하는 일종의 설정파일이다
브라우저는 이 파일에 명시된 리소스를 기반으로 로컬 캐시 항목을 결정한다

또한 캐시된 리소스가 서버에서 업데이트 되었다면 이를 다시 새 버전으로 캐시해야 하는데
이 역시 캐시 매니페스트 파일의 업데이트 여부가 기준이 된다

 그럼 가장 간단한 형태의 매니페스트 파일 예를 보자

CACHE MANIFEST
# Version 1.0.0.0
ac.html
ac.js
ac.css

매니페스트 파일의 확장자는 .manifest 로 하고, 첫줄은 CACHE MANIFEST 라고 정의해야 한다
그리고 그 아래로 캐시될 웹 리소스들을 정의한다(각 항목은 줄바꿈으로 구분됨)
(#... 은 파일의 주석이다)

그리고 메인페이지(혹은 어떤 페이지)에서 매니페스트 파일을 지정해 주면 된다
이후 이 페이지가 호출 되면 캐시는 동작하게된다

<!DOCTYPE html>
<html manifest="cache.manifest">
 ....


캐시 매니페스트파일과 MIME 타입
클라이언트의 웹 브라우저는 매니페스트 파일을 기준으로 캐시 여부를 판단한다
따라서 매니페스트 파일은 클라이언트가 접근할 수 있어야 하며 파일의 MIMIE 타입을 
알맞게 설정해 줘야 한다

마이크로 소프트의 웹 서버인 IIS 의 경우 인터넷서비스 관리자 화면에서 MIME 타입 설정이 가능하다
.manifest 확장자에 대한 MIME 타입을 text/cache-manifest 로 설정한다


캐시 매니페스트 파일의 3가시 섹션
캐시 매니페스트 파일에는 캐시될 리소스 지정 이외에도
대체 리소스 및 반드시 온라인 액세스를 해야 하는 리소스의 지정도 가능하다

CACHE 섹션
가장 핵심이 되는 섹션이다. 클라이언트에 캐시되어야 할 항목을 지정한다
Cache 섹션으로 지정된 웹 리소스는 오프라인에서도 접근이 가능하게 된다
섹션의 기본값이다. 즉 섹션을 직접 명시하지 않으면 기본적으로 CACHE 섹션이 된다

그리고 CACHE 섹션에 명시하지 않아도 자동으로 캐시되는 파일이 있는데,
바로 manifest  속성을 지정한 html 파일이다

NETWORK 섹션
CACHE 섹션과 반대 되는 개념이다. 반드시 온라인 상태에서만 접근 가능한 항목을 지정한다
업데이트가 매우 잦거나 동적으로 변화하는 웹 리소스를 지정할 때 유용하다

FALLBACK 섹션
대체 리소스를 지정하는 섹션이다
요청한 URL에 해당하는 리소스가 존재하지 않을 때 이를 대신해서 표시할 리소스를 지정한다
다른 요소와는 달리 (공백 혹은 탭을 기준으로) 좌/우 쌍으로 지정한다

예) 다음은 home 폴더에 요청한 리소스가 없을 경우 fallback.html 이 대체리소스로 사용되는 예이다

FALLBACK:
./home   fallback.html

섹션의 기본 값은 CACHE 섹션이며, '섹션이름 :(콜론)' 으로 시작한다


데모 만들어 보기
이제 간단한 어플리캐이션 캐시 데모를 제작해 보자. 파일 구성은 다음과 같다

cache.manifest : 매니페스트 파일
ac.html            : HTML 파일 (manifest 속성이 지정된 페이지)
ac.js                : 자바스크립트 파일 (어플리케이션 캐시 지원 유/무를 체크하는 로직 포함)
ac.css             : 스타일시트 파일 (문자열을 박스로 감싸는 간단한 스타일 지정)
mkex.jpg          : 샘플이미지
mkex2.jpg         : 샘플이미지2 (NETWORK 섹션 지정)

위 파일 중 mkex2.jpg 는 NETWORK 섹션으로 지정하여 반드시 온라인 상태에서만 액세스 가능하도록
설정하고 나머지 파일들은 CACHE 섹션으로 지정하여 오프라인 액세스가 가능하도록 지정한다
chace.manifest 파일과 html 파일을 아래와 같이 정의한다

- cache.manifest 파일
CACHE MANIFEST
# Version 1.0.0.0

CACHE:
ac.html
ac.js
ac.css
mkex.jpg

NETWORK:
mkex2.jpg

- ac.html 파일
<!DOCTYPE html>
<html manifest="cache.manifest">
  <head>
    <link rel="stylesheet" type="text/css" href="ac.css">
    <script type="text/JavaScript" src="ac.js"></script>
    <script type="text/JavaScript">
      var isSupportCache = supports_offline();
      if(supports_offline) {
          alert("현재 브라우저는 어플리케이션 캐시를 지원합니다")
      }
      else{
          alert("현재 브라우저는 어플리케이션 캐시를 지원하지 않습니다")
      }
    </script>
  </head>
  <body>
    <div class='etcBox'> Hello, Application Cache !  </div>    
    <img src="mkex.jpg"><br>
    <img src="mkex2.jpg"><br>
  </body>
</html>


예제 실행(온라인 상태에서 첫 실행)
이제 온라인 상태에서 데모 페이지를 실행해 보자
파이어폭스 브라우저에서 데모를 처음 실행하면 다음과 같이 오프라인을 허가할지 여부를 묻게 된다



메니페시트 파일에 지정된 URL은 같은 도메인으로 제한된다

따라서 데모를 처음 실행하면 해당 도메인에 대한 오프라인 액세스 허용 유/무를 묻는 것이다

'허가'를 선택하면 브라우저는
매니페스트 파일을 다운로드 하여 그 안에 명시된 각 CACHE 섹션 항목들에 대해 로컬 캐싱을 해 둔다
이후 CACHE 섹션의 항목들은 로컬에 캐싱된 것을 이용하게 된다


오프라인 상태에서 다시 실행
해당 페이지를 다시 실행해 보는데, 이번에는 오프라인 상태에서 실행 해 보자
네트워크가 차단된 상태에서 해당 페이지를 호출해도 문제없이 실행되는 것을 알 수 있다
(해당 페이지는 물론 스타일 시트, 스크립트 로직이 모두 정상 동작한다)

즉 온라인이 아닌 오프라인에 캐시된 리소스를 이용하기 때문에 네트워크 접속 없이도 가능하게 된 것이다 (참고로 인터넷 임시파일은 오프라인 상태에서는 무용지물이다)

다만 캐시 매니페스트파일의 NETWORK 섹션에 지정한 mkex2.jpg 이미지는 표시되지 않았다
NETWORK 섹션은 반드시 온라인 상태에서만 접근 가능한 항목이기에 당연하다

참고>
파이어폭스의 '오프라인으로 작업' 메뉴를 통한 오프라인 테스트는 정상동작 하지 않았다
실제로 네트워크 카드를 '사용 안함'으로 하여 테스트를 수행 해 보았다


캐시 업데이트
매니페스트 파일에 지정된 CACHE 섹션 항목들은, 첫 요청 이후 모든 재 요청은 로컬에서 처리된다
즉 a.html 파일이 캐시되었다면 앞으로 이 파일에 대한 모든 액세스는 클라이언트에 캐시된 것이
이용되며 서버로의 요청은 이루어 지지 않는다

만일 a.html 파일이 서버에서 업데이트 되었다면 이를 반영할 수 있어야 하는데
이때에도 역시 캐시매니페시트 파일이 기준이 된다

브라우저는 캐시된 모든 항목들의 변경 사항을 일일이 확인하는 대신
캐시매니페스트 파일의 변경 사항만을 확인하여 캐시 업데이트 여부를 판단한게 된다


매 요청시 마다 캐시매니페스트 파일의 변경 여부를 확인하여,
이 파일이 변경 된 경우 모든 캐시 항목들을 다운로드하여 다시 캐싱 하는 것이다

따라서 클라이언트에 캐시된 리소스를 업데이트 하기 위해서 캐시매니페스트 파일을 변경하면 된다

캐시 매니페스트 파일의 버전(주석) 을 통한 업데이트 관리
캐시 업데이트가 매니페스트 파일의 변경을 기준으로 하기 때문에 이 파일의 업데이트 관리 방법
염두해 둘 필요가 있다.

캐시 업데이트가, 매니페시트 파일에 정의된 파일명의 변경이나 추가,제거라면 매니페스트 파일을
직접 수정하면 되지만, 기존 캐시된 파일안의 내용만 변경된다면 파일명 변경이 일어나지 않기 때문에
딱히 매니페시트 파일을 수정할 것이 없게 된다.

그러나 캐시는 업데이트 되어야 하므로 매니페스트파일을 어떤 식으로든 수정을 해야 한다
(그래야 브라우저는 캐시를 업데이트 할 것이다)

따라서 이런 저런 경우를 다 포함하는 방법이 바로,
매니페스트 파일에 버전 문자열을 주석으로 정의해 두는 것이다

앞서 데모에서도 매니페스트파일에 버전번호를 주석으로 달았는데,
이것이 바로 캐시 업데이트를 위한 것이다. 이렇게 버전 번호를 업데이트 시 마다 변경해 주면
매니페스트파일이 변경된 것과 같으므로 브라우저에게 다시 캐시하도록 할 수 있게 되는 것이다


어플리케이션 캐시 관련 스크립느 API
어플리케이션 캐시는 기본적으로 매니페스트파일을 기준으로 동작하지만
추가 세세한 제어를 위해 스크립트 API 및 몇 가지 이벤트를 지원한다

어플리케이션 캐시 API 의 핵심객체는 applicationCache 객체이며
이 객체의 status 속성으로 캐시 상태를 점검할 수 있다
또한 update() 함수로 캐시 업데이트를 명시적으로 수행할 수 있으며
updaterdady 이벤트를 수신하여 최신 캐시를 얻은 시점을 제어할 수 있다
더불어 업데이트 에러를 알려 주는 error 이벤트, 캐시 완료를 알려 주는 cached 이벤트 등이 있다

또한 progress 이벤트는 업데이트 진행 중에 발생함으로 이 이벤트를 이용하면, 대량 캐시 업데이트 시
진행상태바와 같은 도우미 UI를 제공할 수 있게 된다

기타 몇 가지 유용한 API 와 이벤트가 제공되니 캐시 업데이트를 더욱 세세하게 제어하고 싶으면
관련 자료를 참조하기 바란다


진정한 오프라인 웹 어플리케이션
어플리케이션 캐시가 오프라인 웹 어플리케이션의 근간이 되는 기술이긴 하지만,
보다 철저한 오프라인을 지원하기 위해서는 뭔가 부족함이 있어 보인다

인터넷 연결을 끊어 졌을 때,
URL을 기반으로 하는 웹 리소스에 대한 오프라인 액세스 뿐만 아니라
데이터 조회, 수정, 삭제 등 동적 데이터 관리도 가능하게 하려면 이 기술만으로는 부족하다

동적 데이터 관리를 오프라인 상태에서도 가능토록 하려면, 클라이언트 저장소 기술이 접목되어야 하는데 HTML 5 의 스펙 중 Web Storage, Web Database 등이 이 시나리오에 적합해 보인다

따라서 진정으로 동적 동작이 가능한 오프라인 웹 어플리케이션을 개발하기 위해서는
어플리케이션 캐시와 더불어 Web Storage, Web Database 와 같은 클라이언트 저장소 기술을
같이 사용해야 할 것이다


참고> 리소스가 캐시되는 위치
어플리케이션 캐시는 서버의 리소스를 오프라인에서 사용할 수 있는 것이기 때문에
클라이언트 PC 어딘가에는 해당 리소스를 저장해 둘 필요가 있다
이는 브라우저마다 조금씩 그 위치가 다르긴 하지만 폴더의 구조만 봐도 어느정도 알 수 있다

이 글이 테스트된 파이어폭스의 경우 아래와 같은 경로에 위치하고 있다
(현재 나의 PC 기준이다)
C:\Documents and Settings\사용자이름\Local Settings\Application Data\Mozilla\Firefox\Profiles\o5ywhov7.default\OfflineCache

참고>
http://www.html5rocks.com/tutorials/appcache/beginner/


 

 

'모바일 > HTML5' 카테고리의 다른 글

[HTML5] Canvas  (3) 2010.08.19
[HTML5] Web SQL Database  (0) 2010.08.17
[HTML5] Web Storage  (1) 2010.08.11
[HTML5] 드래그 앤 드롭 (Drag & Drop)  (3) 2010.08.10
[HTML5] Geolocation  (1) 2010.08.09

[HTML5] Web Storage

Posted in 모바일/HTML5 // Posted at 2010. 8. 11. 12:46
728x90

클라이언트에 데이터를 저장하다
HTML 5 에는 웹 사이트의 데이터를 클라이언트에 저장할 수 있는 새로운 자료구조인
Web Storage(웹 스토로지) 스펙이 포함되었다

Web Storage 의 개념은 심플하다
'키/ 값' 쌍으로 데이터를 저장하고 키를 기반으로 데이터를 조회하는 패턴이다

그리고 영구저장소(localStorage) 와 임시저장소(sessionStorage)를 따로 두어
데이터의 지속성을 구분할 수 있어 응용 환경에 맞는 선택이 가능하다

Web Storage 는 기존 웹 환경의 쿠키(Cookie)와 매우 유사한 개념이다
사실 거의 차이가 없어 보이기도 하다. 다만 몇 가지 쿠키의 단점를 극복하는 개선점이 도입되었다

그럼 쿠키(Cookie)는?
쿠키는 여전히 유효하고 꽤 적절한 클라이언트 저장도구 이다
HTML 5 에서 Web Storage 스펙을 새로 추가했지만 쿠키를 배제하는 것은 아니다
HTML 5 환경에서도 여전히 쿠키를 이용할 수 있다
다만 어떤 것을 사용할 지는 사용자 선택의 몫이라 하겠다

Web Storage 차이점 (쿠키의 단점?)

- 쿠키는 매번 서버로 전송 된다
웹 사이트에서 쿠키를 설정하면 이후 모든 웹 요청은 쿠키정보를 포함하여 서버로 전송된다
Web Storage 는 저장된 데이터가 클라이언트에 존재할 뿐 서버로 전송은 이루어지지 않는다
이것은 네트워크 트래픽 비용을 줄여 준다는 주요한 장점이 되겠다

- 단순 문자열을 넘어 (스크립트) 객체정보를 저장할 수 있다
문자열 기반 데이터 이외에 체계적으로 구조화된 객체를 저장할 수 있다는 것은 개발 편의성을
제공해 주는 주요한 장점이 된다. 브라우저의 지원 여부를 확인해 봐야 하는 항목이다

- 용량의 제한이 없다
쿠키는 개수와 용량에 있어 제한을 걸어 두고 있다
하나의 사이트에서 저장할 수 있는 최대 쿠키 수는 20 개이다. 그리고 하나의 사이트에서 저장할 수 있는 최대 쿠키 크기는 4KB 로 제한되어 있다. Web Storage 는 이러한 제한이 없다
(그러나 쿠키도 하위키를 이용하면 이러한 제한을 일부 해소할 수 있다.
 그리고 대부분의 시나리오에서 쿠키의 제한으로 까지 데이터를 저장할 일이 없다)

- 영구 데이터 저장이 가능하다
쿠키는 만료일자를 지정하게 되어 있어 언젠가 제거된다.
만료일자로 지정된 날짜에 쿠키는 제거되는 것이다.(만료일자를 지정하지 않으면 세션 쿠키가 된다)

만일 영구 쿠키를 원한다면 만료일자를 굉장히 멀게 설정하여 해결하기도 하였다
(그러나 과연 수 년이 지나도록  쿠키가 유지되어야 할 필요가 있을까?)

WebStorage 는 만료기간의 설정이 없다. 즉 한번 저장한 데이터는 영구적으로 존재하는 것이다
이것이 특별히 장점이 되는지는 잘 모르겠지만 쿠키와의 차이점이라는 것은 분명하다
-----

쿠키와 WebStorage 의 차이점과 개선사항에 대해 알아 보았는데 개인적으로,
Web Storage 가 쿠키보다 훨씬 좋은 이유는 없다고 본다.
다만 한가지 매번 서버로 전송되지 않는다는 특징은 꽤나 유용해 보인다
(특히 경량 환경인 모바일에서는 더욱 더)

그리고 쿠키는 더 상세한 설정이 가능해 어떤 환경에서는 더 적합해 보이기 까지 한다
쿠키에 대한 자세한 내용은 다음의 글을 참고하도록 하자
=> Cookie 제대로 알고 사용하자


로컬 스토로지(localStorage)와 세션 스토로지(SessionStorage)

Web Storgae 는 데이터의 지속성과 관련하여 두 가지 용도의 저장소를 제공한다

우선 기본적으로 Web Storage 는 쿠키와 마찬가지로 사이트의 도메인 단위로 접근이 제한된다
다시말해, A 도메인에서 저장한 데이터는 B 도메인에서 조회할 수 없다는 것이다
이것은 데이터의 보안적 측면에서 당연한 원칙이라 하겠다

- 로컬 스토로지
로컬 스토로지 저장한 데이터를 (명시적으로) 지우지 않는 이상 영구적으로 보관한다
앞서 말한대로, 도메인마다 별도로 로컬 스토로지가 생성된다
windows 전역 객체의 localStorage 라는 컬렉션을 통해 저장/조회가 이루어진다

- 세션 스토로지
세션스토로지는 데이터의 지속성과 액세스 범위에 특수한 제한이 존재한다
세션스토로지는 windows 전역 객체의 sessionStorage 라는 컬렉션을 통해 저장/조회가 이루어진다

데이터 유지 측면:
세션 스토로지는 데이터가 지속적으로 보관되지 않는다
이는 마치 브라우저 기반 세션 쿠키와 그 성질이 비슷한데, 현재 페이지가 브라우징 되고 있는
브라우저 컨텍스트 내에서만 데이터가 유지된다

로컬 스토로지는 브라우저를 종료해도 데이터는 보관되어 다음번 접속에도 그 데이터를
사용할 수 있는 반면, 세션 스토로지는 브라우저가 종료되면 데이터도 같이 지워진다.
브라우저가 종료되면 세션 스토로지도 삭제된다는 것이다

데이터 범위 측면:
세션 스토로지 역시 Web Storage 의 기본 보안 처럼 도메인별로 별도로 생성된다
여기에 더불어 세션 스토로지는 같은 사이트의 같은 도메인이라 할지라도 브라우저가 다르면
서로 다른 영역이 된다(즉 브라우저 컨텍스트가 다르다)

탭 브라우징이나 브라우저를 하나 더 실행해서 같은 페이지를 실행했을 때,
이 두 페이지의 세션 스토로지는 각각 별개의 영역으로 서로 침범하지 못한다는 의미이다
(도메인만 같으면 전역적으로 공유 가능한 로컬스토로지와 구분되는 특징이라 하겠다)


브라우저 지원 현황
아래 표는 http://caniuse.com/ 에서 제공하는 브라우저(버전)별 Web Storage 지원 표이다
(데스크탑 용 브라우저 기준이다)





대부분의 브라우저에서 Web Storage 를 지원하고 있다
특이한 것은 MS의 IE 의 경우 8.0 까지는 대부분의 HTML5 신기능이 지원되지 않는 반면
Web Storage 는 IE 8.0 에서도 지원하는 것으로 나와있다

그리고 아이폰의 사파리에서 테스트를 해 보니 정상적으로 동작하는 것을 확인하였다

다음의 코드로 브라우저 지원 여부를 체크해 볼 수 있다

if( ('localStorage' in window) && window['localStorage'] !== null) {
    alert("현재 브라우저는 WebStorage를 지원합니다")
}
else{
    alert("현재 브라우저는 WebStorage를 지원하지 않습니다")
}


Web Storage 데모 만들어 보기
로컬스토로지와 세션스토로지를 이용하는 간단한 데모를 만들어 보자
<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript">                     
      //로컬스토로지에 저장               
      function setLocalStorage(){
        var textBox = document.querySelector('#textBox1');
        window.localStorage['key1'] = textBox.value;
      }     
      //로컬스토로지 조회
      function getLocalStorage(){
        var textBox = document.querySelector('#textBox2');
        textBox.value = window.localStorage['key1'];
      }
     
      //세션스토로지에 저장
      function setSessionStorage(){
        var textBox = document.querySelector('#textBox3');
        window.sessionStorage['key1'] = textBox.value;
      }     
      //세션스토로지 조회
      function getSessionStorage(){
        var textBox = document.querySelector('#textBox4');
        textBox.value = window.sessionStorage['key1'];
      }   
    </script> 
  </head>
  <body> 
    <input type="text" id="textBox1">
    <button onclick="setLocalStorage()">로컬스토로지 저장</button>
    <br>   
    <input type="text" id="textBox2">
    <button onclick="getLocalStorage()">로컬스토로지 조회</button>   
    <hr>   
    <input type="text" id="textBox3">
    <button onclick="setSessionStorage()">세션스토로지 저장</button>
    <br>   
    <input type="text" id="textBox4">
    <button onclick="getSessionStorage()">세션스토로지 조회</button>         
  </body>
</html>


아래는 실행화면인데 로컬스토로지와 세션스토로지의 저장소가 각각 분리되어 있는 것을 알 수 있다
그리고 각 스토로지에 Local Files 라고 되어 있는 것은 현재 데모 실행 환경이
로컬 파일 기반인 file//..... 로 되어 있기 때문이다
만일 특정 도메인에서 실행한다면 Local Files 대신 도메인 명이 나타날 것이다

그리고 새로운 탭을 열어서 같은 페이지를 실행 해 보면,
이전 탭 페이지에서 실행한 로컬스토로지 값은 여전히 유효한 반면
 세션스토로지는 서로 공유되지 않고 별도의 저장소를 따로 가진다는 것을 알 수 있다



세션 스토로지와 새창(window.open)
앞서 세션 스토로지는 탭 브라우징이나 새로 실행한 브라우저끼리는 별도의 저장 영역이라 하였다
그렇다면 페이지에서 window.open으로 생성한 새로운 창과 기존 창과의 세션 스토로지 공유는 어떨까?

실제로 어떤 페이지에서 프로그램 논리에 의해 open 하는 창은 물리적으로는 새창이지만,
논리적으로 전혀 별개의 창이라 볼 수 없다.
즉 세션 스토로지 데이터가 이 둘간의 공유가 이루어지는 것이 더 합당해 보인다는 말이다

HTML5 Web Storage 은 이러한 경우 조금 중간적 적인 입장을 취하고 있는 듯 하다
즉 windows.open 으로 띄운 새 창은 새로운 브라우저 컨텍스트로 인식하여
세션스토로지가 따로 생성,관리되지만 최초 데이터는 복사되어 진다는 것이다

다시말해 A 페이지에서 저장한 세션스토로지 값이 새창을 띄울 때 복사되어 전달되고
이후부터는 이 둘의 영역은 전혀 별개의 영역이 된다는 것이다 

결국 세션 스토로지는 각각의 브라우저(윈도우, 창, 실제로는 브라우저 컨텍스트)는 서로 독립된
각각의 세션 스토로지를 가진다는 특징이 있는 것
이다


클라이언트에서는 값을 얼마든지 수정할 수 있다
Web Storage 의 보안은 서로 다른 도메인의 데이터 침범을 막고는 있지만 클라이언트,
즉 사용자를 막고 있지는 않다. 클라이언트는 얼마든지 저장된 값을 (임의로) 수정할 수 있다
이것은 이전 쿠키와 완전 동일한 개념이다

아래 그림은 구글 크롬 브라우저에서 개발자 도구를 실행한 모습인데,
Wb Storage 에 저장된 값을 수정하거나 삭제 할 수 있는 것을 알 수 있다



클라이언트가 저장된 값을 임의로 변경 할 수 있다는 것은 쿠키와 동일한 개념으로 별다른 보안 취약점을 더 가진 것은 아니다. 따라서 웹 사이트 개발자는 사용자에 의한 이러한 임의 변경에 항상 예의 주시하고 방어 코드의 작성을 잊지 말아야 하겠다

다음의 사이트에서 추가 내용과 데모를 확인해 보기 바란다
http://www.ibm.com/developerworks/kr/library/x-html5mobile2/
http://html5demos.com/storage

'모바일 > HTML5' 카테고리의 다른 글

[HTML5] Web SQL Database  (0) 2010.08.17
[HTML5] 오프라인 웹 어플리케이션  (0) 2010.08.12
[HTML5] 드래그 앤 드롭 (Drag & Drop)  (3) 2010.08.10
[HTML5] Geolocation  (1) 2010.08.09
[HTML5] Web Workers (웹 워커)  (1) 2010.08.05

[HTML5] 드래그 앤 드롭 (Drag & Drop)

Posted in 모바일/HTML5 // Posted at 2010. 8. 10. 17:27
728x90

끌어다 놓기(드래그 앤 드롭, Drag & Drop)
끌어다 놓기는 사용자 편의성을 고려한 편리한 UI 기능이라 할 수 있는데,
아래 그림에서 보는 바와 같이 영역 A -> 영역 B로 특정 콘텐트를 마우스로 이동하는 것을 말한다



아래 그림은 구글 캘랜더에서 할일목록을 드래그 앤 드롭을 통해 다른 날짜로 이동하고 있는 모습이다


이러한 UI의 사용자 액션은 직관적이며 편리한 기능이다. 
윈폼 닷넷과 같은 윈도우 응용프로그램에서는 드래그 앤 드롭과 관련된 API 가 이미 제공되고 있다
그러나 웹 환경에서는 지금까지 전용 API는 제공되지 않고 유사 구현을 위해 복잡한 자바스크립트
이벤트(mouse 관련 이벤트를 직접 구현함)를 다루어야 했다

HTML 5 의 Drag & Drop API
HTML 5 에는 드래그 앤 드롭을 위한 전용 API 가 제공된다
이 API는 기존 윈도우 응용프로그램의 드래그 앤 드롭 API와 개념적으로 상당히 유사하다
과거처럼 자바스크립트의 마우스 관련 이벤트와는 전혀 상관이 없으며 
드래그 대상, 드롭 대상, 이동 콘텐트 등의 정보를 기반으로 동작한다

또한 웹 페이지 내 콘텐트의 이동 뿐만 아니라 웹 페이지 간, 웹 페이지와 다른 응용프로그램 간
드래그 앤 드롭이 가능
하기 때문에 이전 웹 환경과는 완연히 구분되는 기능이라 할 수 있겠다


지원되는 브라우저 현황
아래 표는 http://caniuse.com/ 에서 제공하는 브라우저(버전)별 Drag & Drop 지원 표이다
(데스크탑 용 브라우저 기준이다)




위 표를 보면 파이어폭스, 사파리, 크롬은 지원한다고 나와 있는 반면,
막상 테스트를 해 보니 파이어폭스를 제외하고는 제대로 동작하지 않았다
(크롬, 사파리 최선 버전 브라우저에서 Drag & Drop 정상 동작 하지 않음)
(표에서는 지원된다고 나와 있으니 조금 더 확인이 필요 할 것 같다)

그리고 아이폰의 사파리도 지원하지 않는 것으로 보인다
아이폰 사파리 브라우저에서 테스트를 해 봤지만 전혀 동작하지 않았다


Drag & Drop API
대부분의 HTML 5 스크립트 API들은 고도로 추상화 되었기 때문에 매우 사용하기가 쉽다
드래그 앤 드롭 API 역시 이용하는 데 어려움이 없으며 기존 윈도우 응용프로그램의 API 개념과
상당부분 유사하다. 드래그 앤 드롭 API 이해를 위해서는 다음의 것들을 이해하면 된다

- 드래그 대상(Source)
드래그 대상은 말 그대로 끌어올 것에 해당한다.
HTML 요소에 draggable 속성 값을 true로 설정하면 드래그 대상이 될 수 있다

- 드롭 대상(Target)
드롭 대상은 말 그대로 끌어다 놓을 곳에 해당한다
HTML 요소들의 기본 값은 드롭을 받아 들이지 않게 되어 있다
따라서 드롭이 가능하도록 설정하려면 이벤트의 preventDefault() 함수로 기본 값을 취소해야 한다

- 드래그 데이터(Data)
드래그 데이터는 말 그대로 이동할 대상 콘텐트에 해당한다.
이동할 데이터는 DataTransfer 객체를 통해 이루어 지는데
드래그 대상에서 이 객체에 값을 저장하고 드롭 대상에서 이 객체의 값을 꺼내어 오는 방식이다

- 드롭 이벤트들
드래그 앤 드롭과 관련해 총 7가지 이벤트가 존재한다
이 이벤트들은 드래그 앤 드롭 과정에서 (거의) 순차적으로 발생하며 드래그,드롭 대상에서
자신에게 맞는 이벤트 처리를 해 주면 된다

: dragstart 이벤트
드래그 대상에서 정의해야 하는 이벤트 이다
드래그가 시작될 때 발생하며 드래그 대상에서는 이 이벤트를 수신하여 이동할 데이터를 DataTransfer 객체에 채우게 된다

: dragenter 이벤트
드롭 대상에서 정의해야 하는 이벤트이다
이동할 데이터를 마우스로 끌어서 드롭 대상에 들어 오는 순간 발생한다

: dragover 이벤트
드롭 대상에서 정의해야 하는 이벤트이다
이동할 데이터를 마우스로 끌어서 드롭 대상에 올려 놓는 동안 계속해서 발생하는 이벤트이다

: drop 이벤트
드롭 대상에서 정의해야 하는 이벤트이다
마우스로 끌어서 놓는 순간 발생한다. 드롭 대상에서는 이 이벤트르 수신하여
DataTransfer 객체로부터 데이터를 꺼내 오고 드롭 대상에 끼워 넣는 작업을 하게 된다

이외에도 drag 이벤트, dragleave 이벤트, dragend 이벤트 등이 추가로 존재하지만
위에 설명한 4가지 이벤트로 기본적인 드래그 & 드롭 구현이 가능하다


Drag & Drop 데모 만들어 보기
이제 간단한 드래그 앤 드롭 데모를 만들어 보자
문서 내에서 select 박스 간 데이터를 이동하는 예제이다
(아래 코드는 시라이시 슌페이의 HTML5 & API 입문 책의 소스코드를 기반으로 했음을 밝힌다)

<!DOCTYPE html>
<html>
  <head>
  <script type="text/javascript">
 
    function onDragStart(event){
      document.getElementById("msg").innerHTML += "onDragStart->";
     
      //드래그 대상 요소가 option 일 경우에만 가능토록 함
      if(event.target.tagName.toLowerCase() == "option"){
     
        //dataTransfer 객체에 이동할 요소의 ID를 "selectOption"라는 이름으로 등록함
        event.dataTransfer.setData("selectOption", event.target.id);
      }
      else{
        //만일 드래그 대상 요소가 option이 아닐 경우 취소함
        event.preventDefault();
      }
    }       
   
    function onDragEnter(event){
      document.getElementById("msg").innerHTML += "onDragEnter->";
     
      //드래그 대상이 selectOption 일 경우에만 드롭 가능토록 설정함
      var types = event.dataTransfer.types;
      for(var i = 0; i < types.length; i++){
        if(types[i] == "selectOption"){
          event.preventDefault();
          return;
        }
      }
    }
   
    function onDragOver(event){
      document.getElementById("msg").innerHTML += "onDragOver->";
     
      //드롭이 가능하도록 기본 상태를 취소함
      event.preventDefault();
    }       
   
    function onDrop(event){  
      document.getElementById("msg").innerHTML += "onDrop";  
     
      //dataTransfer 객체로 부터 데이터를 꺼내옴
      var id = event.dataTransfer.getData("selectOption");
     
      //현재 문서객체에서 해당 요소를 가져옴
      var optionElement = document.getElementById(id);
     
      //데이터가 존재하고 드래그 대상과 드롭 대상이 같지 않을 경우 드롭 실행
      if(optionElement && optionElement.parentNode != event.currentTarget){
        //드래그 대상에서 이동할 데이터 삭제
        optionElement.parentNode.removeChild(optionElement);
       
        //드롭 대상에 데이터 추가
        event.currentTarget.appendChild(optionElement);
      }
           
      //드롭 완료 후 이벤트 버블링을 막기 위해 호출           
      event.stopPropagation();
           
    }
   
  </script>
  </head>
 
  <body>
         
    <!-- 드래그 대상 요소 -->
    <select size= 4 id="select1" ondragstart="onDragStart(event)">
      <option id="option1_1" draggable="true">옵션1-1</option> <!-- 드래그 데이터 -->
      <option id="option1_2" draggable="true">옵션1-2</option> <!-- 드래그 데이터 -->
      <option id="option1_3" draggable="true">옵션1-3</option> <!-- 드래그 데이터 -->
    </select>
   
    <!-- 드롭 대상 요소 -->
    <select size= 4 id="select2"
       ondragenter="onDragEnter(event)"
      ondragover="onDragOver(event)"
      ondrop="onDrop(event)"
>
      <option id="option2_1">옵션2-1</option>
      <option id="option2_2">옵션2-2</option>
      <option id="option2_3">옵션2-3</option>
    </select>
   
    <br><br><div id="msg"></div>
   
  </body>
</html>

소스코드의 주석에 상세히 설명을 달았지만 간단히 전체적인 흐름을 설명하자면,
드래그 대상(Source)은 왼쪽 select 박스의 option 항목들이며,
드롭 대상(Target)은 오른쪽 select 박스이다

드래그 대상인 option 요소에 draggable="true" 속성을 부여해 드래그 가능한 상태로 설정하였다
그리고 dragstart 이벤트를 구현하여 드래그 액션이 시작될 때 dataTransfer 객체에
드래그 데이터(여기서는 option 의 ID)를 저장하고 있다

드롭 대상인 오른쪽 select 박스에는 dragenter, dragover, drop 이벤트를 구현하여
preventDefault 함수 호출로 select 박스가 드롭이 가능하도록 설정하였으며
dataTransfer 객체에서 드래그 데이터(여기서는 option 의 ID)를 꺼내온다
이렇게 꺼내온 드래그 데이터를  문서객체에서 조회하여 드래그 대상에서는 제거하고 드롭 대상에
추가하는 로직으로 구성되어 있다

그리고 추가로 드래그 관련 이벤트의 호출 순서를 보기 위한 코드가 각 이벤트에 추가되어 있다

아래는 데모의 실행 화면이다. 먼저 드래그가 중에 캡쳐한 화면이며,



아래는 드래그, 드롭이 완룐된 화면이다.
select 박스 하단을 보면 드래그 관련 이벤트의 호출 흐름을 나타내고 있다



본 예제에서는 문서내 요소간 드래그&드롭을 구현해 봤지만, 문서간 문서와 다른 응용프로그램 간
드래그&드롭도 가능하다. 이는 관련 자료를 살펴 보기 바란다

마지막으로 아래 사이트에서 드래그 & 드롭 관련 데모를 추가로 확인해 보자
http://ljouanneau.com/lab/html5/demodragdrop.html
http://html5demos.com/drag


 

'모바일 > HTML5' 카테고리의 다른 글

[HTML5] 오프라인 웹 어플리케이션  (0) 2010.08.12
[HTML5] Web Storage  (1) 2010.08.11
[HTML5] Geolocation  (1) 2010.08.09
[HTML5] Web Workers (웹 워커)  (1) 2010.08.05
HTML5 Demo, A Look At HTML5 and its Canvas Tag  (0) 2010.07.29

[HTML5] Geolocation

Posted in 모바일/HTML5 // Posted at 2010. 8. 9. 15:36
728x90

HTML 5 는 위치 정보와 관련한 Geolocation 스펙을 포함하고 있다
(엄밀히 말하자면 이 스펙은 HTML Working Group 과 분리되어 있는  Geolocation Working Group
에 의해 표준화가 진행되고 있다고 한다)

Geolocatoin API를 이용하면
현재 웹 페이지가 실행되는 단말의 위도, 경도와 같은 위치 정보를 얻어 올 수 있다

Geolocation 지원 브라우저 현황
현재 IE를 제외한 대부분의 최신 웹브라우저에서 Geolocation을 지원하고 있다
아래 표는 http://caniuse.com/ 에서 제공하는 브라우저(버전)별 Geolocation 지원 표이다
(데스크탑 용 브라우저 기준이다)

MS IE 9 가 unknown 이라고 되어 있지만 아마 지원하게 될 것이다.
MS 가 HTML 5 지원을 강력히 표명하고 있기 때문이다

 




그리고 아래는 http://diveintohtml5.org/geolocation.html  에서 발췌한 브라우저 지원현황이다
아래 표를 보면 아이폰이나 안드로이드와 같은 모바일 환경에서도Geolocation을 지원한다고 나와있다
Geolocation 자체가 장치의 위치정보를 이용하는 것이기에 모바일 장치의 지원은 더 자연스럽다
(참고: 오페라 10.6 이후 지원됨)




위치 정보는 사용자 동의가 있어야 한다
웹 응용프로그램이 나의 정보를 이렇게 쉽게 얻어 갈 수 있는 것인가?
만일 그렇다면 굉장한 사회적(?) 문제가 될 것이다
따라서 사용자의 위치 정보는 반드시 사용자의 허가를 받아서 수집할 수 있도록 되어있다

브라우저에서 Geolotion API를 이용해서 위치 정보를 액세스 하려고 하면,
아래 보는 바와같이 사전 동의를 구하게 된다.(파이어폭스 예) 
만일 동의를 하지 않게 되면 나의 위치정보를 웹 응용프로그램이 알 수 없게 되는 것이다




Geolocation 데모 만들어 보기
웹 페이지에서 Geolocation API 를 이용해 위치정보를 액세스 하는 것은 매우 쉽다
내부적으로 장치가 제공해 주는 위치정보를 어떤 식으로 액세스 하는지 전혀 몰라도
가져다 쓰는 것은 아주 쉽다

navigator 에 정의된 geolocatoin 객체의 getCurrentPosition 메서드를 이용하여
콜백 메서드만 정의하면 된다. 아래는 간단한 코드 샘플이다
(위치 정보 확인 작업은  비동기로 이루어진다)

<div id="msg"></div>

<script type="text/javascript"> 
  if (!!navigator.geolocation)
  {
    navigator.geolocation.getCurrentPosition(successCallback,errorCallback); 
  }
  else
  {
    alert("이 브라우저는 Geolocation를 지원하지 않습니다");
  }
   
  function successCallback(position)
  {
    var lat = position.coords.latitude;
    var lng = position.coords.longitude;
   
    document.getElementById("msg").innerHTML = "위도" + lat + ", 경도:"+lng
  }
 
  function errorCallback(error)
  {
    alert(error.message);
  }   
</script>



그리고 이 코드를 파이어폭스에서 실행한 결과 화면이다
(데스크탑 브라우저에서 테스트 해 봤는데, 구글 크롬과 사파리의 경우 지원은 되는데 위도,경도
 정보가 불러와 지지가 않는다. 파이어폭스와 오페라, 아이폰 사파리에서 정상 동작 확인 함 )



예제를 보면 coords 로 부터 위치 정보를 읽어 들이는데 위도,경도 이외에도
표고, 위도, 경도의 오차, 디바이스 진행 속도, 진행 방향 등의 정보도 조회 가능하다
(다만 장치별 이용 가능 여부를 확인해야 함)

그리고 getCurrentPosition 은 위치 정보를 일회성으로 받아 올 때 사용하는 반면,
watchPosition 함수는 위치의 변경 정보를 계속해서 알고 싶을 경우 사용한다

즉 장치의 위치가 변경될 때 마다 계속 호출되므로 위치의 변화를 지속적으로 감지할 수 있게 된다
(역시 매 확인은 비동기로 이루어 진다) (관련 자료 참고 바람)

다음 사이트에서 Geolocation 관련 추가 학습과 데모를 확인해 보자
http://www.ibm.com/developerworks/kr/library/x-html5mobile1/
http://html5demos.com/geo
http://3liz.org/geolocation/

'모바일 > HTML5' 카테고리의 다른 글

[HTML5] Web Storage  (1) 2010.08.11
[HTML5] 드래그 앤 드롭 (Drag & Drop)  (3) 2010.08.10
[HTML5] Web Workers (웹 워커)  (1) 2010.08.05
HTML5 Demo, A Look At HTML5 and its Canvas Tag  (0) 2010.07.29
[HTML5] HTML5 개요와 기술적 특징  (5) 2010.07.21

[HTML5] Web Workers (웹 워커)

Posted in 모바일/HTML5 // Posted at 2010. 8. 5. 17:36
728x90

HTML 5 의 많은 기능 중 웹 페이지가 단순 문서 표현을 넘어 응용프로그램과 같이 동작할 수 있도록
하는 주요한 기능 중 하나가 바로 Web Workders 이다

요즘 웬만한 응용프로그램들은 멀티 프로세스, 멀티 쓰레드를 구현하고 있다
웹 페이지도 이러한 멀티 쓰레드 구현이 가능하게 된 것이다

그간 웹 페이지는 단일 쓰레드 모드에서 수행될 수 밖에 없었다
만일 값을 반환하기까지 작업이 오래 걸리는 스크립트를 수행한다면 다른 UI 작업을
스크립트 작업이 종료될 때 까지 대기해야만 했다

그러나 HTML 5 에는 Web Worker 라는 스펙을 추가 했으며 브라우저에서는 이 스펙을 기반으로
멀티 쓰레드 구동이 가능하도록 브라우저를 설계하기에 이르렀다


롱~타임(Long~ Time) 작업은 워커에게 맡기기

이제 스크립트 작업이 오래 걸린다고 해서 페이지를 멈추고 기다릴 필요가 없어졌다
웹 워커는 자바스크립트 코드를 UI 쓰레드와는 별도인 백그라운드에서 수행될 수 있도록 하는 표준적인 방법을 제공하기 때문에 웹 페이지를 가로막지 않고 스크립트를 돌릴 수 있게 되었다

다음과 같은 롱~타임 스크립트 작업에 웹워커는 안성맞춤 일 것이다
- 매우 복잡한 수학적 계산 작업
- 원격지에 있는 리소스에 대한 액세스 작업(또는 로컬 스토로지를 액세스 하는 경우)
- 백그라운드에서 조용히(?) 오랜시간 작업해야 하는 경우
- UI 쓰레드에 방해 없이 지속적으로 수행해야 하는 작업 등

사실 웹 워커 만의 지침은 없다. 일반적인 응용프로그램의 백그라운드 작업을 연상하면 된다


브라우저가 Web Worker 를 지원하나요?
HTML 5 가 아직 산업 표준이 완료된 것이 아니기에 브라우저별로 지원 여부가 상이할 수 있다
그리고 브라우저 버전별로도 지원 유/무가 다르기도 하다

따라서 웹 페이지에 웹 워커를 동작시키기 전에, 현재 페이지를 랜더링 하고 있는 브라우저가
웹 워커를 지원하는지 체크하는 것이 필수이다 (이것은 하위 호환성을 위해서도 중요하다)

브라우저의 웹 워커 지원 유/무 체크는 매우 간단한 방법으로 할 수 있다
전역 윈도우 객체의 워커(Worker) 속성을 살펴보면 된다. 아래는 샘플 코드이다

if(!!window.Worker){
      alert("이 브라우저는 웹 워커를 지원합니다")
}
else{
      alert("이 브라우저는 웹 워커를 지원하지 않습니다")
 }


Web Workers 개념도
웹 워커는 HTML 페이지에서 Worker 라는 객체를 통해 실행된다
HTML 페이지에 Worker 객체를 생성하기 위해서는 워커의 작업을 정의한 자바스크립트파일(.js)
을 Worker 객체 생성 시 전달해 줘야 한다
ex) var worker = new Worker("worker.js")

이후 롱~타임 작업은 .js 파일에 정의된 스크립트로 수행되며,
HTML 페이지와는 서로 데이터를 주고 받을 수 있는 매커니즘이 제공되는 것이다

양쪽 모두 상대에게 데이터를 송신할 때는 postMessage 라는 메서드를 이용하며
데이터를 수신할 때는 onmessage 이벤트를 통해 전달 받는다

아래 그림은 기본적인 (단일) 워커와 HTML 페이지 간 데이터 송/수신 개념도 이다





Web Workers 브라우저 지원 현황
현재 IE를 제외한 대부분의 웹브라우저에서 웹 워커를 지원하고 있다
아래 표는 http://caniuse.com/ 에서 제공하는 브라우저(버전)별 웹 워커 지원 표이다
(데스크탑 용 브라우저 기준이다)

MS IE 9 가 unknown 이라고 되어 있지만 아마 지원하게 될 것이다.
MS 가 HTML 5 지원을 강력히 표명하고 있기 때문이다






위 표는 데스크탑 버전의 브라우저 지원 현황이다
모바일 환경은 이와 좀 다를 수 있는데 대표적인 예로 사파리를 들 수 있다

사파리의 경우 데스크탑 사파리는 Web Workers 를 지원하는데 반해,
아이폰 사파리는 Web Workers 를 현재까지 지원하지 않고 있다

아이폰에 내장된 사파리의 경우 대부분의 HTML5를 지원하지만,
유독 Web Worker 는 아직 지원하지 않고 있는 것이 의아하다

현재 모바일 웹 구축 시 제일 먼저 고려되는 플랫폼이 아이폰 환경인데 말이지...


Web Workers 데모 만들어 보기
지금까지 웹 워커에 대한 개념적 내용을 살펴 보았다
그럼 이제 웹 워커를 이용한 매우 기본적인 데모 코드를 작성해 보도록 하자

웹 워커의 장점을 알려면 웹 워커를 사용하지 않을 때의 단점을 알아보고
그 단점을 웹 워커로 해결하는 식의 접근이 이해하기 보다 수월할 수 있다
따라서 먼저 웹 워커 없이 시간이 오래 걸리는 스크립트 코드를 돌려 보자

시나리오를 단순하게 하기 위해,
샘플에서는 특별히 오래 걸리는 특정 작업을 구현하기 보다는 간단하게,
주어진 시간동안 반복(loop)문을 돌리는 것으로 대신하겠다.
일종의 대기(sleep) 시간이며 다음과 같이 스크립트 함수를 작성하도록 한다

- 시간이 오래 걸리는 작업(일종의 sleep 기능)
function sleep(milliSeconds){  
    var startTime = new Date().getTime(); 
    while (new Date().getTime() < startTime + milliSeconds);
}

이제 이 코드를 HTML 페이지에 삽입하여 실행해 보도록 하자

- HTML 페이지
아래와 같이 HTML 과 스크립트를 작성한다. 대략 10초 동안 대기(sleep) 시킨다
그리고 텍스트 상자는 대기시간동안 글 작성이 가능한지 보기 위해 삽입하였다
<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript">
      function sleep(milliSeconds){ 
        var startTime = new Date().getTime(); 
        while (new Date().getTime() < startTime + milliSeconds); 
      }      
      function callNotWorker(){
        sleep(10000); //10초 동안 대기 시킨다
      }    
          
    </script>
  </head>
  <body>
    <button onclick="callNotWorker()">워커없이 호출</button>   
    <br>   
    <input type="text">
  </body>
</html>

- 실행 화면
HTML 파일을 웹 브라우저(데스크 탑 사파리)에서 실행하면 약 10초 이 후 완료 메시지가 나타난다
그런데 문제는 대기 시간 10초 동안 브라우저에서 다른 작업을 할 수 없다는 것이다
브라우저를 움직일 수도 없고 텍스트 상자에 글을 입력할 수도 없는 듯 마치 꽁꽁 얼어버린 듯 하다
10초 후 메시지가 나타난 이후부터 다른 작업을 할 수 있게 되는 것이다


이것이 바로 단일 쓰레드(UI 쓰레드) 환경의 특징이다
스크립트에서 시간이 오래 걸리는 작업을 하는 동안 다른 일을 할 수가 없는 것이다

웹 워커는 이런 형태의 작업을 멀티 쓰레드 환경처럼 동작하도록 만들어 준다
즉 시간이 오래 걸리는 작업은 백그라운드에서 실행되기 때문에 UI 쓰레드는 다른 일을
동시에 할 수 있는 것이다. 그럼 웹 워커를 사용하는 버전을 수정해 보도록 하자

- 워커 정의하기(JS 파일에 정의한다)
시간이 오래 걸리는 스크립트 코드 즉 백그라운드 환경에서 실행되어야 하는 스크립트는
별도의 자바스크립트파일(worker.js) 로 작성한다

//메세지 수신하여 시간이 오래 걸리는 작업을 처리한다
onmessage = function(event){
  var receiveData = event.data;
  sleep(10000); 
    
  //워커를 호출한 곳으로 결과 메시지를 전송한다
  var sendData = receiveData + "OK~ I'm Worker"
  postMessage(sendData)
}

function sleep(milliSeconds){ 
  var startTime = new Date().getTime(); // get the current time  
  while (new Date().getTime() < startTime + milliSeconds); // hog cpu
}

- HTML 페이지
이제 이 워커(파일)을 이용하는 HTML 페이지를 아래와 같이 작성한다
앞서 정의한 worker.js 파일을 기반으로 Worker 객체를 생성하고 postMessage 메서드를 통해
워커로 메시지를 전달한다. 또한 onmessage 이벤트를 정의하여 워커로 부터 전달되는 메시지를
받을 수 있도록 한다. 그리고 워커의 작업을 중지시키려면 terminate 메서드를 호출하면 된다

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript">             
      var worker;     
      function callWorker(){     
        if(!!window.Worker){ //브라우저가 웹 워커를 지원하는지 검사한다   
           
          if(worker) worker.terminate();      //워커가 이미 존재하면 종료시킨다                    
          worker = new Worker("worker.js");  //새로운 워커(객체)를 생성한다      
                      
          worker.onmessage = function(event){ //워커로부터 전달되는 메시지를 받는다
            alert(event.data);
          };
                           
          worker.postMessage("워커야! 깨어나라!"); //워커에게 메시지를 전달한다       
        }
        else{
          alert("현재 브라우저는 웹 워커를 지원하지 않습니다")
        }
      }
               
      function stopWorker(){
        if(worker){
          worker.terminate();
          alert("워커 작업이 중지되었습니다");
        }
      }
    </script>
  </head>
  <body>
    <button onclick="callWorker()">웹워커 호출</button>
    <button onclick="stopWorker()">웹워커 중지</button>   
    <br>   
    <input type="text">
  </body>
</html>

- 실행 화면
HTML 파일을 웹 브라우저(데스크 탑 사파리)에서 실행하면 10초 후에 메시지가 나타난다
또한 워커를 사용했기 때문에 브라우저가 얼어 버리는 일은 없다
즉 10초라는 대기 시간 동안에도 브라우저를 움직이거나 텍스트 상자에 글을 입력할 수 있게 되는 것이다



결과적으로 두 작업이 동시에 처리되는 병렬작업이 가능하게 되는 것이다
이러한 병렬처리는 응용프로그램의 중요한 요구사항이며 이제 워커 덕분에
웹 페이지에서도 이러한 응용 환경 구현이 가능하게 된 것이다

마지막으로 아래 사이트에서 웹워커 관련 데모를 추가로 확인해 보자
http://html5demos.com/worker

'모바일 > HTML5' 카테고리의 다른 글

[HTML5] 드래그 앤 드롭 (Drag & Drop)  (3) 2010.08.10
[HTML5] Geolocation  (1) 2010.08.09
HTML5 Demo, A Look At HTML5 and its Canvas Tag  (0) 2010.07.29
[HTML5] HTML5 개요와 기술적 특징  (5) 2010.07.21
HTML5 책, HTML5 & API 입문  (2) 2010.07.09

HTML5 Demo, A Look At HTML5 and its Canvas Tag

Posted in 모바일/HTML5 // Posted at 2010. 7. 29. 17:54
728x90

HTML5 로 제작된 멋진 데모들을 제공하는 사이트이다
음.. 놀랍군.

이건 뭐.. 그럴싸한 HTML5 어플만들려면 자바스크립트를 자유자재로 다룰 수 있어야 겠구만!!

http://www.aplossystems.co.uk/articles/look_at_html_5_canvas/

자바스크립트의 영역이 이렇게 커질(?)줄 몰랐다. 아오~

우리 프로젝트에도 멋진 자바스크립트 개발자가 있어야 하겠지...

'모바일 > HTML5' 카테고리의 다른 글

[HTML5] Geolocation  (1) 2010.08.09
[HTML5] Web Workers (웹 워커)  (1) 2010.08.05
[HTML5] HTML5 개요와 기술적 특징  (5) 2010.07.21
HTML5 책, HTML5 & API 입문  (2) 2010.07.09
브라우저의 HTML5 호환성 점수  (0) 2010.07.05

[HTML5] HTML5 개요와 기술적 특징

Posted in 모바일/HTML5 // Posted at 2010. 7. 21. 12:24
728x90

HTML5에 대한 개괄적인 내용들을 정리해 보았다
이 문서는 HTML5 & API 입문 이라는 책과 관련 블로그 및 온라인 자료를 바탕으로 작성되었다

따라서 순수 창작물이 아니라 정리 및 요약을 목적으로 작성되었으며 일부 개인적 의견이
덧붙여지기도 하였음을 밝혀둔다


HTML5 개요와 기술적 특징

 

2010.06.14

 

근래 HTML5에 대한 관심이 뜨겁다. 웹이 더 이상 문서 공유나 문서 표현만을 위한 것이 아니라 하나의 응용프로그램으로써의 면모를 점점 갖추어 나가고 있다. 플러그인 기술과 스크립트의 조화로 웹이 응용프로그램화 되어 왔지만 이는 표준적인 HTML 스펙을 벗어나는 기술의 복잡한 결합으로 가능한 것이었다

HTML5는 웹을 둘러싼 난무한 비 표준을 지양하고 지능적이고 실행가능 한 웹 구현을 위해 탄생한 차세대 웹 표준 기술이다. 본 문서에서는 현재 이슈가 되고 있는 HTML5의 개요와 기술적 특징에 대해 기술한다

 

HTML5 등장 배경

웹 문서에서 웹 응용프로그램으로의 진화

웹에서 문서를 표현하고 문서간 연결(하이퍼링크)을 주 목적으로 탄생한 HTML은 웹 환경이 보편화되고 발전함에 따라 표준적인 방식으로 구현되는 웹 응용프로그램 수준을 요구하는 시대적 흐름에 의해 탄생하게 되었다. 또한 방대하게 퍼져있는 웹 문서를 의미 있게 구조화하고 효과적으로 탐색, 해석 할 수 있는 시멘틱(semantic) 웹 실현을 위한 표준이기도 하다

 

HTML5 정의

HTML5 HTML의 차기 주요 제안으로써 HTML 4.01, XHTML 1.0, DOM Level 2 HTML에 대한 차세대 표준안이다. 플래시나 실버라이트와 같은 별도의 플러그인 없이 웹에서 표준적인 방식으로 멀티미디어를 재생하고 로컬 자원을 이용하는 등의 응용프로그램 수준의 웹을 개발하기 위한 기술의 총칭이다

현재 W3C를 주축으로 한 애플, 모질라, 구글, 오페라, 마이크로소프트 등 모든 웹 브라우저 벤더가 참여하고 있는 산업 표준이기도 하다

 

HTML History

HTML 1990년 초부터 지속적으로 업그레이드 되어 왔다

특히 시멘틱 웹의 실현을 목적으로 한 XHTML 추진과 HTML5로의 방향전환이 주목할 만한 업계의 트랜드를 말해 준다

 

1990

웹 창시자인 팀 버너스리에 의해 설계 및 개발 시작

 

1993 6

IETF에 의해 버전 1.0 표준 채택

 

1995 11

버전 2.0 RFC 표준화

 

1997 1

W3C 버전 3.2 권고

 

1997 12

W3C 버전 4.0 권고

 

1999 12

W3C 버전 4.01 권고

(이후 W3C에서 HTML을 더 이상 업데이트 하지 않을 것을 선언)

 

2000 1 ~

W3C 시멘틱 웹 실현을 위한 XHTML 1.0 개발추진. 이후 XHTML2 개발

2009 7

XHTML2 사양 제정 중지 선언

 

2004 6

XHTML 보급 실패와 시대 흐름에 부응하기 위한 HTML 업데이트 제안

애플, 모질라, 오페라 제안 -> W3C 거절 -> WHATWG 결성

-> 웹 어플리케이션 1.0이라는 이름으로 세부 명세 작업 시작

 

2007

W3C에서 HTML W/G를 결성하고 WHATWG와 공동작업 시작

2008 1

W3C에 의해 HTML5 초안 공개

2009 5

Google I/O 개발자 콘퍼런스, ‘차세대 웹 표준으로 적극 추천됨.

(전 세계 개발자들의 주목을 받기 시작함)

2009 10

WHATWG가 최종심사청구를 선언하고 표준화 작업을 W3C로 넘김

W33C: HTML5 표준화 작업 진행

WHATWG: HTML 업데이트 작업 계속 진행

2010 6월 현재

W3C의 표준화 프로세스 중 최종 초안 상태

2012년경

권고 후보 예정(실제 브라우저에 표준 전체 기능 적용 요청)

이후 정식 권고


 

브라우저 및 호환성

현재 HTML5가 초안(Working Draft) 상태이기는 하지만 많은 브라우저 업체들이 이미 HTML5 기능들을

지원하고 있다

 

2010년 현재 지원되는 브라우저 목록

파이어폭스 3.5 이상, 크롬 3.0 이상, 사파리 3 이상, 오페라 10.0 이상, IE 9 이상

기능

크롬

파이어폭스

사파리

오페라

안드로이드

웹 플랫폼

Canvas

O

O

O

O

-

SVG

O

O

O

O

-

Video

O

O

O

O

O

Geolocation

O

O

O(iPhone)

O

O

오프라인 웹 응용

O

O

O

O (mobile)

O

Web Database

O

O

O

O (mobile)

O

Web Worker

O

O

O

O (mobile)

-

 

미 지원 브라우저 처리

HTML5는 자체적으로 이 기술을 지원하지 않는 브라우저를 위해 Fall Back 장치를 두고 있다

(태그 무시, 대안 텍스트 표시)

 

브라우저 호환성 확인:

지원되는 브라우저 내에서도 HTML5 세부 지원 여부가 조금씩 상이하다. 다음의 URL에서 상세한
브라우저 호환성 확인이 가능하다 (참고:
http://caniuse.com/)

 

HTML5 현황

전 세계적인 브라우저 업체들이 이미 HTML5 개발에 협력하고 있으며 자사의 브라우저에 HTML5

지원하고 있다. 경쟁 기술인 실버라이트를 먼저 선보인 마이크로소프트에서도 HTML5 지원에 동참하고 있는 실정이다. 또한 플래시 개발사인 어도비에서도 자사의 웹 저작도구인 드림위버 신제품에 HTML5
편집 기능을 포함시켰다. 아래는 HTML5에 대한 업계의 관심과 공식적 행보의 예이다

 

애플: W3C HTML WG의 공동의장으로 활동하면서 HTML5 표준화에 적극 동참.

자사 제품에 플래시 배제. HTML5 적극 지원

사파리개발자센터를 통해 HTML5 데모 및 가이드 제공   

구글: 구글 기어스(Google Gears) 포기, HTML5 집중 선언, HTML5 기반 유투브 서비스 시작

마이크로소프트: IE9 HTML5 지원 발표. IE3 TestDrive 사이트에 HTML5 영역 제공

오페라: 오페라 개발자 센터를 통해 HTML5 데모 및 가이드 제공

              

사례 및 데모

퀘이크 2: http://www.youtube.com/watch?v=XhMN0wlITLk (플레이 동영상)

HTML5Canvas Audio LocalStorage , WebSocket, WebGL등의 기술을 이용해
GWT(Google Web Tookit)
팀에서 퀘이크 2 HTML5로 포팅하여 에뮬레이션 한 것
 (웹 브라우저에서 초당 60프레임까지 가능)

오픈 소스: http://code.google.com/p/quake2-gwt-port/



이미지 편집기: http://mugtug.com/darkroom/
포토샵과 유사한 기능 제공. HTML5 Canvas 사용



둠과 유사한 컨셉트의 게임 데모: http://www.benjoffe.com/code/demos/canvascape/

마리오카트 컨셉트의 게임 데모: http://www.nihilogic.dk/labs/mariokart/

웹 노트 데모: http://webkit.org/demos/sticky-notes/index.html

 

웹 응용프로그램을 위한 HTML5 주요 기술

HTML5는 마크 업 태그인 HTML 요소와 CSS3 그리고 자바스크립트를 통칭한 개념이다

그리고 Web Workers Web SQL Database 와 같은 응용프로그램 API들은 각각 독립된 사양이지만
일반적으로 이 모든 기술을 통칭하여 HTML5 라 해도 무방하다. 아래 표는 HTML5의 주요 기술적
특징을 요약한다

 

기능

설명

시멘틱 요소

 

문서의 구조와 데이터의 의미를 보다 명확히 하기 위한 시멘틱 요소가 추가됨

검색 엔진 및 문서 해석기 등에서 웹 문서 판별이 정확하고 용이해 짐

<section>, <article>, <aside>, <header>, <footer>, <address>

웹폼 요소

사용자 입력 양식 개선되고 추가됨

range, color, datetime 와 같은 입력 양식이 추가되어 스크립트 없이 표현 가능

2D 드로링 요소

웹 상에서 2차원 그래픽을 표현하기 위한 태그(canvas) API 지원

모양, 텍스트, 애니메이션, 전환 등의 효과를 줄 수 있음

3D 드로잉 요소

Canvas 3D(WebGL)을 통한 3D 그래픽 표현 지원

WebGL을 기반으로 3D 애플리케이션 또는 게임 개발을 돕는 자바스크립트 3D 엔진

멀티미디어

웹 상에서 비디오, 오디오를 표현하기 위한 태그 및 API 지원

Web Storage

웹 사이트의 정보를 사용자의 pc에 저장할 수 있는 매커니즘을 제공함.

기존 쿠키의 용량 제한 및 트래픽 부담의 단점을 해소

Web Database

로컬 데이터베이스 및 표준 SQL 질의를 수행할 수 있는 API 제공

Application Cache

인터넷이 연결되지 않은 상태에서 오프라인 응용프로그램 구현이 가능토록 지원

Web Worker

비 동기 백그라운드 처리 수행이 가능한 API 제공.

멀티 쓰레드 웹 응용프로그램 개발이 가능해 짐

Web Sockets

웹 상에서 양방향 통신이 가능한 API 제공

서버 푸시

서버로부터의 데이터를 푸시(push) 받을 수 있는 Server-Sent Events 제공

Geolocation

지리 정보 및 위치 정보를 이용할 수 있는 API 제공(장치 종속적임)

Drag & Drop

웹 페이지 내 혹은 외부 개체를 웹 페이지로 드래그, 드랍이 가능한 API 제공

Notifications

웹에서 메신저의 알림 기능이 가능한 API제공

File API

로컬 파일을 내용을 읽을 수 있는 API 지원

SVG

XML기반의 2차원 벡터 그래픽 표현하는 외부 마크업을 HTML 안에 삽입 가능

CSS3

투명도, 그림자, 둥근 모서리, 다중 컬럼 레이아웃 등 새로운 스타일 요소 추가

 

 

향상된 시맨틱(semantic)

시멘틱 태그(semantic tags)

시멘틱은 의미가 있는’, ‘의미의라고 해석된다.

기존의 표현(Display) 위주의 웹 문서에 데이터(Data)의 구조적 개념을 추가하기 위한 노력이라 할 수
있다.
웹이 시멘틱(semantic)해지면 웹 문서는 의미 있게 구조화, 조직화 되며 이를 해석하는 검색 엔진이나 문서 해석기에서는 보다 정확하게 웹 문서를 판별하고 해석 및 처리할 수 있게 된다.

 

시멘틱 웹의 실현을 위한 W3C의 대표적인 노력의 산물이 XHTML이다. W3C는 한 때 시멘틱 웹을
지향하는 XHTML을 차세대 웹 표준으로 추진한 적이 있다. XHTML HTML XML형식으로 기술할 수
있도록 하여 XML 자체의 장점인 데이터의 구조화 및 의미화 그리고 확장성을 웹 문서에 적용하기
위한 기술이다

 

물론 XHTML 자체는 널리 보급되지 못했으나 시멘틱 웹은 여전히 차세대 웹 환경의 주요한 이슈이다

HTML5 역시 시멘틱 웹을 지향하며 다양한 시멘틱 태그(Tag)들이 새로이 추가되었다

아래는 HTML5에서 새로 추가된 시멘틱 태그에 대한 설명이다

 

section

웹 페이지에 있는 하나의 문서 영역을 표현한다. 문서의 아웃라인을 구성한다

article

문서 영역에서 독립적인 컨텐트를 표현한다

포스트, 뉴스, 블로그의 본문과 같이 자체저으로 배포될 수 있는 항목을 구성한다

header

문서나 영역을 설명을 위한 헤더 영역을 표현한다

footer

저자, 저작권, 문서 꼬리말 등을 위한 풋터 영역을 표현한다

aside

광고 블록과 같은 주변 컨텐트와 별도로 다루어져야 하는 영역을 표현한다

hgroup

여러 개의 제목(h1~h6)을 하나로 정리한다

nav

문서 전체 혹은 섹션의 네이게이션 영역을 표현한다

address

섹션에 관한 문의처 정보를 표현한다

time

문서가 작성된 날짜 및 시간을 표현한다

 

 

마이크로데이타(MicroData)

웹 문서에 삽입된 데이터의 관련된 속성들을 조직화하여 정의할 수 있다

예를 들어 부동산 관련 페이지에 (house)’이라는 데이터를 정의하기 위해 가격,’위치’,’평수와 같은
관련 속성을 모아서 집이라는 하나의 아이템으로 정의할 수 있다.

이렇게 되면 HTML문서 자체를 데이터 소스로 다루는 프로그램에서 용이하게 사용 가능해 진다

 

향상된 웹 양식(Web Form)

입력박스나 체크박스, 선택창, 출력 버턴과 같은 기존 웹 입력양식이 상당부분 개선 및 추가되었다

기존 입력 타입이 text로 한정된 반면 HTML5에서는 email, tel, datetime 과 같이 입력형식자체를 지원하는 새로운 타입 요소들이 추가되었다. 또한 입력 값 검증이나 입력 보조 수단 등 스크립트에 의존했던
기존 기능들을 HTML 자체적으로 처리할 수 있도록 지원한다

 

input 타입

email, tel, url, search, datetime, number, range, color, week, month, time
) input type=range  

progress

작업의 진행 중을 표시하는 프로그레스 바 표현

meter

비율이나 수치를 시각적으로 표현

입력 값 검증

required, pattern, maxLength, min, mex, step

입력 보조 수단

placeholder, autofocus, autocomplete

 

2D/3D 드로잉(Drawing) 지원

Canvas 를 활용한 2D 그래픽

HTML 문서에 정의된 canvas 영역 내 각종 도형이나 선, 이미지 등 2D 그래픽을 그릴 수 있다

http://mugtug.com/darkroom/ : canvas를 이용한 이미지 편집기 데모

 

WebGL 을 활용한 3D 그래픽

WebGL을 이용한 3D 그래픽용 Canvas 도 추진 중 이다

WebGL은 오픈 그래픽 라이브러리인 OpenGL(OpenGL ES 2.0)에 기반한 웹 표준 그래픽 라이브러리이다

WebGL을 이용하면 브라우저에 별도의 플러그 인 없이 완벽하게 하드웨어 가속되는 3D그래픽을 표현할 수 있게 된다.

주요 브라우저 벤더사인 애플, 구글, 모질라 및 오페라와 하드웨어 업체인 AMD 및 엔비디아 등이 WebGL Working Group 멤버로 활동하고 있다. 그리고 구글의 웹 용 3D API O3D 플러그 인 기술을 포기하고 WebGL 을 선택했다

 

Copperlicht: WebGL 기반 자바스크립트 3D 엔진(Ambiera 사 개발)

http://www.ambiera.com/copperlicht/index.html

 

SVG

XML기반의 2차원 벡터 그래픽 표현하는 SVG HTML 안에 삽입 가능하다.

SVG W3C에 의해 제안된 XML 그래픽 표준으로 고품질의 다이내믹한 그래픽을 만들 수 있는 기술이다

HTML5에서는 MathML SVG와 같은 외부 마크 업을 직접 HTML 안에 삽입할 수 있도록 하였다

http://raphaeljs.com/ : SVG 데모

 

멀티미디어 지원

Video

HTML 문서에 별도의 윈도우미디어와 같은 별도의 플러그 인 없이 동영상을 재생할 수 있다

현재 유투브에서 HTML5 기반 동영상 서비스를 제공하고 있으며 스크립트를 통해 동영상을 제어할 수
있다

 

Audio

HTML 문서에 별도의 플러그 인 없이 오디오를 재생할 수 있다. 스크립트를 통해 오디오를 제어할 수 있다

 

표준화 되지 않은 코덱 문제

멀티미디어 형식에 대한 표준이 HTML5 사양에는 포함되지 않았다.

따라서 멀티미디어 재생을 위한 코덱의 비 표준화로 현재 브라우저마다 동영상 재생 형식이 서로 다르다

비디오 코덱으로는 H.264 Theora 가 있으며 오디오 코덱으로는 AAC,MP3 Vorbis 형식이
HTML5
용으로 사용되고 있다.

모질라와 오페라는 라이선스가 없는 오픈 소스 Theora를 선호하며 애플과 구글은 H.264 코덱을 선호한다

또한 마이크로소프트의 IE.9 에서는 H.264코덱만 지원한다고 발표한 바 있다


오디오 코덱 역시 라이선스가 없는 Vorbis형식과 특허로 제한되어 있는 MP3, ACC 형식으로 이분화 되어 있다. 그리고 또 하나의 변수로 최근 구글이 동영상 코덱 개발사인 On2를 인수해 VP8 코덱을 오픈
하기로 하였다. 이에 모질라 및 오페라 등이 동참하기로 하였지만 애플의 참여는 알 수 없는 상황이다.

 

따라서 표준이 정립되기 전까지는 두 형식에 대한 브라우저 호환성을 유지해야 하는 부담이 있다

아래 표는 브라우저 별 지원되는 비디오/오디오 코덱 정보이다

 

파일 형식

비디오 코덱

오디오 코덱

사파리

MP4

MPEG/H.264

AAC/MP3

크롬

Ogg/MP4

Theora/H.264

Vorbis/AAC/MP3

파이어폭스

Ogg

Theora

Vorbis

(스마트폰 브라우저의 경우 해상도 및 초당 프레임 등 추가 제약사항이 있을 수 있음)

 

로컬 저장소 및 오프라인 어플리케이션 지원

웹 사이트의 정보를 클라이언트 PC에 저장할 수 있는 메커니즘이 향상되었다

기존의 쿠키의 단점을 보완하고 로컬 데이터베이스를 지원하며 오프라인 응용프로그램을 위한
어플리케이션 캐시가 지원된다

 

Web Storage

이전 버전의 쿠키와 대응되는 개념이며 쿠키의 단점을 해소 및 보완한 저장소를 지원한다

아래와 같이 쿠키의 단점이 보완되었다

- 개수 및 용량 제한이 없음

- 매 요청마다 서버로 전송이 이루어 지지 않음

- 유효 기간 제한이 없음

- 스크립트 객체를 저장할 수 있음(객체의 복사본이 저장됨)

 

전역적인 저장소 개념인 LocalStorage와 브라우저(윈도우)별 저장소 개념인 SessionStorage가 있다

보안성에 있어서는 쿠키와 유사하다

 

Web SQL Database

클라이언트 PC의 저장소를 관계형 데이타베이스처럼 사용할 수 있다

데이터를 체계적으로 저장할 수 있으며 표준 SQL 질의를 통해 데이터를 액세스 할 수 있다

동기 및 비 동기 처리를 지원하며 도메인 별로 DB가 분리되어 있으며 최대 용량에 대한 제한은 브라우저에 따라 다를 수 있다

 

Application Cache

인터넷에 연결할 수 없는 오프라인 환경이 되었을 때에도 웹 사이트를 이용할 수 있도록 하는 메커니즘인

오프라인 어플리케이션을 Application Cache 로 지원한다

클라이언트에 캐시 될 파일 목록을 매니페스트에 정의하고 이 파일들은 인터넷 연결 없이도 볼 수 있게 된다. 또한 캐시 된 파일에 대한 업데이트 매커니즘도 제공된다.

Web Storage Web SQL Database 와 연계하여 완벽한 오프라인 어플리케이션을 구현할 수 있다

 

비동기 프로그래밍 그리고 양방향 통신

Web Worker

JavaScript 코드를 백그라운드에서 실행시킬 수 있어 멀티스레드 웹 어플리케이션 개발이 가능해졌다

워커(Worker)라 불리는 백그라운드 쓰레드는 UI(DOM) 와는 완전히 분리된 환경에서 동작한다

 

Web Sockets

Web Sockets을 통해 웹 브라우저와 웹 서버간 양방향 통신이 가능해졌다

기존의 웹 환경에서 서버의 데이터는 폴링(polling)방식으로 받아 왔으나 Web Sockets을 이용하면 진정한 의미의 푸시(push)형 양방향 데이터 송/수진이 가능해진다.

Web Sockets HTTP 프로토콜에 기반한다. 따라서 웹 서버 측에서도 이를 지원해야 한다

현재 아파치, jetty, Tornado 웹 서버가 Web Sockets를 지원한다

 

Server-Sent Events

웹 환경에서 서버 푸시(push) 통신 방식을 효과적으로 구현하기 위한 Comet을 표준화한 기술이다

정기적인 폴링과 응답 데이터 해석 처리를 자동화 해 준다

 

Desktop Experience

Notifications

Notifications 을 이용하여 메신저의 알림 창과 유사한 기능을 구현할 수 있다

 

Drag & Drop

웹 문서 내 혹은 서로 다른 웹 문서간 그리고 외부 응용프로그램의 데이터를 웹 문서로 끌어다 놓을 수
있는 기능이 지원된다. 기존 데스크 탑의 경험을 웹에서도 구현할 수 있게 되었다

 

Rich Text Editor

HTML5에서는 워드 문서나 텍스트 편집기와 같은 리치 텍스트 편집용 API가 표준으로 규정되었다

따라서 위지윅(WYSIWYG) 에디터나 맞춤법 검사 기능 등을 웹 문서에 구현할 수 있다

 

위치기반 어플리케이션 지원

Geolocation

HTML5가 실행되는 장치의 위치 정보를 액세스 하기 위한 Geolocation API가 제공된다

장치로부터 위도와 경도 및 표고, 장치의 진행 방향 및 진행 속도 정보를 얻을 수 있다

http://iroute.mobi/ : 아이폰 용 웹 네이게이션 데모

 

문서간 메시지 전송

로 다른 도메인 또는 서로 다른 웹 페이지간 메시지를 주고 받을 수 있는 커뮤니케이션 API가 제공된다

이 기능은 기본 웹 페이지의 서버 이외의 서버에서 호스트되는 위젯과 어플을 개발하는데 매우 유용하다

또한 데이터 송/수신 시 비 동기로 메시지를 주고 받을 수 있어 느슨한 결합 형태의 공유가 가능하다

 

향상된 스타일시트(CSS3)

투명도 조절, 둥근 모서리, 그림자와 같은 웹 문서에 다양한 효과를 줄 수 있는 요소가 추가되었으며

신문 구성과 같은 다중 컬럼 레이아웃 및 새로운 색상 값 새로운 폰트 지원, 텍스트 랩핑 및 스트로크와
같은 다양한 표현 기능이 향상되었다

 

추가 진행중인 기술들

XMLHttpRequest Level2

Ajax의 기초가 되는 XMLHttpRequest 사양의 업그레이드가 진행되고 있다

기존사양을 업그레이드 한 것으로 다음과 같은 추가 기능이 제공된다

- 크로스 도메인 송/수신

- 요청의 진행 상황 확인 가능

- 파일이나 바이너리 데이터 등 송신할 수 있는 데이터의 형식이 추가됨

 

Inexed Database

클라이언트 데이터베이스의 한 종류로 현재 HTML5 사양으로 정해진 Web Storage Web SQL Database의 불편한 점을 해결하고자 추가된 사양이다. 인덱스 된 Key-Value Storage라 할 수 있으며 사용이 편리하고 기능이 많은 API이다

 

File API

웹 어플리케이션에서 사용자 PC의 파일을 액세스 할 수 있는 API이다

보안상 이유로 모든 파일 접근은 불가하고 허가된 영역의 파일만 액세스 가능하다

드래그 & 드롭 한 파일이나 파일 선택 폼에서 사용자가 지정한 파일 등에 액세스 할 수 있다

 

Summary

HTML5는 현재 표준이 확립된 기술이 아니라 진행중인 기술이다. 즉 표준을 위한 작업이 계속 진행 및
추가되고 있는 상황이며 각 브라우저 별로 그 지원 범위 및 방향이 조금씩 상이하기도 하다.

그러나 W3C는 물론 애플 및 구글, 마이크로소프트, 모질라 등 세계적 기업들이 적극적으로 동참하고
있는 기술 표준이며 이미 아이폰과 아이패드와 같은 장치에 기능이 탑재되어 출시되었다


또한 파이어폭스, 사파리, 오페라, 크롬 등 대부분 브라우저의 최신 버전에는 HTML5를 여지없이
지원하고 있으며 마이크로소프트의 IE 다음버전인 9에서도 전폭 지원할 예정이다


더불어 아이폰을 시작으로 한 스마트 폰의 급속한 보급으로 모바일 웹에 대한 관심이 커지고 있다

이는 IE 기반의 브라우저 환경에 한계를 드러냈으며 표준적인 웹 기술의 필요성이 대두되고 있다

또한 플래시나 실버라이트와 같은 밴더 종속적인 기술의 한계도 드러내고 있다

HTML5는 모든 것의 해결책은 아니지만 많은 것의 대안이 될 것임에 분명하다

HTML5 2012년경 그 모습이 완성되어 나갈 것으로 예상되며 많은 기업에서 이를 기반으로 한 웹 응용프로그램을 출시하여 기술이 본격적으로 활성화 될 것으로 보인다