'HTML5.0' 카테고리의 다른 글
캔버스 위에 div 를 올리자. (0) | 2012.06.05 |
---|---|
canvas source (0) | 2012.06.05 |
HTML 5 설명 글 중 (일본어를 구글로 강제 번역함 ㅠㅠ ) (0) | 2012.06.04 |
adobe Edge (0) | 2012.06.04 |
캔버스 간단한 마우스 그리기 (0) | 2012.06.04 |
캔버스 위에 div 를 올리자. (0) | 2012.06.05 |
---|---|
canvas source (0) | 2012.06.05 |
HTML 5 설명 글 중 (일본어를 구글로 강제 번역함 ㅠㅠ ) (0) | 2012.06.04 |
adobe Edge (0) | 2012.06.04 |
캔버스 간단한 마우스 그리기 (0) | 2012.06.04 |
Translation of : What Does It All Mean? - Dive Into HTML5
이 장에서는 전혀 아무것도 잘못하지 않는 HTML 페이지를 개선합니다. 일부는 줄어들 것이고, 일부는 오래 될 것입니다. 그리고 그 모두가 더욱 의미있는 것으로 (시맨틱) 될 것입니다. 훌륭 하지요?
소재가되는 페이지는 여기에 있습니다 . Learn it. Live it. Love it 새 탭에서 페이지를 열고 "소스보기"로이 페이지로 돌아 와서는 안됩니다.
❧
우선 처음부터 :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
이것은 "doctype"라는 것입니다. doctype 긴 역사 - 마술적인 -합니다. Mac 용 Internet Explorer는 Microsoft의 개발자 자신이 경악할만한 문제를 발견 수 있습니다. 다가올 새로운 버전의 브라우저에서 Web 표준에 대한 지원이 향상되었습니다 이전 웹 페이지는 올바르게 표시되지 않을 것입니다. 또는 제대로 표시되고있다 (사양에 따라)에에도 불구하고 많은 사람들이 제대로 표시되지 않는 게 좋습니다. 웹 페이지는 Netscape 4와 Internet Explorer 4 같은 점유율 우세한 브라우저 주제에 맞게 만들어진했습니다. IE5/Mac 매우 선진적인 것이었지만, 웹 페이지를 엄청했습니다.
Microsoft는 기발한 해결 방법에 겨우 도착했습니다. IE5/Mac에서 일반적으로 HTML 소스 첫 번째 라인 ( <html>
요소 이전)에있는 "doctype"을 찾게하는 것입니다. 오래된 웹 페이지 (이전 버전의 브라우저 주제에 의존하는)은 대부분의 경우 doctype이 없습니다. IE5/Mac는 그러한 웹 페이지는 오래된 브라우저와 동일하게 표시하고 새로운 Web 표준을 사용하려면 올바른 doctype을 <html>
요소 앞에두면된다 있도록했습니다.
아이디어는 순식간에 퍼져, 모든 주요 브라우저에서 "호환 모드"와 "표준 모드"의 두 모드를 가지게되었습니다. 물론 지금 힘겨운 상황에 빠지게되었습니다. Mozilla는 버전 1.1을 공개하려고했을 때, "표준 모드"로 표시되고 있음에도 불구하고 특정 주제에 의존하는 웹 페이지가 얼마든지있다는 것을 발견했습니다. Mozilla는 렌더링 엔진을 수정하여 버릇을 수정했지만 결과 단번에 많은 웹 페이지가 엉망으로 표시되도록합니다. 그래서 - 위조는 없어요 - 무려 " 거의 표준 모드 "라는 것이 만들어 버렸습니다.
Activating Browser Modes with Doctype 에서 Henri Sivonen은 각 모드의 차이를 다음과 같이 정리하고 있습니다 :
- 호환 모드
- 호환 모드에서는 1990 년대 후반에 유행했던 기법을 기반으로 만들어진 웹 페이지를 엉망으로하지 않기 때문에 Web 표준을 무시합니다.
- 표준 모드
- 표준 모드에서는 브라우저 가급적 이미 사양에 따른 형태로 구현되는 동작에 따라 문서를 보려고합니다. HTML5에서는이 모드를 "호환성 모드"라고 부르고 있습니다.
- 거의 표준 모드
- Firefox 및 Safari, Chrome, Opera (7.5 이상), IE8은 "거의 표준 모드"를 가지고 있으며, 표 셀 가로 크기 CSS2 사양을 무시하고 결정합니다. HTML5에서는이 모드를 "제한된 호환성 모드"라고 부르고 있습니다.
(나는 아주 짧게 인용하고 있기 때문에, 제대로 Henri Sivonen 기사의 나머지 모두를 읽어야한다. 예를 들어 IE5/Mac는 Web 표준으로 지원되지 않은 일부 오래된 doctype을 지원합니다. 호환 의 명부가 증가함에 따라 "호환 모드"로 취급하는 doctype은 증가하고갔습니다. 마지막으로 내가 확인했을 때, 5 개의 doctype이 "거의 표준 모드"가되어, 73 doctype이 "호환성 모드" 되었습니다하지만 그래도 몇 가지 놓친 것이고, Internet Explorer 8이 4 개 - 4 개입니다! - 디스플레이 모드를 전환하는 똥 같은 기능에 대해서는 언급 할 생각은 없습니다. 죽으면 좋겠다. 불타 죽는)
그런데 무슨 이야기를하고 있던 것일까요. 그렇습니다, doctype군요 :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
이것은 많은 현재 브라우저에서 "표준 모드"로 해석되는 15 doctype 중의 하나입니다. 특히 아무것도 실수는 없습니다. 만약 이것을 사용하고 싶다면 그대로 사용해도 상관 없습니다. 더 짧고 간결하고 많은 현재 브라우저에서 "표준 모드"가 될 HTML5의 doctype 변경될 수 있습니다.
HTML5의 doctype은 이렇습니다 :
<!DOCTYPE html>
이것뿐입니다. 단 15 자입니다. 간단해서 비어 기억 유형있을 것입니다.
❧
HTML 페이지는 중첩된 요소의 덩어리입니다. 그 전체적인 구조는 나무와 비슷합니다. 몇 가지 요소는 "형제"이며, 그것은 같은 줄기에서 두 개의 가지가 나있는 것 같습니다. 몇 가지 요소가 다른 요소의 "자식"이고, 그것은 큰 가지에서 작은 가지가 나있는 것 같은 것입니다 (다른 말로한다면 다른 요소를 포함하는 요소 바로 아래에있는 요소의 "부모" , 그 손자 요소에 대한 "조상"입니다). 자식 요소가없는 요소는 "잎"노드라고합니다. 가장 최상위 요소, 즉 모든 요소의 조상에 해당하는 요소는 루트 요소라고합니다. HTML 페이지에서 루트 요소는 항상 <html>
입니다.
이 예제 에서는 루트 요소는 다음과 같이되어 있습니다 :
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
특히이 태그 실수는 없습니다. 다시 말하지만, 만약 당신이 사용하고 싶다면 그대로 사용해도 상관 없습니다. 이것은 합리적인 HTML5입니다. 하지만 HTML5에서는 중요하지 않은 부분이 몇 가지 그들을 제거하여 몇 바이트 절약할 수 있습니다.
먼저 xmlns
속성에 대해 생각해 봅시다. 이것은 XHTML 1.0 의 흔적에서이 페이지에 포함된 요소는 XHTML 네임 스페이스 ( http://www.w3.org/1999/xhtml
)에 속하는 것이있다는 것을 가르쳐줍니다. 그러나 HTML5 요소는 항상 네임 스페이스에 속하는 때문에 명시적으로 선언할 필요가 더 이상 없습니다. HTML5 페이지는이 특성이 있든 아니든 모든 브라우저에서 동일하게 해석되는 것입니다.
xmlns
속성을 삭제하면 루트 요소는 이렇게됩니다 :
<html lang="en" xml:lang="en">
HTML 페이지의 언어를 정의하는 lang
과 xml:lang
이라는 두 가지 속성이 남아 있습니다 ( en
은 "영어"를 의미합니다. 영어가 아닌 경우 자신의 언어 코드를 찾아보세요 ). 왜 같은 일을 서로의 속성으로 표현하는 것입니까? 이것도 XHTML의 흔적입니다. HTML5에서는 lang
만이 의미를 가집니다. xml:lang
을 그대로 두어도 상관 없지만 반드시 lang
속성과 동일해야합니다 .
To ease migration to and from XHTML, authors may specify an attribute in no namespace with no prefix and with the literal localname "xml : lang"on HTML elements in HTML documents, but such Attributes MUST only BE Specified IF A
lang
attribute in No namespace is also specified, and both attributes must have the same value when compared in an ASCII case-insensitive manner. The attribute in no namespace with no prefix and with the literal localname "xml : lang"has no effect on language processing.
또 삭제해도 될까요? 괜찮으면 지워버합시다! 루트 요소는 이렇게됩니다 :
<html lang="en">
루트 요소는 이상입니다.
❧
<head>
Element 대부분의 경우 루트 요소의 첫 번째 자식은 <head>
요소입니다. <head>
요소에는 해당 페이지의 본문이 아닌 메타 데이터 - 페이지에 대한 정보 -가 포함됩니다 (본문은 당연 합니다만 <body>
요소에 포함됩니다). <head>
요소 자체는 지루한 것으로, HTML5에 무엇인가 재미있는 효과를주는 것은 없습니다. 재미있는 것은 <head>
요소 중입니다. 는 다시 주제의 페이지 를 살펴 보도록하자 :
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>My Weblog</title> <link rel="stylesheet" type="text/css" href="style-original.css" /> <link rel="alternate" type="application/atom+xml" title="My Weblog feed" href="/feed/" /> <link rel="search" type="application/opensearchdescription+xml" title="My Weblog search" href="opensearch.xml" /> <link rel="shortcut icon" href="/favicon.ico" /> </head>
우선 <meta>
요소 네요.
❧
"문장"에 대해 생각할 때, "컴퓨터 화면에 표시되는 문자와 그림"에 대해서도 생각할 필요가 있습니다. 그러나 컴퓨터는 문자나 그림을 직접 취급주는 것이 아니라 비트와 바이트라는 단위로 취급합니다. 컴퓨터 화면에서 보는 문장은 모든 각각의 문자 인코딩에 따른 것입니다. 수많은 문자 인코딩 이 존재하고 러시아어나 중국어와 영어 각각 최적화된도이거나 여러 언어를 처리할 수도합니다. 간단하게 말하면 문자 인코딩은 메모리와 디스크에 저장된 데이터와 컴퓨터 화면에 표시를 매핑하는 것입니다.
실제로는 더 복잡합니다. 동일한 문자가 여러 인코딩, 각각 다른 바이트의 조합으로 메모리와 디스크에 저장하기도합니다. 문자 인코딩을 해독 열쇠와도 같은 것이라고 생각해도 좋을 것입니다. 누군가가 텍스트로 일련의 바이트의 조합을 보내온 경우 문자로 화면에 표시 (또는 인쇄하는 등)하는 경우에는 그것이 어떤 문자 인코딩인지 알 필요가 있습니다.
는 브라우저와 서버에서 들어오는 일련의 바이트에서 어떻게 문자 인코딩을 결정하는 것입니까? 좋은 질문입니다! 만약 HTTP라는 것을 알고있다면 다음과 같은 헤더를 본 적이있을 것입니다 :
Content-Type: text/html; charset="utf-8"
간단히 말해, 이것은 웹 서버는 HTML 문서를 보내고있는 것으로, 문서의 문자 인코딩이 UTF-8
임을 가르쳐주고 있습니다. 불행히도 위대한 잡탕 WWW는 한정된 작성 자만 HTTP 서버를 설정할 수 없습니다. 예를 들어 Blogger : 각각의 콘텐츠는 개인이 제공되지만 서버는 Google에 의해 운영되고 있습니다. 따라서 HTML 4는 HTML 문서 자체에서 문자 인코딩을 지정할 수 있도록되어 있습니다. 다음과 같은 글을 본 적이 없습니까? :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
간단히 말해, 이것은 웹 제작자가 HTML 문서를 문자 인코딩으로 UTF-8
을 사용하여 만든는 것을 가르쳐줍니다.
이상의 두 기술은 HTML5에서도 그대로 작동합니다. HTTP 헤더가 가장 강력한 수단으로 <meta>
태그가있어도 그것을 무시할 수 있습니다. 그러나 모두가 HTTP 헤더를 설정 할 수있는 것은 아니므로 <meta>
태그도 계속 작동하게되어 있습니다. 어쨌든 HTML5에서는 더 간결하게 작성할 수있게되어 있습니다. 는 어떻게되어 있을까요? :
<meta charset="utf-8" />
모든 브라우저에서 제대로 작동합니다. 이 생략 기법은 어디에서 온 것일까요? 내가 찾은 가운데는 다음과 메일링리스트 메세지 를 가장 잘 설명하고 있다고 생각합니다 :
the Rationale for the
<meta charset="">
attribute Combination is that UAS already Implement it, because people tend to leave things unquoted, like :
<META HTTP-EQUIV=Content-Type CONTENT=text/html; charset=ISO-8859-1>
만약 브라우저가 제대로이 생략 기법을 다룰 것인가를 믿을 수 없다면 <meta charset>
테스트 가 있기 때문에 그것을 참조보십시오.
질문 : 달라진 문자를 쓸 생각은 없습 니다만, 그래도 문자 인코딩을 지정하는 편이 좋을까요?
답변 : 지정하십시오! 모든 HTML 페이지에서 문자 인코딩을 지정해야합니다. 인코딩을 지정하지 않으면, 보안적인 문제를 안게 될지도 모릅니다 .
요약해 말하면, 문자 인코딩 디그은 복잡하고 교양있는 사람들이 사용하는 많은 허술한 소프트웨어를 복사 및 붙여넣기에서 일반적으로 취급할 정도로 쉽게되어 있지 않습니다. 모든 HTML 문서에서 반드시 문자 인코딩을 지정해야하고 그렇지 않으면 좋지 않은 일이 발생합니다 . HTTP의 Content-Type
헤더도 좋지만, <meta http-equiv>
좀 더 짧은 <meta charset>
의 선언을 써 주셨으면합니다. 분명 인터넷도 기뻐합니다.
❧
일반 링크 ( <a href>
)은 단순히 다른 페이지를 참조하십시오. <link rel>
왜 다른 페이지를 참조하는지 설명하는 것입니다. 이들은 "나는이 페이지를 참조하십시오. 왜냐하면 ..."이라는 문장을 완성합니다 :
등등. HTML5는 링크 관계를 두 가지로 나뉘어져 있습니다 :
Two categories of links can be created using the link element. Links to external resources are links to resources that are to be used to augment the current document, and hyperlink links are links to other documents ....
The exact behavior for links to external resources depends on the exact relationship, as defined for the relevant link type.
소재로 다룬 예제에서는 첫 번째 ( rel="stylesheet"
)만이 외부 리소스에 대한 링크입니다. 나머지 모두는 다른 문서에 하이퍼 링크되어 있습니다. 이러한 링크는 추적도 추적 않아도 상관 없으며이 페이지를 열람하기 위해서 참조해야 할 것도 없습니다.
많은 경우 링크 관계는 웹페이지 <head>
에서 <link>
요소의 일부로 나타납니다. 일부 링크의 관계는 <a>
요소에서도 사용할 수 있지만 잘 알려지지 않았습니다. HTML5에서는 <area>
요소에서도 사용할 수있게 되었 습니다만, 더욱 알려져 있지 않은 것입니다 (HTML 4는 rel
속성을 <area>
요소로 사용할 수 없습니다.) 전체 링크의 관계 테이블 을보고 어떤 값을 rel
로 지정할 수 있는지 확인하자.
질문 : 내 마음대로 링크 관계를 만들어도 좋을까요?
답변 : 그렇다면 무한 새로운 연결 관계가 만들어 계속하게 될 것입니다. 여러 사람이 똥 같은 것을 만드는 것을 그만두게 위해 WHATWG에서 제시한 rel
값을 관리하고 , 어떻게 승인되어가는 방법을 설명합니다 .
그럼 주제 페이지 의 첫 번째 링크의 관계를 살펴 봅시다 :
<link rel="stylesheet" href="style-original.css" type="text/css" />
이것은 가장 일반적으로 사용되는 링크 관계 것입니다 (문자 그대로). <link rel="stylesheet">
는 CSS 규칙이 작성된 외부 파일을 가리 킵니다. type
특성을 제거하는 것만이 HTML5에있는 최적화입니다. 스타일 시트 언어로 웹상에서 CSS 밖에 없기 때문에, type
속성 기본값으로되어 있습니다. 모든 브라우저에서 동일하게 작용할 것입니다 (만약 새 스타일 시트 언어가 언젠가 만들어진해도 type
속성을 추가하면된다한다.)
<link rel="stylesheet" href="style-original.css" />
계속 소재의 페이지 를 살펴 보도록하자 :
<link rel="alternate" type="application/atom+xml" title="My Weblog feed" href="/feed/" />
이 링크 관계도 잘 알려져 있습니다. <link rel="alternate">
을 type
속성 RSS 및 Atom 미디어 유형과 결합 "feed autodiscovery"라는 구조가 활성화됩니다. 그러면 피드 리더 (예 : Google Reader 와 같은)가 최신의 기사가 실려있는 피드를 자동으로 찾을 수 있습니다. 대부분의 브라우저는 URL 옆에 특별한 아이콘을 표시하여 주기도합니다. rel="stylesheet"
과 달리, type
특성은 매우 중요합니다. 삭제하지 않도록합시다!
rel="alternate"
라는 링크의 관계는 매우 다양하게 사용됩니다. HTML 4 에서조차 그렇습니다. HTML5에서 정의를 기존의 웹 콘텐츠를보다 정확하게 표현할 수 있도록 상세하게 쓰고 다시 분명한시켰습니다. 위와 같이, rel="alternate"
를 type=application/atom+xml
함께 사용하는 경우 해당 페이지의 Atom 피드를 가리 킵니다. 그러나 rel="alternate"
다른 type
속성과 함께 사용하여, 예를 들면 PDF 같이 동일한 내용의 다른 형식을 가리키는 수도 있습니다.
HTML5는 문서의 번역에 대해 어떻게 링크를 치면 좋은 것인 지라고 오랫동안 혼란 상황에 대해서도 해결했습니다. HTML 4에서는 lang
속성을 rel="alternate"
과 함께 사용하여 대상 문서의 언어를 선언하고 있었 습니다만, 이것은 실수였습니다. HTML 4 Errata 는 HTML 4 규격 4 개의 완전한 실수를 나열합니다. 그들 전체 과오 중 하나가 rel="alternate"
로 연결되는 링크가 문서의 언어를 선언하는 방법입니다. HTML 4 Errata와 HTML5에 명시된 올바른 방법은 hreflang
속성을 사용합니다. 불행히도이 정오표는 이미 HTML 4 규격에 반영되지 않습니다. W3C HTML Working Group 아무도 HTML 개발에 종사하고 있지 않기 때문입니다
rel = "archives" - 기록이나 문서 등 과거 기록의 목록을 보려면 문서를 가리 킵니다. 블로그 인덱스 페이지에서 rel = "archives"를 사용하여 과거 로그 인덱스 페이지에 링크를 펼 수있을 것입니다.
rel="author"
는 해당 페이지의 제작자에 연결하는 데 사용합니다. mailto:
주소도 그렇고 않아도 상관 없습니다. 문의 양식에 대한 링크도 "제작에 관하여"페이지에 대한 링크도 좋습니다.
rel = "external" - 문서가 포함된 사이트의 일부가 아닌 문서를 가리 킵니다. 내 기억으로는 WordPress 에 댓글 작성자가 남긴 링크 썼는데에서 퍼졌다고 생각합니다.
HTML 4에서 rel="start"
와 rel="prev"
, rel="next"
를 일련의 문서 (도서 장별 또는 블로그에 게시 등) 관계를 나타내기 위해 규정하고 있습니다. 제대로 사용되고있는 것은 rel="next"
뿐입니다. 많은 사람들은 rel="previous"
을 rel="prev"
대신 사용하거나 rel="begin"
와 rel="first"
를 rel="start"
대신 사용하거나 rel="end"
을 rel="last"
대신 사용하기도합니다. 추가에 rel="up"
에서 "부모"페이지를 지시하기도합니다.
HTML5는 "일련의 첫 번째 페이지"를 표현하기 위해서 사용되었던 다양한 것들 중에서 가장 일반적이었다 rel="first"
를 포함하기로했습니다 ( rel="start"
은 역호환성을 성을 위해 제공되는 동일한 의미를 갖는다). 다른 HTML 4와 같이 rel="prev"
와 rel="next"
이전 버전과의 호환성을 위해 rel="previous"
와 rel="last"
(일련의에서 마지막 페이지 또는 rel="first"
반대), rel="up"
도 포함됩니다.
rel="up"
은 부스러기 탐색을 상기시켜 보면 좋을 것입니다. 홈 페이지가 부스러기 탐색의 첫 페이지에서 현재 페이지가 마지막으로되어 있죠? rel="up"
은 부스러기 탐색의 마지막 페이지 바로 옆집을 지시하게 될 것입니다.
rel = "icon" 는 rel="stylesheet"
에 이어 두 번째로 유명한 링크 관계입니다 . 일반적으로 shortcut
과 함께 다음과 같이 사용됩니다 :
<link rel="shortcut icon" href="/favicon.ico">
모든 주요 브라우저는 작은 아이콘을 해당 페이지를 연결하여줍니다. 위치 표시줄의 URL의 바로 옆에, 브라우저 탭, 혹은 그 양쪽 모두에 사용되는 경우가 많습니다.
HTML5의 새로운 기능 : icon
함께 sizes
속성을 사용하여 참조되는 아이콘의 크기를 나타낼 수 있습니다 .
rel = "license" 는 microformats로 고안되었습니다 . 현재 문서가 어떤 라이센스 형태로 제공되고있는지를 설명하고있는 문서를 가리 킵니다.
rel = "nofollow" 는 대상이 페이지의 제작 자나 발행자가 승인하지 않거나 참조하는 문서가 주로 상업적인 의도를 가지고있다는 것을 가리 킵니다. 이것은 Google가 고안한 것으로 , microformats 의해 표준화되었습니다 . WordPress 는 rel="nofollow"
주석에 포함된 링크를 추가합니다. "nofollow"링크가 PageRank에 영향을주지 않는다면, 스패머가 스팸 코멘트를 블로그에 게시하는 것을 포기하는 것이 아닌가하는 생각에 의한 것이었습니다. 그렇게는되지 않았지만 여전히 rel="nofollow"
은 사용되고 있습니다.
rel = "noreferrer" 는 링크로 참조를 전송하지 않도록 지시합니다. 현재 브라우저는 지원하지 않지만 WebKit nightly에서 지원되는 때문에 조만간 Safari 나 Google Chrome, 다른 WebKit 기반 브라우저에서 지원되게 될 것입니다. [ rel = "noreferrer"test case ]
rel = "pingback" 는 "pingback"서버 주소를 가리 킵니다. Pingback 사양 에 따르면 "pingback 시스템은 다른 웹 사이트의 링크를 붙인 것을 알려줍니다 .... 이렇게 연결 체인을 반대로 추적될 수 있습니다"라고 설명되지 있습니다. 블로그 시스템, 특히 WordPress는 pingback을 구현하고 새 게시물 링크를 연결한 페이지 제작자에게 알리도록되어 있습니다.
rel = "prefetch" 사용자가 먼저 확실히 볼 것이다 때문에 앞을 캐시하기 위해 참조해야 할 리소스를 가리 킵니다. 검색 엔진은 검색 결과에서 1 위의 페이지가 다른 결과보다 압도적으로 인기 경우 종종 <link rel="prefetch" href=" URL of top search result ">
검색 결과 페이지에 추가하고 있습니다. 예를 들어 Firefox를 사용하여 CNN을 Google 검색 소스를 열고 prefetch
키워드로 검색하여보세요. Mozilla Firefox만이 rel="prefetch"
을 지원하고 있습니다.
rel = "search" 는 문서 및 관련 리소스를 검색하기위한 인터페이스가 포함된 문서를 참조하는 것을 나타냅니다. 특히 rel="search"
를 유익하게하고 싶다면, 브라우저에서 어떻게 주어진 키워드에 현재 사이트 검색 URL을 구축하면 좋은가를 정의한 OpenSearch 에 따라 문서를 가리 키도록해야한다 시작해야한다. OpenSearch (이 OpenSearch 정의 문서를 가리키는 rel="search"
)는 Microsoft Internet Explorer 7 이상과 Mozilla Firefox 2 이상에서 지원됩니다.
rel = "sidebar" 는 참조된 문서가 현재 참조중인 컨텍스트에 대한 부차적인 컨텍스트에 로드된 할 문서임을 가리 킵니다.
무슨 뜻인가하면, Opera와 Mozilla Firefox에서는 "링크를 클릭하면 책갈피하는지 질문하고 즐겨찾기에서 선택된
경우에는 그 대상 문서를 브라우저의 사이드바에서 열기"라는 의미에 되어 있습니다 (Opera에서는 "sidebar"대신
"panel"라고합니다). Internet Explorer와 Safari, Chrome는 rel="sidebar"
는 무시되고 보통 링크처럼 취급됩니다. [ rel = "sidebar"test case ]
rel = "tag" 현재 문서에 붙은 태그를 대표하는 문서를 가리 킵니다. rel
속성을 사용하여 "태그"(카테고리 키워드) 연결은 블로그에 게시 카테고리 분류를 쉽게하기 위하여 Technorati에 의해 고안되었습니다 .
초기의 블로그와 튜토리얼 사이트는 그렇게 태그를 "Technorati 태그"로 연결되었습니다 (You read that
right : 영리 기업이 모든 것이 메타 데이터를 붙이면 더 일을하고 쉽게 될 것이라고 설득했습니다 입니다. Nice work
if you can get it!) 후에 microformats에서 표준화된 , rel="tag"
등으로 불리게되었습니다. 많은 블로그 시스템은 rel="tag"
의 카테고리와 키워드 또는 태그 개별 게시물을 연결할 수 있도록되어 있습니다. 브라우저 이들을 이용하여 뭔가 특별한 것을하거나하지 않습니다. 주로 검색 엔진이 그 페이지가 어떻게 것들에 대해 쓰여져 있는지의 기준으로 이용할 수 염두에 두어야합니다.
❧
HTML5는 단순히 기존의 태그를 단축하는 것만하지는 않습니다 (대체로 적당한 길이로 짧게주고도 있겠지만). 새로운 의미 론적 요소를 정의도 있습니다.
<section>
section
요소는 문서 또는 응용 프로그램의 일반적인 부분을 표현합니다. 여기에서 말하는 섹션은 특정 주제에 맞는 내용의 집합이며 종종하고 표제가 붙어 있습니다. 섹션의 예로는 책 장 또는 탭 대화 상자의 각 탭 페이지 논문 번호가 할당된 항목 등이 될 것입니다. 웹사이트 홈페이지에서는 서론이나 신착 기사, 연락처 정보 등을 각각 섹션으로 구분할 수있을 것입니다. <nav>
nav
요소는 다른 페이지에 대한 링크와 해당 페이지에 대한 링크가 포함된 섹션을 나타냅니다. 즉 탐색 링크를 포함하는 섹션입니다. 모든 링크의 집합이 nav
요소 다음에해야한다가하면 그런 것은 없습니다 - 주요 탐색 블럭화된 섹션만 nav
요소로 적합합니다. 바닥글에 자주 웹사이트의 주요 페이지 및 서비스 이용 약관, 홈페이지, 저작권 정보에 대한 링크에서 사용되는 경우가 많습니다. footer
요소는 그냥 그런 케이스에 충분히 대응하는 것이 있기 때문에 반드시 nav
요소를 사용할 필요는 없습니다. <article>
article
요소, 예를 들어 그냥 피드 등으로 전송 가능하거나 재사용하는 자체로 완결하고있는 문서, 페이지 및 응용 프로그램, 웹사이트를 표현하는 것입니다. 포럼에 게시하거나 잡지나 신문 기사, 블로그 항목, 사용자 댓글이 대화식 위젯과 가젯, 기타 독립적인 컨텐츠 부분 등에 사용할 수 있습니다. <aside>
aside
요소는 aside
요소로 묶인 부분이 본문에서 조금 탈선있어, 본문과는 별개로 파악하고 원하는 부분을 표현합니다. 신문이나 잡지 등 인쇄 매체에서 말하는 사이드바 같은 섹션을 표현할 수도 있습니다. 구체적으로 인용이나 사이드바, 광고, nav
요소 집합의 다른 웹 페이지의 기본이되는 내용에서 분리시키고 싶은하게 사용할 수 있습니다. <hgroup>
hgroup
섹션 제목을 표현합니다. 이 요소는 소제목이 있고, 다른 표현을했다 표제가 있고, 캐치 프레이즈가 있기도하여 여러 h1
~ h6
요소가 출현하는 경우에 그들을 구성하는 데 사용됩니다. <header>
header
요소는 서론 및 탐색 도움이 될 것으로 정리를 표현합니다. header
요소는 주로 섹션 제목 ( h1
~ h6
요소 또는 hgroup
요소)를 묶는 데 사용되는 경우가 많은데, 필수라고하지는 않습니다. 또한 header
요소에는 항목의 색인 및 검색 양식 적절한 로고를 포함할 수 있습니다. <footer>
footer
요소는 최근의 조상 또는 루트 요소에 해당하는 섹션 바닥글을 표현합니다. 많은 경우 바닥글에는 누가 썼는지 및 또는 관련 문서 링크, 저작권 정보 등 그 섹션에 대한 정보가 포함되어 있습니다. 바닥글 섹션의 마지막에 있어야한다는 것은, 단순히 많은 경우 이렇게되어 있다고 할뿐입니다. footer
요소 섹션 모두를 묶어 주면, 그들에 부록이나 목차, 긴 파트너 프로그램 중복 라이센스 조건을 표현할 수 있습니다. <time>
time
요소는 24 시간제의 시간 및 예측 태양력에 따라 정확한 날짜, 그 경우에는 옵션으로 시간과 시차 등을 포함한 것,을 나타냅니다. <mark>
mark
요소는 참조되는 것을 고려하여 표시하거나 강조 표시 문서의 일련의 문자열을 표현합니다. 만약이 장을 아직 읽고 있지 않다면 이러한 새로운 요소를 사용하는 것에 불안을 기억하는 것입니다. 그러나, 약간 우회해야합니다.
❧
어떤 브라우저에도 이미 지원하는 HTML 요소에 대한 습득있는 목록이 있습니다. 예를 들어 Mozilla Firefox 목록 nsElementTable.cpp 에 저장되고이 목록에없는 요소는 "알 수없는 요소"로 간주됩니다. 알 수없는 요소에는 두 가지 근본적인 문제가 있습니다 :
<p>
상하 공간을 잡고 <blockquote>
왼쪽에 여백을 가지고 들여쓰기되어 <h1>
큰 글꼴로 표시됩니다. 그렇지만 알 수없는 요소의 경우는 어떤 스타일을 적용하면 좋을까요? nsElementTable.cpp
에는 각각의 요소가 어떤 요소를 내포 수있는가하는 정보가 포함되어 있습니다. 만약 태그에 <p><p>
는 같은 코드를 포함하면 두 번째 단락 요소는 첫 번째 것을 자동으로 닫기 때문에,이 두 요소는 부모와 자식 관계가 아니라 형제 관계입니다 . 그러나 <p><span>
라고하는 코드를 작성하면, Firefox는 <p>
이 블록 레벨 요소 인라인 요소이다 <span>
을 내포다는 것을 알고 있기 때문에, span
요소는 단락을 닫습 없습니다. 즉, DOM에서는 <span>
은 <p>
아이는 것입니다. 브라우저마다이 문제에 대해 다른 대답을 가지고 있습니다 (나는 그것을 알고 충격을 받았다). 가장 유명한 Microsoft Internet Explorer가 이러한 문제에 대한 대답이 가장 많은 문제를 안고 있습니다만, 어떤 브라우저에서도 약간의 도움이 필요합니다.
첫 번째 문제에 대한 대답은 매우 간단하고 알 수없는 요소에 특히 아무것도 스타일링하지 않는 것입니다. 페이지에 나타나는 위치에 따라 CSS 속성을 상속하고 페이지 제작자 CSS에서 알 수없는 요소를 스타일링 수 있도록하면 좋습니다. 이제 대개는 잘 갑니 다만, 한가지 주의해야 할 수 있습니다.
모든 브라우저는 미확인 요소를 인라인 요소로 표시합니다. 즉 마치 display:inline
는 CSS 규칙을 가지고있는 것처럼.
HTML5에서는 새로운 요소 중 일부는 블록 요소로 정의되고 있습니다. 따라서 그들은 다른 블록 레벨 요소를 내포 수, HTML5 지원 브라우저에서 기본적으로 display:block
으로 스타일링합니다. 만약 오래된 브라우저에서 이러한 요소를 사용하려면 수동으로 스타일을 정의하지 않으면 안됩니다 :
article,aside,details,figcaption,figure, footer,header,hgroup,menu,nav,section { display:block; }
(이 코드는 장에서 만지지 같은 것에 대해서도 여러 해주는 Rich Clark의 HTML5 Reset Stylesheet 에서 따온 것입니다.)
만약, 이것은 안 하잖아요! 버전 9 이전의 Internet Explorer에서는 알 수없는 요소에 대해 전혀 스타일링 수 없습니다. 예를 들어 다음과 같은 태그가 있었다고합니다 :
<style type="text/css"> article { display: block; border: 1px solid red } </style> ... <article> <h1>Welcome to Initech</h1> <p>This is your <span>first day</span>.</p> </article>
Internet Explorer (IE 8 포함)에서는 <article>
요소를 블록 레벨 요소로 취급 해주지 않고, 빨간 테두리 기사 주위에 걸려도주지 않습니다. 모든 스타일 규칙은 무시됩니다. Internet Explorer 8은 아직 베타 버전이지만 , Microsoft는 Internet Explorer 9에서는이 문제가 일어나지 않을 것이라고 발표하고 있습니다 (개발자도 확인했습니다).
두 번째 문제는 알 수없는 요소를 발견했을 때 브라우저가 어떤 DOM을 구축해야하는가하는 것입니다. 또다시 Internet Explorer가 가장 귀찮습니다. IE 요소 이름이 인식하지 못하는 경우 그 요소를 자식이없는 빈 노드로 DOM에 추가하게됩니다. 그리고 알 수없는 요소의 자식에 해당하는 모든 요소는 형제로 추가됩니다.
ASCII 아트를 사용하여 그 차이를 도해하여 봅시다. 다음은 HTML5의 DOM입니다 :
article | + - h1 (child of article) | | | + - text node "Welcome to Initech" | + - p (child of article, sibling of h1) | + - text node "This is your" | + - span | | | + - text node "first day" | + - text node ""
대해 Internet Explorer는 다음과 같은 DOM을 구축하게됩니다 :
article (no children) h1 (sibling of article) | + - text node "Welcome to Initech" p (sibling of h1) | + - text node "This is your" | + - span | | | + - text node "first day" | + - text node ""
이 문제에 대해서는 불가 사 의한 해결책이 있습니다. <article>
요소가 출현 이전에 JavaScript에서 거짓으로 그 요소를 만들 때 이상하게도 Internet Explorer가 <article>
요소를 인식하게 CSS로 스타일링 할 수 있습니다. 그 더미 요소는 DOM에 추가할 필요가 전혀 없습니다. IE가 인식할 수없는 요소를 스타일링 할 수있는 것처럼 한 번만 요소 만들기 (페이지 당) 해 준다뿐입니다.
<html> <head> <style> article { display: block; border: 1px solid red } </style>
<script> document.createElement ( "article"); </ script>
</ head>
<body>
<article>
<h1> Welcome to Initech </ h1>
<p> This is your <span> first day </ span> </ p>
</ article>
</ body>
</ html>
이 기술은 IE 6을 포함한 모든 버전의 Internet Explorer에서 잘 작동합니다. HTML5에 새로 책정된 요소에 대해 동일한 기술을 유용 - 다시 말하지만 DOM에 아무것도 추가할 필요가 없기 때문에 더미 요소를 볼 수 없을 것입니다 - 수 있기 때문에, 그 새로운 요소를 HTML5를 지원하지 않는 브라우저에서도 특별히 의식하지 않고 사용할 수 있습니다.
Remy Sharp는이 기술을 HTML5 활성화 스크립트 는 실로 적절한 이름으로 공개하고주었습니다. 이 스크립트는 이미 14 차례나 갱신되고 있습니다만, 기본적으로 다음과 같은 코드를 기반으로합니다 :
<!--[if lt IE 9]> <script> var e = ("abbr,article,aside,audio,canvas,datalist,details," + "figure,footer,header,hgroup,mark,menu,meter,nav,output," + "progress,section,time,video").split(','); for (var i = 0; i < e.length; i++) { document.createElement(e[i]); } </script> <![endif]-->
<!--[if lt IE 9]>
와 <![endif]-->
은 조건부 주석 (조건부 댓글) 하는 것입니다. Internet Explorer는 이러한 if
식과 같이 취급 : 만약 현재의 브라우저 버전이 버전 9 아래면이 블록은 실행됩니다. 다른 브라우저는 모든이 블록을 HTML 주석으로 처리합니다. 라는 이유로 Internet Explorer (버전 8까지)이 스크립트를 실행하고 다른 브라우저는 스크립트를 완전히 무시하는 것입니다. 이렇게하여이 해킹을 필요로하지 않는 브라우저에서는 페이지 로딩이 빨리 될 것입니다.
이 JavaScript 코드는 간단 명료 것입니다. e는 "abbr"
나 "article"
" "aside"
등의 문자열 배열에서 배열을 루프로 돌려 document.createElement()
요소를 생성합니다. 그리고 반환값을 무시하여 DOM 요소가 추가되지 않도록하고 있습니다. 이제 Internet Explorer가이 새로운 요소를이 페이지에 나중에 사용할 수 있지만 우리가 원하는 정도로 취급주게됩니다.
"하나만"중요한 것은이 있습니다. 이 스크립트는 웹 페이지의 마지막이 아닌 시작, 있으면 <head>
요소에 쓸 필요가 있습니다. 이렇게하면 Internet Explorer는 웹 페이지의 태그와 속성을 구문 분석 이전에이 스크립트를 실행하여줍니다. 만약 웹 페이지의 끝에 쓸 경우 실행되는 것이 너무 느려 이후 Internet Explorer 마크업을 잘못 해석한에 잘못된 DOM을 구축하게됩니다. 그런 오류를 수정하는 것은이 스크립트는 불가능하다는 것도 이유입니다.
Remy Sharp이 스크립트를 "단축시켜" Google Code에서 공개하고 있습니다 (이 스크립트는 오픈 소스, 그리고 MIT 라이센스이므로 어떤 프로젝트에 사용할 수 있습니다.) 원한다면 Google Code에서 호스팅되고있는 코드를 다음과 같이 직접 사용할 수 있습니다 :
<head> <meta charset="utf-8" /> <title>My Weblog</title> <!--[if lt IE 9]> <script
src = " http://html5shiv.googlecode.com/svn/trunk/html5.js " > </ script>
<! [endif] ->
</ head>
이것으로 드디어 HTML5의 새로운 의미 론적 요소를 사용할 수있게되었습니다.
❧
그럼 예로 들었다 웹 페이지 로 돌아가 보자. 우선 헤더만을 봐 :
<div id="header"> <h1>My Weblog</h1> <p class="tagline">A lot of effort went into making this effortless.</p> </div> … <div class="entry"> <h2>Travel day</h2> </div> … <div class="entry"> <h2>I'm going to Prague!</h2> </div>
특히 태그에 재미있는 곳은 없습니다. 만약 이것을 사용하고 싶다면 그대로 사용해도 상관 없습니다. HTML5로 합리적입니다. 그러나 HTML5에서는 헤더 및 섹션에 대한 몇 가지 의미 론적 요소를 제공합니다.
우선 <div id="header">
을 삭제하자. 이 부분은 잘 보이는 것이지만, 뭔가 특별한 의미가있는 것은 아닙니다. div
요소는 특별한 의미를 정의하지 않고, id
속성도 마찬가지로 특별한 의미를 가지지 않습니다 (사용자 에이전트는 id
속성의 값이 어떤 의미가있는 것처럼 취급해서는 안됩니다). 이 부분을 <div id="shazbot">
대체해도 같은 의미 즉 아무런 의미가 없습니다.
HTML5에서는 이러한 경우에 사용하는 요소로 <header>
요소가 정의되어 있습니다. HTML5의 사양은 <header>
요소의 구체적인 사용 방법 에 대해서도 언급하고 있습니다. 소재로 한 페이지 는 어떻게 될까요? :
<header> <h1>My Weblog</h1> <p class="tagline">A lot of effort went into making this effortless.</p> … </header>
이것만으로는 좋습니다. 이것만으로도이 헤더임을 누구나 알 수 있습니다. 그러나 캐치 프레이즈는 어떻게하면 좋을까요? 이 부분 또한 Web 표준으로 지금까지 특별히 정의되지 않았기 때문에 잘 보이는 것입니다. 이것을 태그하는 것은 꽤 어려울 것입니다. 캐치 프레이즈는 부표와 비슷하지만 큰 제목에 "붙어"있습니다. 결국 이것은 섹션이없는 부제는 것입니다.
제목 요소이다 <h1>
이나 <h2>
웹페이지를 구조화합니다. 이들을 동시에 사용하여 웹 페이지를 도해하고 (추적하거나)하는 데 사용할 수있는 윤곽선을 만들 수 있습니다. 웹 페이지 읽기 소프트웨어는 문서의 개요를 사용하여 맹목적인 사용자가 웹 페이지 탐색을 할 수 있도록하고 있습니다. 문서 개요를 시각화할 수있는 온라인 도구 와 브라우저 확장 도 있습니다.
HTML 4에서 <h1>
~ <h6>
요소만 문서의 개요를 만들었습니다. 예로 든 페이지의 개요는 다음과 같은 것이됩니다 :
My Weblog (h1) | + - Travel day (h2) | + - I'm going to Prague! (h2)
이것은 이것대로 문제 없지만, "A lot of effort went into making this effortless"라는 캐치 프레이즈를 마크업하는 방법이 없습니다. 만약 <h2>
를 사용하여 마크업하면 문서의 개요를 가장 단지 노드가 만들어집니다 :
My Weblog (h1) | + - A lot of effort went into making this effortless (h2) | + - Travel day (h2) | + - I'm going to Prague! (h2)
이것은이 문서의 구조로서 적절하지 않습니다. 캐치 프레이즈는 섹션을 만들지 않을 단순한 부제에 지나지 않는 것입니다.
그럼 캐치 프레이즈를 <h2>
, 각 기사 제목을 <h3>
에하면 좋은가? 아니, 이렇게 해 버리면 더 이상한 일이됩니다 :
My Weblog (h1) | + - A lot of effort went into making this effortless (h2) | + - Travel day (h3) | + - I'm going to Prague! (h3)
외관뿐만 노드를 만들수에 본래라면 최상위 노드에 속하는 것이 아이를 "빼앗아 죽어 버린다 '. 이상으로부터, HTML 4는 소제목 문서 개요에 추가하지 않고 마크업 방법이 없다는 문제가있는 것으로 밝혀졌습니다. 이 문제에 대해 어떻게해도 "쓸모없는 노력의 더미"라는 결과가 끝납니다. 그래서 <p class="tagline">
라고하는 의미적으로 전혀 의미없는 마크업을하게되어 버린 것입니다.
HTML5에서는 <hgroup>
요소에 의해이 문제를 해결할 수 있습니다. <hgroup>
요소는 두 개 이상의 관련 표제 요소를 정리해줍니다. "관련한다"는 무슨 뜻인가요? 그들 제목 요소가 문서 개요에서 하나의 노드에 저장된다는 것입니다.
다음과 같이 마크업하면 :
<header>
<hgroup>
<h1> My Weblog </ h1>
<h2> A lot of effort went into making this effortless. </ h2>
</ hgroup>
...
</ header>
...
<div class="entry">
<h2> Travel day </ h2>
</ div>
...
<div class="entry">
<h2> I'm going to Prague </ h2>
</ div>
문서의 개요는 다음과 같이 구성됩니다 :
My Weblog (h1 of its hgroup) | + - Travel day (h2) | + - I'm going to Prague! (h2)
HTML5 Outliner 에서 자신이 만든 웹 페이지 제목 요소를 적절하게 사용하고 있는지 여부를 테스트할 수 있습니다.
❧
소재로 한 페이지 는 아직도 계속됩니다. 다음과 같은 태그는 어떻게 할 수 있을까요? :
<div class="entry"> <p class="post-date">October 22, 2009</p> <h2> <a href="#" rel="bookmark" title="link to this post"> Travel day </a> </h2> … </div>
이 또한 적절한 HTML5입니다. 하지만 HTML5는 웹 페이지 문서를 마크업하는 데 더 적당한 요소를 제공하고 있습니다. 그것은 <article>
요소입니다.
<article> <p class="post-date"> October 22, 2009 </ p> <h2> <a href = "#" rel = "bookmark" title = "link to this post"> Travel day </ a> </ h2> ... </ article>
이것은 매우 간단하다고는 말할 수 없겠 네요. 이외에도 아직 변경 할 점은 있습니다. 수정된 소스를보고하십시오. 다음 설명합니다 :
<article> <header> <p class="post-date">October 22, 2009</p>
<h1>
<a href = "#"
rel = "bookmark"
title = "link to this post">
Travel day
</ a>
</ h1>
</ header>
...
</ article>
알 수 있을까요? <h2>
요소를 <h1<
하고 <header>
요소에 포함합니다. <header>
에 대해서는 이미 언급한 바와 같이 그 역할은 기사의 표제 (이 경우는 기사의 제목과 발행 일자)를 구성하는 요소를 정리하는 것입니다. 아니, 그렇지만,하지만 <h1>
문서마다 하나만으로는 없나요? 문서 개요를 엉망으로 버리지 않습니까? 그런 것이되지 않지만 왜 그렇게해야하는지 이해하기 위해 조금 자세히 설명합시다
HTML 4는 문서의 개요를 만들 수있는 것은 <h1>
~ <h6>
요소 뿐이었습니다. 개요 루트 노드를 하나만하고 싶은 경우 <h1>
는 마크업에서 하나 밖에 사용할 수 없습니다. 대해 HTML5의 사양은 문서 개요를 생성하기위한 알고리즘을 정의되고 , 그것은 HTML5의 새로운 의미 론적 요소가 포함되어 있습니다. HTML5 알고리즘은 <article>
요소는 새로운 섹션, 즉 문서의 개요에 새로운 노드를 만든다는 것으로되어 있습니다. 그리고 HTML5에서는 각 섹션에 <h1>
을 가질 수 있습니다.
이것은 HTML 4에서 크게 달라진 점이지만, 왜 좋은 변경인가하는 것을 설명하겠다. 많은 웹 페이지는 어떤 종류의 편지지 (템플릿)을 사용하여 제작되고 있습니다. 내용 중 일부는 다양한 곳에서 가지고 오게되고, 그들은 웹 페이지 곳곳에 삽입됩니다. 많은 연습 "이 HTML 코드를 복사하여 웹페이지에 붙여 보자"라는식으로 설명하는 것입니다. 아주 작은 콘텐츠의 경우 이래도 괜찮은 있겠지만 전체 섹션 태그를 붙인다고하는 경우는 어떨까요? 연습에서는 다음과 같이 설명하는 것입니다 : "이 HTML 코드를 복사하여 편집기에 붙여 삽입할 웹 페이지에 적합하도록 제목 태그의 수준을 수정해야한다"
다른 말로하면, HTML 4는 융통성의 국화 제목 요소를 가지고 있지 않다는 것입니다. 단 여섯 개의 숫자가있는 제목 요소 <h1>
~ <h6>
, 밖에없고, 그 숫자가 그대로 점수 순서에 중첩되지 않으면 안됩니다. 이것은 특히 웹 페이지를 "편집"이 아닌 "생성"하는 경우는 적립되지 않습니다. HTML5에서는이 문제를 새로운 세쿠쇼닌구 요소와 기존의 제목 요소에 대한 새로운 규칙을 마련하는 것으로 해결했습니다. 만약 이미 새로운 세쿠쇼닌구 요소를 웹 페이지에서 사용하는 경우 :
<article> <header> <h1>A syndicated post</h1> </header> <p>Lorem ipsum blah blah…</p> </article>
이 코드를 복사하여 아무것도 변경하지 않고 웹 페이지의 어디에 붙여 넣을 수 있습니다. 전체 <article>
로 둘러싸인 있으므로 <h1>
요소가 포함되어 있는지에 전혀 문제가 없습니다. 이 경우 <article>
요소는 붙여 넣은 문서 개요 노드에 새로운 노드로 삽입되고 <h1>
요소가 노드의 제목이 원래 그 웹페이지에 있던 다른 세쿠쇼닌구 요소는 문서 개요에서 이전과 동일한 상태로 유지합니다.
다른 웹 기술과 마찬가지로 현실은 좀 까다로운입니다. 새로운 "명쾌한"세쿠쇼닌구 요소 ( <h1>
가 포함된 <article>
)는 오래된 "암시"세쿠쇼닌구 요소 ( <h1>
~ <h6>
자체)와 함께 생각지도 못한 일이 버립니다 . 모두가 아닌 중 하나를 이용해서 간단히 할 수 있지만. 다만 동일한 웹 페이지에서 모두 사용하지 않으면 안되는 경우, HTML5 Outliner 에서 어떤 결과가 있는지 확인하는 것이 좋습니다.
❧
음모를 꾸미고 있지요? "에베레스트에서 알몸으로 성조기여 영원하라를 부르며 뒤로 스키를한다"등의 의미에서 흥미로운 아니라 시맨틱 마크업이 어디까지 진행되고 있는지라고하는 의미입니다. 는 소재로하고있는 페이지 의 자세히 살펴보겠습니다. 다음 주목하고 싶은 것은 다음과 같습니다 :
<div class="entry">
<p class="post-date"> October 22, 2009 </ p>
<h2> Travel day </ h2>
</ div>
질리지하고 있지요? 자주있는 패턴 - 기사 발행 일자 지정 - 전혀 시맨틱 마크업이 아닌 class
속성 어떻게든하려고합니다. 이 또한 적절한 HTML5가 있습니다. 변경하는 것이 요구되고있는 것은 없습니다. 하지만 HTML5에서는이 경우에 사용할 수있는 <time>
요소가 제공됩니다.
<time datetime="2009-10-22" pubdate>October 22, 2009</time>
<time>
은 세 부분으로 나눌 수 있습니다 :
pubdate
는 모든 플래그 이 예에서는 datetime
속성에 날짜만 포함되고 시간은 포함하지 않습니다, 네 자리 연도와 두 자리 월, 두 자리 날짜가 "-"로 연결됩니다 :
<time
datetime = "2009-10-22" pubdate> October 22, 2009 </ time>
만약 시간을 추가하려면, T
문자를 날짜로 계속 쓰고 그 스물넷 시간 형식의 시간, 또는 시차를 씁니다.
<time datetime="
2009-10-22T13 :59:47-04 : 00 "pubdate>
October 22, 2009 1:59 pm EDT
</ time>
(이 날짜와 시각의 포맷은 매우 유연합니다. HTML5 스펙에는 정확한 날짜와 시간 예제도 포함되어 있습니다 .)
텍스트 부분 - <time>
와 </time>
사이에있는 것 -도 기계적으로 판단할 수있는 날짜와 시간에 맞게 수정했다는 것을주의하십시오. 필요든지 이렇게해야한다는 것은 없습니다. datetime
속성에서 기계적으로 판단할 수있는 날짜와 시간조차 제대로 쓰고 있으면 텍스트 부분은 어떻게 써도 상관 없습니다. 즉 다음과 같이 써도 HTML5 타당하다는 것입니다 :
<time datetime="2009-10-22">
last Thursday </ time>
또는 이렇게 써도 HTML5로 적당하다 :
<time datetime="2009-10-22"></time>
마지막은 pubdate
속성입니다. 이것은 부울 속성에서 필요한 경우 다음과 같이 추가하면됩니다 :
<time datetime="2009-10-22"
pubdate > October 22, 2009 </ time>
만약 속성을 "그대로"쓰고 싶지 않다면 이렇게 써도 상관 없습니다.
<time datetime="2009-10-22"
pubdate = "pubdate" > October 22, 2009 </ time>
pubdate
속성은 어떤 의미를 갖는 것입니까? 이 속성은 두 가지 의미를 가집니다. 만약 <time>
속성이 <article>
요소에있는 경우 해당 문서의 발행 일자를 의미하고 만약 <time>
가 <article>
중에는 않으면 전체 문서의 발행 날짜를 의미합니다.
그러면 전체 기사를 HTML5를 사용하여 작성 다시 봅시다 :
<article> <header> <time datetime="2009-10-22" pubdate> October 22, 2009 </time> <h1> <a href="#" rel="bookmark" title="link to this post"> Travel day </a> </h1> </header> <p>Lorem ipsum dolor sit amet…</p> </article>
❧
탐색 모음은 웹 사이트의 가장 중요한 부분 중 하나입니다. CNN.com에서는 "탭"각각의 웹 페이지에서 찾을 각종 뉴스 카테고리 - "기술", "건강", "스포츠"등 -에 링크되어 있습니다. Google 검색 결과 페이지에도 비슷한 것이있어, Google 다른 서비스 - "그림", "동영상", "지도"등 -에서 같은 검색어에 따라 검색 다시 할 수있게되어 있습니다. 예제 페이지 에 탐색 도구 모음 헤더에 있으며 예로서 다른 부분 - "홈", "블로그", "갤러리"등 -에 대한 링크가 있습니다.
탐색 모음은 다음과 같이 마크업 있습니다 :
<div id="nav"> <ul> <li><a href="#">home</a></li> <li><a href="#">blog</a></li> <li><a href="#">gallery</a></li> <li><a href="#">about</a></li> </ul> </div>
물론 이것도 적절한 HTML5입니다. 목록으로 네 개의 항목이 표시 등록되어 있습니다만, 그것이 웹 사이트 탐색 것은 가르쳐주지 않습니다. 헤더의 일부가되어 있거나, 연결 문자열에서 시각적으로 유추할 수 있지만, 의미적으로 다른 링크 목록과 아무런 변함이없는 것입니다.
누가 웹 사이트 탐색의 의미를 걱정하는 것입니까? 예를 들어 장애를 가진 사람 입니다. 이유는 무엇입니까? 다음과 같은 상황을 생각해보세요 : 손발의 움직임이 제한되어있어 마우스를 사용할 수 어렵다면 그 보조를 위해 기본 탐색 추적 (또는 이전)위한 브라우저 확장을 사용할 것이다 . 또는 다음과 같은 상황도 고려하십시오 : 시각 장애가있는 경우 "음성 읽기 소프트웨어"라는 문장을 읽고 나서 웹페이지를 요약주는 것을 사용하는 것이 아닐까요. 웹 페이지의 제목 다음에 중요한 것은 기본 탐색 링크에 대한 정보입니다. 신속하게 사이트를 걷고 싶은 경우 탐색 표시줄에 바로 이동할 수 있도록 음성 읽기 소프트웨어에 알려줄 필요가있을 것입니다. 또한 본문을 빨리 읽고 싶은 경우는 탐색 모음을 날려 콘텐츠 본문을 빨리 읽으 같은 음성 읽기 소프트웨어에 전달할 필요가있을 것입니다. 어쨌든 탐색 링크를 기계적으로 식별할 수 있도록하는 것이 중요합니다.
즉 <div id="nav">
와 웹 사이트 탐색을 마크업에 아무것도 실수는 아니지만, 옳다는 것도 아닙니다. 나쁘지 않다는 정도입니다. HTML5에서는 탐색 섹션을 의미 마크업하기 위해 <nav>
요소를 제공합니다.
<nav> <ul> <li> <a href="#"> home </ a> </ li> <li> <a href="#"> blog </ a> </ li> <li> <a href="#"> gallery </ a> </ li> <li> <a href="#"> about </ a> </ li> </ ul> </ nav>
질문 : 본문에 점프 (skip links) 는 <nav>
요소와 호환이 있습니까? 아니면 지금까지대로 HTML5에서도 메인 페이지로 이동하는 링크가 필요한 것일까요?
답변 : 본문에 점프는 읽기 소프트웨어 탐색 섹션을 건너뛸 수 있도록하는 것입니다. 이것은 타사 소프트웨어를 사용하여 마우스를 사용하지 않고 웹 사이트를 방문하는 장애인들이 매우 도움이 될 것입니다 ( 어떻게, 그리고 왜 본문에 점프 제공하는지 ).
음성 읽기 소프트웨어를 업데이 트 <nav>
요소를 인식하게되면, <nav>
요소로 마크업 탐색 섹션을 비행 여부를 자동으로 찾을 수있는 것이라고 생각되므로 본문 에 점프는 불필요하게 될 것입니다. 하지만 HTML5에 대응하는 음성 읽기 소프트웨어에 모두 장애가있는 사람들이 업데이 트까지는 아직 시간이 좀 걸릴 테니 <nav>
섹션을 날리기위한 메인 컨텐츠로 가기를 지속적으로 제공해야 할 것이다.
❧
드디어 소재로 한 페이지 의 마지막에 겨우 도착했습니다. 마지막으로 이야기하는 것은 웹 페이지의 마지막에있는 것, 즉 바닥글입니다. 바닥글은 다음과 같이 마크업 있습니다 :
<div id="footer"> <p>§</p> <p>© 2001–9 <a href="#">Mark Pilgrim</a></p> </div>
합리적인 HTML5 네요. 물론 이대로도 괜찮지만, HTML5에서는보다 적절한 <footer>
요소를 제공합니다.
<footer> <p> § </ p> <p> © 2001-9 <a href="#"> Mark Pilgrim </ a> </ p> </ footer>
<footer>
요소로 적합한 것은 어떤 것입니까? 아마 당신이 지금 <div id="footer">
에 넣고있는 것이 그렇다. 이것은 여러 번 반복한 질문이지만, 그렇게 밖에 말할 수 없습니다. HTML5 스펙은 "보행자는 일반적 섹션에 누가 썼는지 및 관련 문서는인지, 저작권 등에 대한 정보를 저장한다"고합니다. 예제 페이지에서도 그렇게되어 있군요 : 짧은 저작권 정보 진술 문과 제작자에 대한 웹 페이지에 대한 링크 이루어져 있습니다.有名なサイトをいくつか見てみれば、フッターにどういうものが含まれるのかわかるでしょう。
<footer>
にふさわしいものです。 <footer>
で括ることができます。 <footer>
要素にふさわしいものです(ただし、それらのリンクはナビゲーションではなく他のウェブサイトにあるプロジェクトへの単なるリンクの集合に過ぎないので<nav>
要素で括るべきではありません )。 最近「 Fat footers 」は爆発的に流行しています。 W3Cのウェブサイトを見てみてください。三つのカラムに分けられて、「Navigation」、「Contact W3C」、そして「W3C Updates」とあります。これのマークアップは以下のような感じになっています:
<div id="w3c_footer"> <div class="w3c_footer-nav"> <h3>Navigation</h3> <ul> <li><a href="/">Home</a></li> <li><a href="/standards/">Standards</a></li> <li><a href="/participate/">Participate</a></li> <li><a href="/Consortium/membership">Membership</a></li> <li><a href="/Consortium/">About W3C</a></li> </ul> </div> <div class="w3c_footer-nav"> <h3>Contact W3C</h3> <ul> <li><a href="/Consortium/contact">Contact</a></li> <li><a href="/Help/">Help and FAQ</a></li> <li><a href="/Consortium/sup">Donate</a></li> <li><a href="/Consortium/siteindex">Site Map</a></li> </ul> </div> <div class="w3c_footer-nav"> <h3>W3C Updates</h3> <ul> <li><a href="http://twitter.com/W3C">Twitter</a></li> <li><a href="http://identi.ca/w3c">Identi.ca</a></li> </ul> </div> <p class="copyright">Copyright © 2009 W3C</p> </div>
セマンティックなHTML5に変換するためには以下のような変更を加えます:
<div id="w3c_footer">
を<footer>
要素に変換する。 <div class="w3c_footer-nav">
を<nav>
要素に変換し、三つ目は<section>
要素に変換する。 <h3>
の見出しを<h1>
に変換し、セクショニング要素内に入るようにする。 <nav>
要素は<article>
要素と同じように文書のアウトラインにセクションを作成します。 最終的にマークアップは以下のようになります:
<footer> <nav> <h1> Navigation </h1> <ul> <li><a href="/">Home</a></li> <li><a href="/standards/">Standards</a></li> <li><a href="/participate/">Participate</a></li> <li><a href="/Consortium/membership">Membership</a></li> <li><a href="/Consortium/">About W3C</a></li> </ ul> </nav> <nav> <h1> Contact W3C </h1> <ul> <li><a href="/Consortium/contact">Contact</a></li> <li><a href="/Help/">Help and FAQ</a></li> <li><a href="/Consortium/sup">Donate</a></li> <li><a href="/Consortium/siteindex">Site Map</a></li> </ ul> </nav> <section> <h1> W3C Updates </h1> <ul> <li><a href="http://twitter.com/W3C">Twitter</a></li> <li><a href="http://identi.ca/w3c">Identi.ca</a></li> </ ul> </section> <p class="copyright">Copyright © 2009 W3C</p> </footer>
❧
このページで題材としたウェブページ:
文字エンコーディングについて:
HTML5の新しい要素をInternet Explorerで有効にする方法について:
標準モードとdoctype判別について:
HTML5対応検証ツール:
❧
Copyright MMIX–MMX Mark Pilgrim , Kyo Nagashima
❧
canvas source (0) | 2012.06.05 |
---|---|
HTML 5.0 구조 및 FORM image (0) | 2012.06.04 |
adobe Edge (0) | 2012.06.04 |
캔버스 간단한 마우스 그리기 (0) | 2012.06.04 |
캔버스 이미지 뛰우기 . (0) | 2012.06.04 |
어도비 사에서 html5 를 적극 지원하기 위해 Edge 라는 프로그램을 선보였다.
7월 31일 부터 preveiw 버전을 다운로드 할 수 있도록 하였다.
http://labs.adobe.com/technologies/edge/
Edge 는 좀더 쉽게 html5 와 css3 를 이용하여 애니메이션을 만들 수 있도록 하는 툴이다. 당연히 html5 를 지원하지 않는 인터넷 익스플로러 6,7,8 에서는 동작 하지 않는다. 하지만 이를 지원하는 브라우저에서는 잘 동작 된다. 물론 아이폰과 아이패드에서도 아주 잘 동작 될 것이다(테스트 해보지 않았음.).
그럼 지금부터 Edge 에 대해 조금 살펴 보기로 한다. 먼저 아래 링크로 가서 Edge 의 preview 버전을 다운로드 받은 후 설치 한다.
http://labs.adobe.com/technologies/edge/
adobe 계정이 필요 하며, windows 는 vista 이상 부터 설치가 가능하며, 맥은 Mac OS X v10.6 and v10.7 부터 설치가 가능하다.
설치가 끝나면 아래와 같은 화면을 볼 수 있다.
adobe Edge Preveiw 버전의 실행화면
엣지 프로그램 튜토리얼 과 샘플 파일도 다운로드 받을 수 있다.
나 는 엣지 프로그램의 테스트를 위해 Create New 를 클릭 하였다. 그러면 아래와 같이 Untitled-1.html 파일이 만들어 지며 flash 나 afterEffects 를 다루어 본 사람이라면 조금 익숙한 work space를 볼 수 있다.
Create New 를 누르면 Untitled.html 문서가 만들어 진다.
일 단 상단에 선택, 도형, 택스트 입력 툴이 보인다. 좌측에는 속성 창(Properties) 창이 보이며, 여기서 Stage 의 색상 과 width, height 값을 설정 할 수 있다. 또한 Stage 를 넘어설 경우에 해당되는 css 속성자인 overflow 를 선택 할 수도 있다.
overflow 속성 선택
직사각형툴(Rectangle Tool) 을 이용해 사각형을 그려 보겠다.
직사각형 툴(Rectangle Tool)
사각형을 그린뒤 해당 사각형(Elements)를 선택하면 좌측 속성창에 해당 엘리먼트의 조정가능한 속성값들이 나온다. 해당 속성값은 아래와 같다.
* 위의 속성값들을 변화 시키면 하단 타임 라인에 해당 속성값들이 추가된다. 이 개념은 에프터 이펙트와 비슷한데 아래에서 추가로 설명 하도록 하겠다.
여기에 택스트를 하나 더 추가해 보도록 하겠다. 텍스트는 내가 자주가는 네이버카페인 '하드코딩하는 사람들' 이라고 쓰도록 하겠다.
텍스트를 적으면 해당 텍스트 에 대한 속성값들이 properties 창에 보여진다.
여기까지 하게되면 마크업 구조는 다음과 같아진다.
1
2
3
4
5
6 |
<div id= "stage" >
<div id= "Rectangle" > </div>
<div id= "Text2" > 하드코딩하는 사람들</div>
</div> |
물론 위의 코드는 Edge 가 자바스크립트 화 하여 문서가 로드될때 상위 Element에 write 해준다. 크롬 개발자 도구로 확인 할 수 있다. 이제 만들어진 엘리먼트들에게 생명을 불어 넣어 보겠다. 그전에 알아두어야 할것 몇가지..
위의 속성값들 이름 앞에 보면 ◇ 모양을 볼수 있다. 이것은 하단 Timeline 창의 Element 에 해당 속성에 대한 키프레임을 추가하는 버튼이다. 클릭하거나 해당 속성을 변경하게 되면 하단 타임라인의 엘리먼트에 속성값이 추가되는 것을 알 수 있다.
이것이 add Keyframe 버튼
키프레임추가 버튼을 누르거나 속성값을 변경하면 타임라인에 키프레임이 생성된다.(Auto-Keyframe Properties 가 체크된 상태일 경우 -> 붉은색 시계모양)
이것이 Auto-Keyframe Properties 로 체크되 있으면 Element 의 속성값이 변화할때 자동으로 키프레임이 추가된다.
급하게 애니메이션을 만들어 보겠다.
순서는 지금 까지 만은 앨리먼트에 속성값을 각각 타임라인의 시간에 따라 다르게 주기만 하면 된다.
예로 0:00 에서 엘리먼트의 x 축을 10 으로 주면 0:02 에서 x 축의 값을 30으로 변경하면 좌에서 우로 움직이는 애니메이션이 된다.
일단 지금 만들어 놓은 것이 최종적인 모습이므로 키프레임에서 현재 만들어 놓은 속성들을 0:02 로 끌어서 이동시켰다.
그런다음 타임라인의 현재 프레임을 0:00 으로 이동시켜서 시작시의 모습으로 속성을 변경 시켜본다. 위에서 회색박스가 떨어지는 효과를 주기 위해 Rectangle4 의 tY 값을 -276까지 변경해서 stage 의 위쪽으로 안보일때까지 올려 버렸다. 그러면 타임라인에 아래와 같이 모션이 적용된걸 확인 할 수 있다. 재생 버튼을 눌러 보면 위에서 아래로 떨어지는 회색 상자 모션을 볼 수 있다.
위의 녹색부분을 클릭하면 좌측에 속성을 변화 시킬 수 있다. 모션이 되는 부분의 아이디, 시간, 시작되고 끝나는 시간을 조절할 수 있으며 Easing(부드럽게 시작되고 끝나는 등의 효과) 를 줄 수 있다. 이부분은 직접 해보는 편이 빠를듯.
이와 같이 해서 텍스트에도 같은 효과를 주었다.
모션이 완료되고 저장하면, edge 파일과 함께 html, css, js 파일과 edge_includes 폴더 가 생성된다. 이것들이 모두 올라가야 하며, html 파일을 열어보면 (웹퍼블리셔, 혹은 개발자라면) 아..이렇게 되는 구나 라고 알수 있을듯...
위에 작업한거 샘플파일임.
시작할때는 꼼꼼하게 분석해서 포스팅 해야지..했는데.. 회사일도 바쁘고 하다보니 결국 날림이 됐다.
지금은 베타 버전이라 기능이 거의 없지만 실제 상용화 버전은 아마 이벤트를 걸고, 만들고 하는 기능 부터 해서 많은 부분이 추가될 거라 기대한다.
http://eyekorea.tistory.com/18 에서 가져왔습니다.
HTML 5.0 구조 및 FORM image (0) | 2012.06.04 |
---|---|
HTML 5 설명 글 중 (일본어를 구글로 강제 번역함 ㅠㅠ ) (0) | 2012.06.04 |
캔버스 간단한 마우스 그리기 (0) | 2012.06.04 |
캔버스 이미지 뛰우기 . (0) | 2012.06.04 |
canvas 사이트 모음 . (0) | 2012.05.24 |
<div id="container">
<canvas title="그려주세요." id="drawCanvas" width="1200" height="250" s
style="position: relative; border: 1px solid #000;"></canvas>
</div>
<script type="text/javascript">
if (window.addEventListener) {
window.addEventListener('load', InitEvent, false);
}
var canvas, context, tool;
function setTextCanvas() {
}
function InitEvent() {
canvas = document.getElementById('drawCanvas');
// resetCanvas();
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>
HTML 5 설명 글 중 (일본어를 구글로 강제 번역함 ㅠㅠ ) (0) | 2012.06.04 |
---|---|
adobe Edge (0) | 2012.06.04 |
캔버스 이미지 뛰우기 . (0) | 2012.06.04 |
canvas 사이트 모음 . (0) | 2012.05.24 |
Canvas (0) | 2012.05.22 |
<!DOCTYPE html>
<html>
<body>
<canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;">
Your browser does not support the canvas element.
</canvas>
<script type="text/javascript">
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
var img=new Image();
img.onload = function(){
ctx.drawImage(img,0,0);
};
img.src="img_flwr.png";
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;">
Your browser does not support the canvas element.
</canvas>
<script type="text/javascript">
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
var grd=ctx.createLinearGradient(0,0,175,50);
grd.addColorStop(0,"#FF0000");
grd.addColorStop(1,"#00FF00");
ctx.fillStyle=grd;
ctx.fillRect(0,0,175,50);
</script>
</body>
</html>
adobe Edge (0) | 2012.06.04 |
---|---|
캔버스 간단한 마우스 그리기 (0) | 2012.06.04 |
canvas 사이트 모음 . (0) | 2012.05.24 |
Canvas (0) | 2012.05.22 |
html4.0 을 html 5.0 으로 변환 (0) | 2012.05.14 |
5년 전, XML에 대해 무지했다면 아무도 얘기할 상대가 없는 미운 오리 새끼 신세가 되었을지도 모르겠다. Ruby 프로그램이 주목을 받았던 8개월 전, Ruby 프로그램 언어 기능에 대해 알지 못했던 프로그래머들은 냉수기 관련 산업세계에서 환영 받지 못했다. 그런 것처럼, 최신 기술단계로 입문하고자 한다면 Ajax에 대해 알아야 한다.
하지만 Ajax는 일시적으로 유행하는 툴이 아니다. 웹 사이트를 구축하는 강력한 방식이며 완전히 새로운 언어를 배우는 것보다는 그다지 어렵지 않다.
Ajax에 관해 자세히 들어가기 전에 잠시 Ajax의 기능에 대해 알아보자. 오늘날 애플리케이션을 작성할 시 두 가지 애플리케이션이 있다.
두 애플리케이션은 다 친숙한 것들이다. 일반적으로 데스크톱 애플리케이션은 CD상에 배치된 다음 (또는 웹 사이트에서 다운로드) 컴퓨터에 완전 설치된다. 이 애플리케이션은 인터넷을 이용해 업데이트를 다운로드하기도 하지만 애플리케이션 실행 코드는 데스크톱 상에 상주해 있다. 전혀 새로운 것이 아닌 웹 애플리케이션은 웹 서버 상에서 실행되며 웹 브라우저 상에서 접속된다.
하지만 두 애플리케이션에 대한 코드 실행 위치보다 애플리케이션 작동방식 및 애플리케이션과 사용자와의 상호작용방식이 중요하다. 일반적으로 데스크톱 애플리케이션은 상당히 빠르고 (컴퓨터 상에서 실행되고 인터넷 상에서 대기 중인 상태가 안 나온다.), 대형 사용자 인터페이스(일반적으로 운영체제와 상호작용)를 갖추며 상당히 동적이다. 거의 대기시간 없이 메뉴 및 하위 메뉴를 클릭, 지시, 입력하고 풀업한다.
반면 웹 애플리케이션은 가장 최신 것이며 데스크톱에서는 전혀 얻을 수 없는 서비스를 제공한다.(Amazon.com 및 eBay를 생각해 볼 것.) 하지만 웹 애플리케이션 기능으로 인해 서버 응답 대기, 스크린 재생 대기, Request 컴백 및 새 페이지 생성에 관한 대기 기능 등이 부수된다.
분명 지나친 단순화 과정임에는 틀림없지만 기본 개념은 얻게 된다. 이미 눈치를 챘겠지만 Ajax는 데스크톱 애플리케이션 및 항상 업데이트 되는 웹 애플리케이션의 기능 및 상호작용 간의 차이를 줄여주는 역할을 한다. 여러분은 마치 데스크톱 애플리케이션에서 찾은 것처럼 동적 사용자 인터페이스 및 가상 제어기능을 사용한다. 하지만 웹 애플리케이션 상에서 데스크톱 애플리케이션을 이용할 수 있다. 그러면 대기 중인 것이 무엇인가? Ajax 및 볼품없는 웹 인터페이스가 응답 Ajax 애플리케이션으로 변환되는 과정에 대해 살펴보기로 하자.
그러면 대기 중인 것이 무엇인가? Ajax 및 볼품없는 웹 인터페이스가 응답 Ajax 애플리케이션으로 변환되는 과정에 대해 살펴보기로 하자.
Ajax에 관해 살펴보면 Ajax는 실지로 많은 기술들이 응집되어 있다. Ajax의 기본을 마치고 넘어가려면 몇 가지 다른 기술들(필자는 첫 번째 이 시리즈에서 각각의 기술에 관해 설명할 것이다.)을 면밀히 살펴보아야 한다. 하지만 이들 기술 가운데 어느 정도 알고 있는 것이 많은 건 다행이다. 더군다나 각각의 기술 대부분은 Java/Ruby같은 프로그래밍 언어만큼 어려운 게 아니라서 배우기 쉽다.
Ajax 애플리케이션에 포함된 기본기술은 다음과 같다.
div
, span
및 기타 동적 HTML 요소를 사용해 HTML을 마크업 한다. 이 기술들에 대해 간략히 요약하고 각 기술의 기능에 대해 좀 더 알아보기로 하는데 각 기술에 관한 자세한 사항은 차후 글에서 다룰 것이다. 우선은 Ajax의 구성요소 및 기술에 대해 친숙해 지는 데 초점을 맞추기로 한다. 자바 스크립트에 익숙할수록 Ajax에 담긴 기술에 관한 일반적인 지식 단계에서 각 기술에 관한 자세한 지식으로 넘어가는 게 더 쉬워진다.(또한 이로 인해 웹 애플리케이션 개발에 관한 문이 열리게 된다.)
알고자 하는 객체 중 첫 번째는 아마도 가장 생소한 것이 아닌가 싶다. 그 객체는 일명 XMLHttpRequest
인데 자바 스크립트 객체의 일종이며 Listing 1에 나와 있는 것처럼 단순하게 생성된다.
<script language="javascript" type="text/javascript"> var xmlHttp = new XMLHttpRequest(); </script> |
필자는 다음 글에서 이 객체에 대해 더 논의할 것이다. 하지만 지금 상태에서는 모든 서버 커뮤니케이션을 다루는 객체라는 사실만 알아둔다. 다음 사항으로 가기 전에 잠깐 생각해 보면 자바 스크립트 객체는 XMLHttpRequest
를 통해 서버에 전달하는 자바 스크립트 기술의 일종이다. 이 객체는 애플리케이션 흐름이 정상적이지 않으며 Ajax 기술의 많은 부분을 차지하고 있다.
정상적인 웹 애플리케이션에서 사용자는 양식 필드를 기입하며 제출 버튼을 클릭한다. 그러면 전 양식을 서버에 보내며 서버는 처리과정을 통해 양식을 스크립트(일반적으로 PHP, 자바 또는 CGI 과정/이와 유사한 과정)에 전송한다. 스크립트를 실행할 때 스트립트를 통해 완전히 새로운 페이지가 전송된다. 그 페이지는 데이터가 작성된 새로운 양식의 HTML/확인 페이지 또는 원 양식에 기입된 데이터에 근거해 선택된 옵션이 포함된 페이지일 수 있다. 물론, 서버 상의 스크립트/프로그램이 처리되면서 새로운 양식을 다시 보내는 동안 사용자는 대기해야 한다. 서버로부터 데이터를 다시 받을 때까지는 스크린 상에 아무 것도 없게 되며 결국 대화성은 낮게 된다. 사용자는 즉각적으로 응답을 받지 못하며 데스크톱 애플리케이션 상에서 작업하는 기분이 들지 않게 된다.
Ajax는 근본적으로 자바 스크립트 기술 및 웹 양식 및 서버 간의 XMLHttpRequest
객체를 결합한다. 사용자가 웹 양식을 기입할 때 데이터는 직접 서버 스크립트에 전송되지 않고 자바 스크립트 코드에 전달된다.
대신 자바 스크립트 코드는 양식 데이터를 포착해 Request를 서버에 전송한다. 이 과정이 일어나는 동안, 사용자 스크린 상의
양식은 순식간에 나타나거나 깜빡이거나 사라지거나 정지하지 않는다. 즉 자바 스크립트 코드는 몰래 Request를 전송하며 사용자는
Request가 만들어졌는지도 알지 못한다. 게다가 Request를 비동기적으로 전송하기 때문에 더 좋은 상황이 된다. 이는
자바 스크립트에서 서버 응답을 그냥 대기하지 않는다는 것을 의미한다. 따라서, 사용자는 데이터를 계속 기입하고 화면이동하고
애플리케이션을 사용한다.
그런 다음 서버는 자바 스크립트 코드(웹 양식에 대해 아직도 대기 중임)에 데이터를 다시 전송한다.
자바 스크립트 코드에서는 데이터와의 상호기능을 결정하며 연속적으로 양식 필드를 업데이트 하면서 애플리케이션에 즉각적인 응답을
준다. 결국 사용자는 양식을 제출/재생하는 작업 없이 새로운 데이터를 얻게 된다. 자바 스크립트 코드는 데이터를 얻고 계산도
수행하며 또 다른 Request를 전송하며 이런 모든 과정은 사용자 개입 없이도 된다! 이것이 바로 XMLHttpRequest
객체의 장점이다. XMLHttpRequest 객체는 서버와 같이 커뮤니케이션을 주고받고 사용자는 그 과정에서 벌어지는 과정을
알지 못한다. 이로 인해 데스크톱 애플리케이션과 마찬가지로 동적, 상호 반응적인 고도의 양방향 경험을 얻게 되지만 그 속에
인터넷의 모든 장점이 담겨 있다.
일단 XMLHttpRequest
에 대해 다루게 되면 나머지 자바 스크립트 코드는 상당히 평범한 것들이다. 사실 다음과 같은 기본적인 작업에 자바 스크립트 코드를 이용한다.
첫 번째 두 항목에 대해서 여러분은 Listing 2에 나온 대로 getElementById()
에 익숙해지려 할 것이다.
// Get the value of the "phone" field and stuff it in a variable called phone var phone = document.getElementById("phone").value; // Set some values on a form using an array called response document.getElementById("order").value = response[0]; document.getElementById("address").value = response[1]; |
Ajax 애플리케이션에서 특별히 획기적인 사항은 없고 상기 사항 정도면 충분하다. 이에 대해 상당히 복잡한 건 없다는 사실을 깨달아야 한다. 일단 XMLHttpRequest
만 정복하면 Ajax 애플리케이션에서 나머지는 대부분 Listing 2에 나온 바와 같이 상당히 독창적인 HTML과 결합된 단순 자바 스크립트 코드다. 그런 다음 가끔 약간의 DOM 작업이 발생하게 된다. 이에 관해 살펴 보자.
DOM, 즉 문서 객체 모델이라는 것이 있는데 이는 아주 중요하다. DOM에 대해 듣는 것은 그다지 어렵지 않다고 하는 사람들이 있다. HTML 디자이너에 의해서는 종종 사용되지 않으며 하이-엔드 프로그래밍 작업으로 들어가지 않는 한은 JavaScript 코더에서 흔치 않은 것이 바로 DOM이다. 종종 과중-업무 Java 및 C/C++ 프로그램 상에서 DOM을 종종 많이 활용하게 된다. 사실은 DOM이 배우기 어려운 특성 때문에 명성이 자자해 그 프로그램 상에서 종종 사용하는 것이 아닌가 싶다.
다행히도 JavaScript 기술에 있어 DOM을 활용하는 일은 쉽고 대부분 직관적이다. 이 시점에서 필자는 DOM 사용법에 관해 보여 주고 적어도 이에 대한 몇 가지 코드 예를 제시하려 하지만 이 글의 의도와는 벗어나는 것 같다. DOM에 관해 대략적으로 다루는 것 없이도 Ajax에 대해 깊이 다룰 수 있다. 필자는 차후의 글에서 다시 DOM에 관해 다루려 한다. 하지만 지금 상황에서는 언급하지 않으려 한다. JavaScript 코드와 서버 사이에 XML을 이리저리 전송하고 HTML 양식을 변화시킬 때 DOM에 대해 자세히 다루게 될 것이다. 지금은 DOM없이 효과적인 Ajax 애플리케이션을 작동하는 게 쉬우므로DOM은 논외로 한다.
Ajax 애플리케이션에 관한 기본적 개념에 대해 배웠으면 몇 가지 특수사항에 대해 살펴 보자. XMLHttpRequest
객체는 Ajax 애플리케이션에서 중요하므로, 아마도 많은 이들에게는 생소한 것일 수도 있다. 거기서 필자는 논의를 시작한다. Listing 1에서 보다시피, XMLHttpRequest 객체를 생성, 사용하는 것은 상당히 쉬워야 한다. 잠깐만 기다려 보시라.
수년 동안 브라우저에 관한 논란은 끊이지 않았고 동일한 브라우저로는 아무 것도 얻을 수 없다는 사실을 기억하는가? 믿건 말건, 소규모 브라우저에서도 이와 같은 논쟁은 끊이지 않고 있다. 더군다나 놀라운 사실은 XMLHttpRequest
가 이 논란의 희생양 중 하나라는 것이다. 따라서 XMLHttpRequest
객체를 작동시키기 위해선 몇 가지 다른 작업을 해야 한다. 단계별로 설명하겠다.
Microsoft 브라우저, Internet Explorer는 XML을 다룰 시 MSXML 구문분석계를 사용한다.(참고자료) Internet Explorer 상에서 다뤄야 할 Ajax 애플리케이션을 작성할 시 독특한 방식으로 XMLHttpRequest 객체를 작성해야 한다.
하지만 그렇게 간단한 작업은 아니다. Internet Explorer에 설치된 JavaScript 기술
버전에 따라 MSXML 버전도 변하게 되며 실지로 2개의 버전이 있다. 따라서 두 경우를 다루는 코드를 작성해야 한다.
Microsoft 브라우저 상에서 XMLHttpRequest
객체를 생성하는 데 필요한 코드에 관해선 Listing 3을 보라.
var xmlHttp = false; try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e2) { xmlHttp = false; } } |
모든 작업이 정확히 맞아떨어지는 것은 아니다. 하지만 그래도 상관없다. 이 시리즈가 끝나기 전에 JavaScript 프로그래밍, 에러 취급 및 조건부 번역 및 기타 사항에 관해 자세히 다루게 될 것이다. 지금 현 상태에서는 두 가지 중심 라인만 다루고자 한다.
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
and
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
.
간단히 말해서, 이 코드로 MSXML의 한 버전을 이용해 XMLHttpRequest 객체 생성을
기한다. 하지만 객체가 생성되지 않는 경우 다른 버전을 사용해 XMLHttpRequest 객체를 생성한다. 두 코드 다 작동되지
않는 경우 xmlHttp
변수는 거짓으로 설정되고 작동되지 않는 것이 있다는 것을 코드에 알려 준다. 그럴 경우, 비-Microsoft 브라우저가 있을 가능성이 있다. 따라서 객체 생성을 위해선 다른 코드를 사용해야 한다.
인터넷 브라우저를 선택하지 않거나 비-Microsoft 브라우저를 작성할 경우 다른 코드가 필요하다. 사실, 이 라인은 Listing 1에서 봤던 단순 코드라인이다.
var xmlHttp = new XMLHttpRequest object;
.
이 단순한 라인으로 Mozilla, Firefox, Safari, Opera 및 임의의 양식/형태에서 Ajax애플리케이션을 지원하는 기타 비-Microsoft 브라우저에서 XMLHttpRequest
객체를 생성한다.
여기서 모든 브라우저를 지원하는 것이 중요하다. Internet Explorer/비-Microsoft 브라우저에서만 작동되는 애플리케이션을 작성하는 사람이 어디 있겠는가? 또한 더 심한 경우, 애플리케이션을 두 번 작성하고자 하는가? 물론 아니라고 믿는다. 따라서 코드에선 Internet Explorer 및 비-Microsoft 브라우저를 지원하는 기능이 포함되어야 한다. Listing 4에서는 다중-브라우저 방식으로 작동하는 코드에 대해 나와 있다.
/* Create a new XMLHttpRequest object to talk to the Web server */ var xmlHttp = false; /*@cc_on @*/ /*@if (@_jscript_version >= 5) try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e2) { xmlHttp = false; } } @end @*/ if (!xmlHttp && typeof XMLHttpRequest != 'undefined') { xmlHttp = new XMLHttpRequest(); } |
지금 현재로선, 주석 및 @cc_on
와 같은 어려운 태그를 무시한다. 이들은 다음 글에서 깊이 다룰 JavaScript 컴파일러 명령으로 오로지 XMLHttpRequest
객체 상에만 초점이 맞추어져 있다. 이 코드에 관한 핵심은 세 가지 과정으로 요약된다.
xmlHttp
를 생성해 앞으로 생성할 XMLHttpRequest
객체를 참조한다.Msxml2.XMLHTTP
객체를 사용해 XMLHttpRequest 객체를 시도, 생성한다. Microsoft.XMLHTTP
객체를 사용해 XMLHttpRequest 객체를 시도, 생성한다.xmlHttp
가 아직도 설정되지 않은 경우 비-Microsoft 방식으로 XMLHttpRequest 객체를 생성한다. 위 과정 끝 단계 시 사용자가 실행하는 브라우저 종류에 관계없이 xmlHttp
의 경우 유효한 XMLHttpRequest
객체를 인용한다.
보안이란 무엇인가? 오늘날 브라우저는 사용자들에게 보안 레벨을 올리고 JavaScript 기술을 생성하며 브라우저 옵션을 해제하는 기능을 제공한다. 이 경우 코드가 작동되지 않는 경우도 있을 수 있다. 그 때 발생하는 문제를 적절하게 다뤄야 한다. 이에 관한 내용은 적어도 기사 한 분량을 차지할 정도라 나중에 다루기로 하겠다.(긴 시리즈가 될 것 같다, 그렇지 않은가? 하지만 걱정 마시라. 과정을 다 배우고 나면 이와 관련된 모든 사항을 숙달할 테니까.) 현재로선 강력하지만 완전하지 않은 코드를 작성하는 중이다. 이 코드는 Ajax 애플리케이션을 관리하는 데 좋다.
인제 Ajax 애플리케이션에 대해 이해하고 XMLHttpRequest
객체 및
객체 생성에 관한 기본적인 개념을 얻는다. 자세히 읽다 보면 Ajax 애플리케이션은 웹 애플리케이션에 제출되는 HTML 양식보단
서버 상의 임의의 웹 애플리케이션에 대화하는 JavaScript 기술이라는 사실을 알게 된다.
그러면 빠진 부분은 어떤 것인가? 실질적인 XMLHttpRequest
객체 사용법이다. 이 객체는 작성하는 각각의 Ajax 애플리케이션에서 일정 형태로 사용하는 중요 코드라 Ajax 애플리케이션이 포함된 기본 Request/응답 모델 모양을 통해 객체 사용법을 빨리 익힌다.
새로운 XMLHttpRequest
객체가 있는 경우 이를 시험해 보자. 먼저 웹
페이지에서 호출하는 JavaScript 방법이 필요하다.(사용자가 텍스트에서 입력하거나 메뉴에서 옵션을 선택할 시와 같음.) 그
다음, 거의 모든 Ajax 애플리케이션에서의 동일한 기본 아웃라인을 따른다.
Listing 5는 위의 순서대로 5단계를 진행하는 Ajax 방법의 예에 관해 나와 있다.
function callServer() { // Get the city and state from the web form var city = document.getElementById("city").value; var state = document.getElementById("state").value; // Only go on if there are values for both fields if ((city == null) || (city == "")) return; if ((state == null) || (state == "")) return; // Build the URL to connect to var url = "/scripts/getZipCode.php?city=" + escape(city) + "&state=" + escape(state); // Open a connection to the server xmlHttp.open("GET", url, true); // Setup a function for the server to run when it's done xmlHttp.onreadystatechange = updatePage; // Send the request xmlHttp.send(null); } |
Ajax 코드에 관한 많은 것이 명백하다. Ajax 코드의 첫번째 비트는 몇 가지 양식 필드 값을 포착하는 기본 JavaScript 코드를 사용한다. 그런 다음 이 코드에서는 연결 최종 목적지로 PHP 스크립트를 설정한다.
PHP 스크립트의 URL을 지정한 다음(양식에서 나온) 단순한 GET 매개변수를 이용해 이 URL에 도시 및 국가를 추가한다. 그 다음 연결하면 먼저 XMLHttpRequest
객체가 작동되는 것을 보게 된다. 연결방법은 연결 URL 뿐만 아니라, GET 매개변수에도 나와 있다. 최종 매개변수를 true
로 설정한 경우, 이 매개변수에선 비동기식 연결(Ajax를 만든다.)을 요구한다. false
로 설정한 경우엔 Request를 만들 시 서버 상에서 Ajax에서의 JavaScript 코드가 대기하고 응답을 받을 때 코드가 지속된다. 사용자는 최종 매개변수를 true
로 설정하면서 서버에서 배경에 있는 Request를 처리하는 동안 사용자는 웹 양식(심지어는 기타 JavaScript 방식)을 여전히 사용한다.
한편 xmlHttp
(이것은 XMLHttpRequest
객체의 인스턴스라는 사실을 기억하라.)의 onreadystatechange
속성으로 서버 실행이 종료될 시(5분/5시간 내에 종료될 수 있음) 서버 기능을 명령한다. 이 코드는 서버 상에서 대기하지 않기
때문에 서버가 기능을 인식해 서버에 응답할 수 있도록 하는 게 필요하다. 이 경우 서버에서 Request를 처리하면서 종료 시
이른바 updatePage()
라 불리는 특수 방법을 트리거한다.
최종적으로 send()
코드를 0(null
) 값으로 호출한다. 데이터를 추가해 이를 서버에 전송하므로 Request에는 추가해서 보낼 게 없다. 이렇게 되면 Request를 발송하고 서버는 서버에 요구된 기능을 실행한다.
이 코드에서 나오는 것이 없는 경우, 코드가 상당히 간단하다는 것을 명심하라. 이 코드는 Ajax 애플리케이션의 비동기적 특성을 제외하고는 상당히 단순하다. 이 코드를 통해 복잡한 HTTP Request/응답 코드보다는 근사한 애플리케이션 및 인터페이스에 완전 초점을 맞추도록 한다는 사실을 여러분은 높게 평가할 것이다.
Listing 5의 코드는 코드를 얻는 방법만큼이나 쉽다. 데이터는 단순 텍스트이고 Request URL의 일부로 포함된다. GET 매개변수는 더 복잡한 POST대신 Request를 전송한다. 여기에 덧붙일 XML/컨텐츠 헤더가 없고 Request 본체에 전송할 데이터도 없다. 이게 바로 Ajax 유토피아다.
그렇다고 미리 겁먹지 마라. 시리즈가 계속될수록 문제는 더 복잡해진다. 그 때는 POST Request를 전송하는 방법, Request 헤더 및 컨텐츠 형식을 설정하는 방법, 메시지에 XML을 설정하는 방법 및 Request에 보안기능을 추가하는 방법을 배우게 되는데 배우는 목록만 해도 상당히 길다! 지금은 이런 어려운 주제에 대해 신경 쓰지 말자! 그냥 기본만 충실하게 익히면 Ajax 전체 툴을 구축하게 된다.
이제 서버 응답을 실지로 취급해야 한다. 이 시점에서는 정말로 두 가지 사항만 알면 된다.
xmlHttp.readyState
속성이 4와 같을 때까지는 어떤 작업도 해선 안 된다.xmlHttp.responseText
속성에 응답한다. 2가지 항목 중 첫번째 항목인 준비 상태에 관해선 다음 글에서 대부분 다룰 것이다. 그 때는 HTTP Request 단계에 대해 알고 싶은 것 이상으로 배우게 된다. 지금 현재로선, xmlHttp.responseText
속성 값 4를 단순 점검하는 경우, 작업이 계속 진행된다.(다음 글에서 기대할 만한 사항이 나오게 된다.) 서버 응답을 얻기 위해 xmlHttp.readyState 속성을 사용하는 과정인 두 번째 항목은 쉽다. Listing 6은 Listing 5에서 전송된 값에 근거해 서버에서 호출하는 방법에 관한 예를 보여준다.
function updatePage() { if (xmlHttp.readyState == 4) { var response = xmlHttp.responseText; document.getElementById("zipCode").value = response; } } |
다시 보면, xmlHttp.readyState 코드는 그리 어렵거나 복잡하지 않다. 이 코드는 서버에서
해당 준비 상태로의 호출을 대기하고 서버에서 다시 복귀되는 값(이 경우, 사용자 기입 도시 및 국가에 대한 ZIP 코드)을
사용해 또 다른 형태의 양식 필드를 설정한다. 그 결과, zipCode 필드는 ZIP 코드와 함께 갑자기 나타난다. 하지만
사용자는 버튼을 클릭해서는 안 된다! 그게 바로 이전에 말했던 데스크톱 애플리케이션이다. Ajax 코드에는 응답성, 동적 상태
외의 더 많은 것이 있다. 독자들은 zipCode
가 정상 텍스트 필드라는 것을 눈치챘을지도 모른다.
일단 서버에서 zipCode
를 복귀시키고 updatePage()
방식으로 도시/국가 ZIP 코드와 함께 zipCode 필드 값을 설정하는 경우 사용자는 값을 무효로 한다. 값을 무효로 하는
데는 두 가지 이유가 있다. 예에서 나오는 상황을 단순화시키고, 때로는 사용자가 서버에서 명령하는 것을 무효로 하기 위해서다. 이
두 가지를 명심하라. 좋은 사용자-인터페이스 설계를 위해 중요하다.
그러면 이 글에서 다룰 게 남아 있는가? 그다지 많지 않다. 양식에 기입할 정보를 포착해 이를 서버에 전송하고 응답에 관해 취급할 또 다른 JavaScript 방법을 제공하면서 심지어는 다시 응답될 때 필드 값을 설정하기까지 하는 JavaScript 방법을 다룬다. 여기서는 첫번째 JavaScript 방법을 호출해 전 과정을 시작하기만 하면 된다. 분명 HTTL 양식에 버튼을 추가하지만 2001년 버전과 거의 동일하다고 생각되지 않는가? Listing 7과 같이 JavaScript 기술을 활용한다.
<form> <p>City: <input type="text" name="city" id="city" size="25" onChange="callServer();" /></p> <p>State: <input type="text" name="state" id="state" size="25" onChange="callServer();" /></p> <p>Zip Code: <input type="text" name="zipCode" id="zipCode" size="5" /></p> </form> |
이런 단면이 루틴 코드의 한 단면 이상을 보여준다고 생각된다면 맞는 말이다. – 그렇다!
사용자가 도시/국가 필드에 관한 새로운 값을 입력할 경우 callServer()
방식을 전송한 다음 Ajax 애플리케이션이 시작된다. 이제 여러 상황을 다룰 만하다고 느껴지기 시작하는가? 좋다! 바로 그거다!
이 시점에서 적어도 리소스 란에서 Ajax 애플리케이션에 관해 깊숙이 알려고 하는 경우, 첫번째 Ajax 애플리케이션을 작성할 준비가 되어 있지 않을 게다. 하지만 이런 애플리케이션이 작동하는 기본 개념 및 XMLHttpRequest
객체의 기본 개념을 이해하기 시작한 경우 이 객체, JavaScript-서버 간 대화 취급방식, HTML 양식 취급 및 심지어 DOM 관리 방식까지 모든 것을 배워야 한다.
지금 현재로선, Ajax 애플리케이션이 얼마나 강력한 툴인지 생각하는 데 시간을 보낸다. 버튼만 클릭할 뿐만 아니라 필드에 입력하고 콤보 상자에서 옵션을 선택하고 심지어는 마우스를 스크린 주위에 끄는 경우 응답하는 웹 형식을 상상해 본다. 비동기식의 정확한 의미 및 Request 상에서 응답하기 위해 서버 상에서 실행하지만 대기하지 않는 JavaScript 코드에 관해 생각해 본다. 여러분이 부딪치는 문제의 종류는 어떤 것인가? 어떤 영역의 문제에 주의를 기울일 것인가? 프로그래밍에 이 새로운 접근방식을 설명하기 위해 양식 설계를 변환하는 방법은 어떤 것인가?
이런 문제에 관해 실지로 생각할 시간을 보낸다면 잘라 붙이는 코드를 가지고 이를 잘 이해하지 못하는 애플리케이션에 포함시키는 것보다는 훨씬 더 낫다. 다음 글에서는 이와 같은 개념을 실제 작업에 응용해 본 작업에서처럼 애플리케이션을 만들어야 하는 코드에 관한 자세한 정보를 제공하기로 한다. 그 때까지 Ajax 애플리케이션의 가능성을 마음껏 즐겨라.
PJax ? (0) | 2012.08.24 |
---|---|
Dialog (0) | 2012.06.19 |
AJax JSON 데이터 가져오기의 형식 . (0) | 2012.05.24 |
1.
$.ajax({
"url" : "tableData.jsp",
"type" : "get",
"dataType": "json",
"data" : {"dataType":"init"},
"success" : function(data){
alert("가져온 데이터 입니다 . "+data);
var str = "<select id='mainTableList'>";
str +="<tr >";
$.each(data,function(i,v){
//데이터 인풋
str +="<td>"+ v.mem_id+"</td>;
});
str +="</tr>";
$("#tableList").html(str);
},
"error" : function(info, xhr){
if(info.readyState == '4'){
alert('문제가 발생했습니다.\n상태코드 : ' + info.status+ '\n\n' + info.responseText);
}
else{
alert('문제가 발생했습니다.\n잠시후 다시 시도해 주세요.\n 상태코드 : ' +info.status);
}
}
});
tableData.jsp 에서 JSON 타입으로 데이터를 가져 오며. 그것에 대하여 성공(success),또는 실패로 구분할수 있다.
가져온 데이터에 대하여 i 는 index v 는 i번째 (Ajax 는 1부터 시작)의 value 를 뜻한다. 데이터 에 대해서는 밑에서 말하겠다.
2.
$.getJSON("memberData.jsp",
function(data){
// alert(data);
var str = "<table id='mem_list' align='center'border='1' bordercolor='yellow' >";
str += "<tr bgcolor='silver'><th>회원ID</th><th>회원성명</th><th>주민번호</th><th>우편번호</th>";
str +="<th>주 소</th><th>회사전화</th><th>핸드폰</th><th>이메일</th></tr>";
$.each(data, function(i, v){
str += "<tr id='mem_select'>";
str += "<td class='mem_id'>" + v.mem_id + "</td>";
str += "<td>" + v.mem_name + "</td>";
str += "<td>" + v.mem_regno + "</td>";
str += "<td>" + v.mem_zip + "</td>";
str += "<td>" + v.mem_add + "</td>";
str += "<td>" + v.mem_comtel + "</td>";
str += "<td>" + v.mem_hp + "</td>";
str += "<td>" + v.mem_mail + "</td></tr>";
});
str += "</table>";
$("#memList").html(str);
});
JSON 데이터 가져 오기의 두번째 형태 이다.
여기서는 memberData.jsp 로 바로 데이터를 보내서 가져오는 형태 이다. 간단 하지만 에러가 나도 어디서 문제 인지 알수 없는 문제가 있다. 하지만
코딩이 간단 하기때문에 구현을 쉽게 할수 있다.
"mem_id="+mem_id , 를 추가 하여 파라미터 값으로 보내 줄수 도 있다.
$("#mem_select").live("click", function(){
var mem_id = $(this).children(".mem_id").text().trim();
$.getJSON("memberData.jsp",
"mem_id="+mem_id,
function(data){
$.each(data,function(i,v){
$("#mem_id").val(v.mem_id);
$("#mem_pass").val(v.mem_pass);
$("#mem_name").val(v.mem_name);
$("#mem_regno").val(v.mem_regno);
$("#mem_bir").val(v.mem_bir);
$("#mem_zip").val(v.mem_zip);
$("#mem_add").val(v.mem_add);
$("#mem_hometel").val(v.mem_hometel);
$("#mem_comtel").val(v.mem_comtel);
$("#mem_hp").val(v.mem_hp);
$("#mem_mail").val(v.mem_mail);
$("#mem_job").val(v.mem_job);
$("#mem_like").val(v.mem_like);
$("#mem_memorial").val(v.mem_memorial);
$("#mem_memorialday").val(v.mem_memorialday);
$("#mem_mileage").val(v.mem_mileage);
if (v.mem_delete != "y") {
$("#mem_delete").attr("checked", true);
}
});
});
});
위 예제는 1번2 번에서 가져온 데이터에 대하여 div 의 id 값에 html 형식으로 넣어서 구현 되어진 것에 대하여
live 형식으로 클릭 되었을때 이벤트가 실행 되도록 하는 메서드 이다. 반드시 live 형식으로 구현 해야 하는데 그 이유는 맨처음 시작시에 JSON 데이터 메서드가 시작전에
는 만들어지지 않은 객체 이기 때문에 일반 형식으로 구현시에 없는!!! 객체를 구현 하라고 명령 하는 것임으로 실행이 안된다.
대상이 되어 지는 DATA .jsp의 형식은 대략 이러 함.
<%@ page language="java" contentType="text/plain; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.sql.*"%>
<%@page import="kr.or.ddit.db.ConnectionProvider"%>
<%@page import="java.sql.Connection"%>
<%@ page import = "kr.or.ddit.db.*" %>
<% request.setCharacterEncoding("UTF-8");
String mem_id=request.getParameter("mem_id");
System.out.print(mem_id);
%>
[
<%
Connection conn = null;
PreparedStatement psmt = null;;
ResultSet rs = null;
try{
conn =ConnectionProvider.getConnection();
if(mem_id==null){
psmt = conn.prepareStatement("select * from member");
}else {
psmt = conn.prepareStatement("select * from member where mem_id=?");
psmt.setString(1, mem_id);
}
rs=psmt.executeQuery();
%>
<%
while(rs.next()){
if(rs.getRow()>1){
out.print(",");
}
%>
{
"mem_id" : "<%=Util.toJS(rs.getString("mem_id"))%>",
"mem_pass" : "<%=Util.toJS(rs.getString("mem_pass"))%>",
"mem_name" : "<%=Util.toJS(rs.getString("mem_name"))%>",
"mem_regno" : "<%=Util.toJS(rs.getString("mem_regno1"))%> - <%=Util.toJS(rs.getString("mem_regno2"))%>",
"mem_bir" : "<%=Util.toJS(rs.getString("mem_bir")).subSequence(0, 10)%>",
"mem_zip" : "<%=Util.toJS( rs.getString("mem_zip"))%>",
"mem_add" : "<%=Util.toJS(rs.getString("mem_add1"))%> <%=Util.toJS(rs.getString("mem_add2"))%>",
"mem_hometel" : "<%=Util.toJS(rs.getString("mem_hometel"))%>",
"mem_comtel" : "<%=Util.toJS(rs.getString("mem_comtel"))%>",
"mem_hp" : "<%=Util.toJS(rs.getString("mem_hp"))%>",
"mem_mail" : "<%=Util.toJS(rs.getString("mem_mail"))%>",
"mem_job" : "<%=Util.toJS(rs.getString("mem_job"))%>",
"mem_like" : "<%=Util.toJS(rs.getString("mem_like"))%>",
"mem_memorial" : "<%=Util.toJS(rs.getString("mem_memorial"))%>",
"mem_memorialday" : "<%=Util.toJS(rs.getString("mem_memorialday")).subSequence(0, 10)%>",
"mem_mileage" : "<%=Util.toJS(rs.getString("mem_mileage"))%>",
"mem_delete" : "<%=Util.toJS(rs.getString("mem_delete"))%>"
}
<%
}
}catch(SQLException e){
e.printStackTrace();
}finally{
if(rs!=null) try{rs.close();}catch(Exception e){}
if(psmt!=null) try{psmt.close();}catch(Exception e){}
if(conn!=null) try{conn.close();}catch(Exception e){}
}
%>
]
SQL>SELECT TABLE_NAME
FROM USER_TABLES
WHERE TABLE_NAME = ’찾을 테이블 이름’
-->찾을 테이블 이름은 대문자여야 됩니다.
캔버스 간단한 마우스 그리기 (0) | 2012.06.04 |
---|---|
캔버스 이미지 뛰우기 . (0) | 2012.06.04 |
Canvas (0) | 2012.05.22 |
html4.0 을 html 5.0 으로 변환 (0) | 2012.05.14 |
Aptana 설치 (0) | 2012.05.14 |
브라우저 위의 그림판
HTML5 의 많은 새로운 기능 중 가장 자주 언급되어 왔던 것이 아마 Canvas(캔버스) 일 것이다
Canvas 는 Web Workers 나 Web Storage와 같은 다른 HTML5 스펙보다 덜 기술적이며 보다 직관적이다.
개발자 뿐만 아니라 비개발자들 역시 Canvas의 개념을 쉽게 이해할 수 있고 흥미를 보여왔기 때문에 가장 먼저 그리고 가장 흔하게 소개된 HTML5 기술인 것이다
Canvas 는 말 그대로 그림을 그릴 수 있는 화폭, 즉 그림판과 같다
그것도 다른 곳에 아닌 브라우저 위에서 동작하는 그림판인 것이다
Canvas 위에 선, 도형, 텍스트, 이미지와 같은 그래픽을 표현할 수 있고 색깔, 그림자, 패턴과 같은 여러 효과를 적용할 수 있다. 그리고 기본적으로 Canvas 는 2차원 그래픽 표현을 위한 스펙이지만 추가로
WebGL를 기반으로 하는 3D 그래픽용 Canvas 의 스펙 개발이 진행중이다
브라우저 지원 현황
브라우저 지원 현황 역시 다른 HTML5 기술보다 더 일반적이다
다시 말해 대부분의 브라우저에서 Canvas를 지원한다는 의미이다
캔버스 이미지 뛰우기 . (0) | 2012.06.04 |
---|---|
canvas 사이트 모음 . (0) | 2012.05.24 |
html4.0 을 html 5.0 으로 변환 (0) | 2012.05.14 |
Aptana 설치 (0) | 2012.05.14 |
HTML 이란. (0) | 2012.05.14 |
=================================
=================================
먼저 web.xml 에 context-param 울 추가 하자.
여기서 classpath 의 값이 application*.xml 인 이유는
추후 DB 연결인 datasource 구현및 AOP 구현을 위해 만드는 것이다.
applicationAOP.xml 이면 AOP 구현
applicationcontext.xml context 구현
applicationDataSource.xml 이면 DS 구현 이다.
본래 마이바 티스 에서는
MyBatiseFacotry.java
config.xml
을 이런식으로 구현 하게 된다.
dipather의 즉 조립기에서는 연결된 sqlSessionFactoryBean을 만들기 위해서 application 구현부에 등록을 먼저 해야 한다.
applicationDataSource.xml 를 경로에 맞기 생성하자. Datasource 에서는 크게 3개의 컨테이너(bean) 울 구현 해야 한다.
먼저 datasource 를 보자 .
여기서 defaultAutoComiit의 경우 기본 값을 true 이나. comiit(커멧이 무엇인지는 알거라 믿음)이 여기서 ture 인경우 성능에 문제가 발생 된다고 한다.
아마도 select 문 의 경우 commit 필요 업는데도 불필요 하게 실행 되는등등의 문제가 있는듯 하다.
라고 만들면 된다 .
p:configLocation 의 경우
이렇게 구현되어 진다. 기존의 config.xml 이 데이터 베이스에 대한 것에 대하여 다 입력 되어 있었던것을 기억해 두자.
이후에 같은 경로에 applicationcontext.xml 을 만들어 보자. 먼저 할것은
을 추가 하자 db 연결에 대한 설정 파일을 properties 에서 설정 함을 알수 있다.
이렇게 설정만들어 보자. !!
MyBatis 에서 제공하는 MapperFacetoryBean 을 이용하여 프락시(대행)객체를 생성하여 호출
단, 기존 dao의 로직이 있는 경우는 안됨, 해당 로직은 다른곳(서비스)에서 처리 한마디로 마이바티스 를 안만들고 자체적으로 처리됨.
을 추가하자.
그 후에 bean 컨테이너를 짜야 한다.
이런식으로!!!
추가:
p:sqlSessionFactory-ref="sqlSessionFactoryBean" 의 경우 반드시 service 구현부 에서 set 로 구현 되어야 한다.
ex)
이렇게 구현 하자 .
그리고
이것도 까먹지 말자. 생성 할때 추가 하던가 하는게 좋다.
MyBatis (0) | 2012.07.03 |
---|---|
스프링 3.0 + ibatise (0) | 2012.07.03 |
web.xml 구현부 encoder (0) | 2012.05.19 |
Spring 개발 환경 . (0) | 2012.05.19 |
dispathcer 구현부 web-servlet.xml (0) | 2012.05.19 |
spring 구현시에 반드시 추가 해야만 한다. 안그러면 한글이 깨진다.
web,xml 구현
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
을 추가 하자.
스프링 3.0 + ibatise (0) | 2012.07.03 |
---|---|
Srping 3.0 sqlSession+DataSource 구현 하기. (Spring+mybatise0 (0) | 2012.05.19 |
Spring 개발 환경 . (0) | 2012.05.19 |
dispathcer 구현부 web-servlet.xml (0) | 2012.05.19 |
DispatcherServlet web.xml 구현부 (0) | 2012.05.19 |
이클립스에서 스프링을 구현해 보자.
http://www.springsource.org/spring-community-download
접속 하자.
아래와 같이 가입 하라고 나오나. 밑에 단에
(I'd rather not fill in the form. Just take me to the download page)
라고 써있다. 난 그런거 필요 없으니 다운로드
페이지를 보여줘.. 라고 한다 클릭해 주자
라고 나온다 여기서 spring-framework-3.1.1.RELEASE-with-docs.zip 또는 아래 것을 다운 받으면 된다. 되도록이면 doc 가 포함 된 것을 받자.
압축을 푼후에 src 폴더의 내용을 builderpacher 또는 lib 폴더에 추가 시킨다.
대략적으로 사용 하는 것만 따로 추출 해보자면
org.springframework.aop-3.1.1.RELEASE.jar
org.springframework.asm-3.1.1.RELEASE.jar
org.springframework.beans-3.1.1.RELEASE.jar
org.springframework.context-3.1.1.RELEASE.jar
org.springframework.context.support-3.1.1.RELEASE.jar
org.springframework.core-3.1.1.RELEASE.jar
org.springframework.expression-3.1.1.RELEASE.jar
org.springframework.jdbc-3.1.1.RELEASE.jar
org.springframework.orm-3.1.1.RELEASE.jar
org.springframework.transaction-3.1.1.RELEASE.jar
org.springframework.web-3.1.1.RELEASE.jar
org.springframework.web.servlet-3.1.1.RELEASE.jar
이다. 각자 다운 받아도 되나 통합 사이트 에서 되도록 받자... ; 용량 문제로 한꺼번에 못올린다.
Srping 3.0 sqlSession+DataSource 구현 하기. (Spring+mybatise0 (0) | 2012.05.19 |
---|---|
web.xml 구현부 encoder (0) | 2012.05.19 |
dispathcer 구현부 web-servlet.xml (0) | 2012.05.19 |
DispatcherServlet web.xml 구현부 (0) | 2012.05.19 |
Encoding Filter (web.xml 구현 ) (0) | 2012.05.19 |
-------------------
-------------------
만약 스프링 폴더가 없다면 any-frame 에서 스프링 프레임웍을 이클립스에 넣어야 한다. 이클립스 종료후 이클립스 폴더에
설치 ::http://sararing.tistory.com/entry/Spring-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD
core 한글 (애니프레임) 가이드 PDF:http://dev.anyframejava.org/docs/anyframe/plugin/essential/core/1.0.3/reference/pdf/core-1.0.3.pdf
Spring Bean Configuration File 입력후 경로및 파일이름(web-servlet.xml) 을 넣은 next를 하면
이렇게 나온다 여기서 XSD를 추가 해야만 한다. 지속 적으로 사용 하는 경우에 내용을 복사 해서 사용 해도 된다.
AOP 입력 맨 밑에 3.0.XSD 최신판을 추가 체크 하도록 하자.
추가 할것은
이렇게 된다. 만들어 보자.
만들어진 xml파일의 기본 내용은
이렇게 될것이다.
기본적으로 Spring 에서 MVC 패턴을 구현 하다고 했을때 dipathcer 를 말하는 것은 방금 만든 web-xml 을 말하는 것이다.
dipathcer 구현은 MVC 패턴에서 가장 중심이 되는 것으로 신경써서 구현 해야 한다. 현재 Spring으로 구현 부는 member 와 board 가 있으며 pds 라는 다운로드 까지 포함 되어 있다.
controller 는 anotation을 통해 매핑 되어 있다.
controller 구현 bean을 보자.
위의 내용에 추가 된것을 하나씩 보자.
내용을 보자면 "kr.or.ddit.web.controller" 경로 의 java 파일을 기본 위치로 설정 되어 컨트롤러를 확인 할수 있도록 되어 있다. 기본적으로 jsp 에서 요청시에 맨처음에 dispahcer 에서 실행 하는 것은 매칭된 controller를 찾는 것이다. 이 경로를 찾기 위에서는 HandlerMapping 이 작동 되는데 여기서는 ID="dahmhandlerMapping"
이라는 이름으로 구현 되어 있다. 참고로 fullpath를 이용 하려면 핸드러 매핑,핸드러 어뎁터 두 곳 모두 p:alwaysUseFullPath="true" 를 줘야 한다.
컨트롤러 매핑의 경우 직접적으로 줄수도 있는데
이렇게 하면 된다.
매핑되어 찾아진 controller 에서는 그 결과 값으로 Model 또는 view 값으로 결과 값을 리턴 하며 반환 값으로 String (controller 구현부에서 확인 가능) 으로 보여줄 view를 검색 하게 되는데 그렇게 보여 지는것을 viewResolver 라고 한다.
여기서 확인 해야 할것은. controller 에서 주는 값을 확인 해야 하는데 그 값에 prefix 는 앞에 suffix 는 뒤에 추가 하는 것을 위미 한다. order의 경우 우선순위를 말한다.
dispatcher 에서 업로드 를 구현 할수 있는데 이경우 반드시 아이디 값을 = "multipartResolver" 로 줘야 한다.
insert 문이나 edit 문의 경우 결과 값 == 성공 또는 실패 에 대하여 view 단을 따로 구현 하는것은 매우 비효율 적이라고 할수 있다. 따라서 결과 값에 대하여 하나의 message 형태 도는 클래스 형태로 구분 되어 지는데 message 형태로 출력 dispather 또한 가능 하다.
이렇게 하여
실제 경로의 팔일은
이런식으로 구현하면 된다. message 는 대충 보자.
web.xml 구현부 encoder (0) | 2012.05.19 |
---|---|
Spring 개발 환경 . (0) | 2012.05.19 |
DispatcherServlet web.xml 구현부 (0) | 2012.05.19 |
Encoding Filter (web.xml 구현 ) (0) | 2012.05.19 |
Missing artifact ojdbc:ojdbc:jar:14:compile (0) | 2012.05.18 |
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--//WEB-INF/web-wervlet.xml을 기본설정 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:kr/or/ddit/config/web-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
Spring 개발 환경 . (0) | 2012.05.19 |
---|---|
dispathcer 구현부 web-servlet.xml (0) | 2012.05.19 |
Encoding Filter (web.xml 구현 ) (0) | 2012.05.19 |
Missing artifact ojdbc:ojdbc:jar:14:compile (0) | 2012.05.18 |
스프링 3.0 AOP 에러. 문제 해결 (1) | 2012.05.15 |
web.xml 구현
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
dispathcer 구현부 web-servlet.xml (0) | 2012.05.19 |
---|---|
DispatcherServlet web.xml 구현부 (0) | 2012.05.19 |
Missing artifact ojdbc:ojdbc:jar:14:compile (0) | 2012.05.18 |
스프링 3.0 AOP 에러. 문제 해결 (1) | 2012.05.15 |
Spring3.0 Tiles (1) | 2012.05.14 |
전자 정부 프레임웍 .. 프로젝트 만들자 마자 에러 생김..
pom.xml 을 열어 <repository>
<dependency> 추가. 저작권 때문이 라고함. 아놔.
<repository>
<id>mesir-repo</id>
<url>http://mesir.googlecode.com/svn/trunk/mavenrepo</url>
</repository>
And you can get the ojdbc14 jar w/this dep. def.
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
http://www.jroller.com/mert/entry/oracle_s_ojdbc14_jar_mesir 출처
DispatcherServlet web.xml 구현부 (0) | 2012.05.19 |
---|---|
Encoding Filter (web.xml 구현 ) (0) | 2012.05.19 |
스프링 3.0 AOP 에러. 문제 해결 (1) | 2012.05.15 |
Spring3.0 Tiles (1) | 2012.05.14 |
Spring3.0 DB (0) | 2012.05.14 |
외장 하드 같은 경우 간혹 배드섹터로 인해 인식이 안되는 경우가 발생 할수 있다. 이는..
usb 를 통해 전원공급과 하드섹터 읽음이 같이 연결 되어 지는데 정상적이라면 읽음이 종료 된후에 전원공급이 종료 되어야 하나.
읽는 도중에 강제로 선을 뽑는 경우 전원이 먼저 끊어지기 때문에 문제 되어지는것 같다 이런 경우
윈도우키 + R 을 눌러 실행창을 누루고 CMD 를 누룬다. 보통 도스실행창 이라고 한다.
실행 창이 켜진 상태에서
chkdsk h:/f/r <--- 명령어를 입력 한다.
참고로 여기서 h 는 드라이버의 이름이다 만약 연결 했을때 외장하드 드라이버 연결조차 안된다면 chkdsk 조차 안된다는것이다.
참고로 chkdsk 는 하드웨어 섹터 점검 명령 이다.
참고로 엄청 오래 걸린다;;;
추가: 설명은 퍼왔으나 소스 부분은 자체적으로 수정 했습니다.
<목표> [안드로이드] 서버/클라이언트 소켓(Socket) 통신하기
오늘은 서 버, 클라이언트의 소켓(Soket) 통신에 대해서 알아보겠습니다. 기존의 많은 안드로이드 어플리케이션이 각각의 서버를 이용하여 정보를 주고 받습니다. 아무래도 기기 내에서 만으로 서비스하기에는 한계가 있기 때문이죠. 정보를 저장하고, 서버에서 처리하여 결과를 주고, 클라이언트는 그 결과를 받아서 어플리케이션에 알맞은 동작을 취하도록 합니다. 트위터 서비스나 스마트폰을 이용해서 공짜 문자(통신료 제외)를 주고 받을 수 있는 것도 서비스를 제공하는 곳에서 서버를 두기 때문입니다. 그 덕분에 핸드폰을 벗어나 더 많은 정보를 처리할 수 있도록 할 수 있습니다.
서 버/클라이언트 소켓 통신은 기존의 자바를 이용해서 소켓 통신을 해보신 분들이라면 어렵지 않게 사용하실 수 있습니다. 서버의 소스 자체는 완전히 자바 소스로 이루어지기 때문이지요. 실제로 서버는 안드로이드를 통해서 돌리는 것이 아니라, 기존의 자바 프로그래밍을 이용하여 수행합니다. 클라이언트는 당연히 안드로이드로 개발을 해야겠지요. 오늘 보여드릴 예제 소스는 인터넷에 돌아다니는 간단한 서버 – 클라이언트 소켓 통신을 가지고 와서 나름대로 수정을 해본 것입니다. 기존의 샘플 코드가 하나의 메시지를 서버로 보내고 난 뒤에, 바로 클라이언트에서 기다리면서 데이터가 오기를 기다리는 형태로 제공되었습니다. 그렇기 때문에 클라이언트가 계속 데이터를 기다리면서 블록킹 되어 있는 상태에서만 프로그래밍이 돌아갔습니다. 이러한 부분을 수정하여 쓰레드를 이용하여 백그라운드에서 돌아가게 하여, 기존의 클라이언트에서는 원래의 프로그램이 수행되고, 서버에서 오는 정보를 받는 부분은 쓰레드를 통해 해결했습니다.
먼저 서버를 만들 자바 코드를 알아보고, 뒤에는 안드로이드에서 소켓 통신을 위한 설정과정을 간단한 예제를 통해서 알아보겠습니다.
STEP 1 Java Source Code
자바 코드는 두 가지를 다루게 됩니다. 처음은 서버를 돌리는 데 필요한 자버 코드를 알아보고, 두 번째는 안드로이드 클라이언트 코드를 알아보겠습니다.
[[ 서버 ]] TCP Server Java Code
package kr.or.ddit; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; public class JavaServer { /** * @param args */ public static void main(String[] args) { try { System.out.println("Starting Java Socket Server ......"); ServerSocket serverSocket = new ServerSocket(5001); System.out.println("Listening at port : 5001"); while (true) { Socket socket = serverSocket.accept(); System.out.println(getTime() + " host : " + socket.getInetAddress() + ", port : " + socket.getPort()); ObjectInputStream inputStream = new ObjectInputStream( socket.getInputStream()); String inputString = inputStream.readUTF(); System.out.println("ID : " + inputString); ObjectOutputStream outputStream = new ObjectOutputStream( socket.getOutputStream()); outputStream.writeUTF(inputString); outputStream.flush(); socket.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } static String getTime() { SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd [hh:mm:ss]"); return format.format(new Date()); } } |
서버의 기능은 클라이언트에서 오는 데이터를 받아들이는 게 핵심입니다. 자신의 포트를 세팅하여 소켓을 여는 것부터 시작하여, 클라이언트에서 오는 정보를 받기 위해서 accept() 를 통해서 기다립니다. 그리고 데이터가 왔다는 신호가 오면 리더를 통해서 스트림을 읽어냅니다. 그리고 자신이 받은 스트림 정보를 다시 돌려보내는 역할을 합니다. 현재는 하나의 클라이언트와 컨넥트를 통해 데이터를 주고 받는 형식입니다. 많은 클라이언트와 통신하고 싶으면 클라이언트에 대한 정보를 저장하고, 여러 클라이언트에게 적절하게 보내는 기능을 추가하시면 되겠습니다.
[[ 클라이언트 ]] TCP Client Java Code
|
이 번에 살펴볼 코드는 안드로이드 클라이언트 프로그램입니다. 안드로이드 클라이언트 코드에서는 서버에 소켓을 연결하고 받은 정보를 이용하여 프로그램을 수행시키는 것을 다룹니다. 먼저 onCreate()가 되면 서버에 연결하도록 설계되어 있습니다. IP 주소와 포트 번호를 알맞게 설정해주시고, 소켓을 연결합니다. 그리고 데이터를 주고 받기 위해서 리드, 라이터를 설정하여 둡니다. 예제에서는 간단히 텍스트 박스에 문자를 적고 버튼을 누르면, 서버로 데이터를 보냅니다. 그리고 서버에서 오는 데이터를 계속 받기 위해서 while을 쓰레드를 통해서 실행합니다. 여기서 받은 데이터 정보를 토스트 기능을 통해 출력합니다. 여기서 UI에 대한 접근을 핸들러를 통해서 하고 있는 것을 확인할 수 있습니다. 이렇게 하는 이유는 다른 포스트에 올리겠습니다. 일단 UI에 대한 접근은 핸들러를 통해서 수행한다고 생각하시고 프로그램을 수행해야한다는 것만 기억하시고 계시면 될 것 같습니다.
STEP 2 Xml Code
Xml 코드에는 간단히 EditText에서 넣은 문자열을 버튼을 통해 서버로 데이터를 보내는 기본적인 기능만 추가하시면 됩니다.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffffff" > <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="88dp" android:background="#ffffaadd" android:textColor="#ff000000" /> </ScrollView> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" > <EditText android:id="@+id/editText" android:layout_width="250dp" android:layout_height="wrap_content" android:hint="@string/editText" /> <Button android:id="@+id/requst" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/request" /> </LinearLayout> </RelativeLayout> |
STEP 3 AndroidManifest.xml Code
메니페스트에는 소켓을 이용하기위해 인터넷을 사용해야 하므로, 인터넷을 사용하겠다는 퍼미션만 추가해주시면 됩니다.
AndroidManifest.xml 에 추가해야할 인터넷 사용 허가권 |
<uses-permission android:name="android.permission.INTERNET" /> |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="kr.or.ddit" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".AndroidSocketClientActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET" /> </manifest> |
< 마무리 > 서버/클라이언트 소켓(Socket) 통신하기
서버와 클라이언트의 소켓 통신에 대해서 알아보았습니다. 핸드폰 내에서의 기능과 정보만으로는 어플리케이션이 한정적일 수 밖에 없습니다. 그렇기 때문에 통신을 통해서 좀 더 폭넓은 서비스를 제공하기 위해서 서버와 클라이언트가 서로 통신할 수 있도록 소켓에 대해서 알아볼 필요가 있었습니다. 하나의 서버가 여러 곳의 클라이언트들에 대해서 서비스를 해줘야 할 때는 클라이언트에 대한 정보를 가지고 있으면서 소켓을 각각 연결시켜주어야 합니다. 안드로이드 클라이언트 부분에서도 현재 수행되고 있는 동작에 영향을 받지 않으면서 백그라운드에서 쓰레드가 돌면서 서버에서 오는 정보를 수시로 받을 수 있도록 해야합니다. 소켓 통신에 대한 기존 개념을 알고 계신 분들이라면 크게 어렵지 않게 이해하실 수 있으셨으리라 봅니다. 처음 접하시는 분들은 데이터를 주고 받는 부분에서 자신이 수행하고 싶은 기능만 추가해주시면 간단히 소켓 통신을 하실 수 있으리라 생각합니다.
[참고자료]
You must supply a layout_width attribute (0) | 2012.05.15 |
---|---|
Progressbar (0) | 2012.05.15 |
안드로이드 색상표 (0) | 2012.05.11 |
안드로이드 강좌 모음 pdf&동영상 강좌. (0) | 2012.05.11 |
화면회전 (0) | 2012.05.08 |