2015년 7월 24일 금요일

HTML5 Intermediate 5일

* 서버와 클라이언트의 MVC 모델


* Client의 MVC 모델을 구현한 라이브러리: Backbone, Angular JS.

* JS는 모든 것이 객체이다. function 도 객체임.
- 함수, 변수 등을 선언하면 window 객체의 멤버가 되어 Global하게 사용할 수 있음.

* 일반 JS 메소드에서 this는 window 객체임. --> window를 생략할 수 있으므로 함수처럼 보이는 것임.
- 엄밀히 말하면 JS에서는 함수라는 것이 없음. 함수처럼 보이는 애들은 모두 메소드이며 특정 경우 객체를 생략할 수 있으므로 함수로 보이는 것임.
- 생략된 객체는 경우에 따라 달라짐. 보통의 경우는 windows 객체이며, Worker의 JS 파일에서는 Worker를 의미함.
- Worker JS에 다음과 같은 코드가 있다고 할 때 postMessage()는 worker의 것을 호출함.
function loadHandler() {
if( xhr.status === 200 ) {
/* 여기서 this는 xhr 객체임. 따라서 this.postMessage()로 호출하면 안됨. */
postMessage( new Protocol(2, xhr.responseText) );
}
else {
postMessage( new Protocol(2, '통신 오류 발생: ' + xhr.status) );
}
}
xhr.addEventListener('load', loadHandler);
-

* 이벤트 핸들러에서 this를 사용하면 그 이벤트 핸들러를 추가한 객체를 의미함.
- btn.onclick = function() { this. ~ } ==> this는 btn임.

* 서버와 통신 방식 비교

방식Req-ResAsyncbidirection
formXXX
AJAXOX
Web SocketOOO

* Web Socket은 클라이언트의 표준임.

* Web Socket은 기본적으로 utf8을 이용함.

* Web Socket 서버 라이브러리 JavaDoc (tomcat 7.0)
- http://tomcat.apache.org/tomcat-7.0-doc/websocketapi/index.html

* Web Socket Binary 통신은
- AJAX에서 파일을 주고 받을 때와 같이 사용됨.
- blob 이라는 놈을 사용해야 함.

* 포커스를 잃을 때 발생하는 이벤트: blur
* 포커스를 얻을 때 발생하는 이벤트: focus

* Drag & Drop 하려면 draggable 속성이 true이여야 함. 이 속성은 모든 Tag에 적용될 수 있음.



저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

2015년 7월 23일 목요일

HTML5 Intermediate 4일

* 팝업창에서 부모 창을 나타내는 객체: window.opener
- 부모 창에서 iframe 윈도우 객체: iframeTag.contentWindow
- 부모 창에서 팝업창 윈도우 객체: 
--> window.open(URL, name, features, replace)의 리턴값이 팝업창의 윈도우 객체임.
- 각 윈도우 객체의 postMessage()로 해당 윈도우에게 메시지를 보낼 수 있음.

* Cross Domain
- 보낼 window의 핸들을 얻을 수 있는 경우에만 가능

* Web Worker
- worker thread는 웹 페이지에서 발생하는 이벤트를 받거나 직접 핸들링 할 수 없음.
- worker thread에는 window 객체가 없음 --> UI 작업에 제한이 따름.
- 메인 쓰레드에서 사용자 인터페이스 및 UI 작업을 하고 오래 걸리는 작업 등을 worker thread로 처리.

* BOM : Browser Object Model. 자바스크립에서 브라우저를 핸들링하기 위하여 제공되는 객체의 모델.
- window: 다음의 브라우저 관련 객체를 제공
-- document
-- location
-- history
-- navigator
-- screen

* Main 스레드 <--> Worker 쓰레드 간 통신: Cross-Domain의 API와 동일하게 사용할 수 있음.
- postMessage() 할 때 객체 자체를 보낼 수 있음. 어짜피 같은 브라우저에서 실행되는 것이므로 가능.

* 일반 함수에서 this는 window 객체임. Worker용 JavaScript 파일에서 this는 Worker임.

* Worker 스레드에서 사용할 수 있는 window 객체
- XMLHttpRequest
- create other web workers --> 권장하지 않음.
- applicationCache : offline web cache 기능 제공 객체. 서버와의 데이터 동기화 작업을 수행함.
- navigator : 브라우저 자체의 정보 제공 객체. Worker에서는 geolocation 정보는 가져올 수 없음.
- location : 브라우저의 주소창. 이를 이용하여 URL 정보 등을 알 수 있음. Worker에서는 페이지 전환을 시킬 수 없음.
- setTimeout method
- clearTimeout method
- setInterval method
- clearInterval method
- importScripts method : importScripts('경로명', '파일명', '경로명', '파일명', ....)

* GET 방식에서 파라미터에 한글을 지원하려면
- Tomcat 서버의 server.xml 파일에서 <Connector> 부분에 URIEncoding 방식을 추가해야 함.
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />

* Web Cache
- window.applicationCache 존재 여부로 지원 여부를 알 수 있음.
- Manifest 파일을 생성: Cache할 정보를 담고 있음.
- <html manifest='notes.manifest'> 와 같이 지정하면 notes.manifest를 브라우저가 받아 옴.
- Web Cache되는 컨텐츠는 동일 서버에 있는 것만 가능함.
- 외부 리소스를 참조하는 경우라면 로컬 서버에 가져다가 놓아야 함.
- manifest 파일은 다음과 같아야 함.
CACHE MANIFEST <-- 꼭 이 문장으로 시작
# v = 1.0.0 <-- 버전 정보. 이 값이 바뀜에 따라 캐싱이 다시 이루어짐.
./style.css <-- 여기부터 캐시할 리소드들을 쭉 나래비 함.
./notes.js
- <html manifest='notes.manifest'> 가 등록된 HTML 파일 당연히 캐시됨으로 위에 명시할 필요 없음. 명시해도 됨.
- 개발자 도구 다음에서 확인 가능.
- window.applicationCache의 update()를 호출해야 변경 내용을 새로 받음.
- Web Cache을 이용할 때는 업데이트 가능한 상태로 컨텐츠를 배포해야 함. 중요!!!
- Offline에서 Online이 되는 순간 업데이트 되도록 할 수 있음. navigator 객체 이용. navigator.onLine로 Online 여부를 확인할 수 있음.
- window.addEventListener('online', onlineHandler); 이용하여 Online으로 바뀌었는지 여부 확인 가능


저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

Eclipse에 등록된 Tomcat 서버 설정 변경

Servers 창에서 등록된 서버 더블 클릭하면 다음과 같은 Tomcat 설정 화면이 나타남.
이 화면에서 포트 등 설정을 변경할 수 있음.




저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

2015년 7월 22일 수요일

HTML5 Intermediate 3일

* Web Cache: Offline에서도 Web App을 사용할 수 있도록 데이터를 저장하는 기능
--> Client Storage로 가능해졌음.

* localStorage의 값 navigation: localStorage.lengh, localStorage.key(index) 이용.

* localStorage의 변경 이벤트
- window.addEventListener('storage', onChanged);
- function onChanged(event) { ... }
- event의 속성 중 key, oldValue, newValue, url(변경한 URL) 이용

* localStorage 데이터 저장 위치: Chrome Windows의 경우
- C:\Users\icore\AppData\Local\Google\Chrome\User Data\Profile 1\Local Storage
- 버전 및 사용자에 따라 조금 달라지.

* Custom Attribute:
- XXX.setAttribute('data-id', value) 와 같이 지정
- 단, 'data-'로 시작하여야 함.
- 설정: setAttribute(key, value)
- 값 가져오기: getAttribute(key), XXX['data-YYY']와 같이 사용할 수 없음.
- 제거: removeAttribute(key)

* 태그의 형태 구분: 다음 참조.
var notesClickHandler = function(event) {
/* 자식 노드 중 li 태그만 처리하고자 할 경우 아래와 같이 함.
* event.target : 실제 이벤트를 발생시킨 객체
* contructor 속성이 객체를 생성하기 위한 모든 정보를 가지고 있음.
*/
if(event.target.constructor === document.createElement('li').constructor) {
loadNote(event.target.getAttribute('data-id'));
}
};

* Indexed DB
var req = window.indexedDB.open('simpleDB', 1); /* (이름, 버전) */
/* 세 개의 이벤트 핸들러 */
req.addEventListener('success'); /* 정상적으로 오픈한 경우 */
req.addEventListener('upgradeneeded'); /* 생성하려는 DB가 없는 경우 발생. */
req.addEventListener('error'); /* 오픈 시 오류가 발생한 경우 */




저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

2015년 7월 21일 화요일

HTML5 Intermediate 2일

audio 태그 예제

* addEventListener의 마지막 인수 : event bubbling, event capturing 여부 지정.
- bubbling 시 자식이 이벤트를 처리해도 부모에게 전파됨.

* 객체의 속성 존재 여부 판단: if( navigator.geolocation ) --> if( 'geolocation' in navigator )

* JavaScript에서
- 100 OR 200 ==> 100 - 처리과정: 100 --> OR --> 끝 ==>100
- 100 AND 200 ==> 200 - 처리과정: 100 --> AND --> 200 --> 끝 ==> 200

* Client Storage
1. Web Storage: Key-Value 형태. 복잡한 데이터를 담기에는 역부족.
2. Web SQL: 크롬과 사파리에 구현되어 있으며 sqllite3로 구현. 특정 제품에 종속된다는 이유로 HTML5 표준 스펙에서 빠짐. 모질라 계열(파이어 폭스)에서 반대함.
3. Indexed DB: Web SQL이 스펙에서 빠지면서 포함됨. 객체 저장소 제공. 저장된 객체에 인덱스를 부여하여 빨리 찾을 수 있도록 함.

* Web Storage:
- localStorage: 도메인 별로 값을 영구 저장하는 저장소. 변경 이벤트 제공 --> 동기화 작업 가능. 같은 도메인의 여러 어플리케이션에서 공유할 수 있음.
- sessionStorage: 임시 저장소. 한 어플리케이션에서 사용하는 임시 데이터. 다른 어플리케이션에서 이 값을 읽을 수 없음. Browser를 닫았을 때 값이 없어지며, 같은 Browser 인스턴스에서 F5로 갱신하거나 다른 곳에 다녀와도 지워지지 않음.
- 둘 다 window 객체의 속성으로 제공됨.
- 둘을 사용하기 위한 API는 동일함.
- 기본적인 API
-- storage.setItem(key, value) : 데이터 저장. key는 문자열, value도 문자열.
-- storage.getItem(key) : 데이터 반환
-- removeItem(key) : 데이터 제거
-- clear() : 데이터 모두 제거. 주의해서 사용해야 함!!

* window 객체의 메소드 및 속성을 사용할 때는 'window.' 쓰지 않아도 됨.

* JavaScript 객첵 생성 방법
1. 암시적 방법
var obj = { name: '홍길동', age: 24, married: true }

2. 명시적 방법
function People() {
  this.name = '홍길동';
  this.age = 24;
  this.married = true;
}
var obj = new People();

* JSON --> Object : JSON.parse(JSON 문자열)
* Object --> JSON : JSON.stringify( object )

* JavaScript의 Type: 총 6가지임
- Primitive Type: string, number, boolean
- Reference Type: function, object(Array 포함)
- undefined
- 이 중 function, undefined는 JSON으로 표현 안됨.

저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

Chrome 원격 디버깅


1. PC의 Chrome Browser에서 다음 클릭.

2. 다음과 같이 PC에 연결된 기기(Device)가 나타남.

3. 원하는 디바이스가 나타나지 않는 경우 해당 기기에서 확인을 원하는 메시지가 나와 있는지 보고 확인을 누름.

4. 연결할 디바이스의 Chrome Browser에 떠 있는 URL 중 원격 디버깅 할 URL 밑에 있는 inspect 버튼 클릭

5. 해당 URL에 대한 개발자 도구가 PC에 나타나며 디바이스에서의 이벤트가 그대로 표시됨.

6. 설정 끝, 디버깅 시작!


저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

2015년 7월 20일 월요일

HTML5 Intermediate 1일

* 주소 구성
http://localhost:8080/html5/hello.html
--> protocol://hostname:port/application/pathname
--> host = hostname:port
--> JavaScript의 location 객체에서 확인할 수 있음.

* URL: host + pathname

* Web Contents 종류
1. static: Web Application은 아님. 정적 컨텐츠 제공. Web Server에서 보통 제공
2. dynamic: Web Application.

* HTML 문서 제일 앞의 <!DOCTYPE html> --> 문서의 유형을 선언

* HTML 문서 구성
1. head: 문서에 대한 정보 제공. 사용할 수 있는 태그는 7가지임.
- meta: 정보 제공. 처리방식 지정
- title: 문서 제목
- link: 외부(혹은 내부) 리소스 연결. 필수요소: rel(형태), href(리소스 위치)
- style: CSS 형태의 View 형식 지정
- script: JavaScript 정의. body에서도 사용 가능
- noscript: JavaScript 사용이 Browser에서 disable 되어 있는 경우에 호출됨. JavaScript는 안된. body에서도 사용 가능.
- base: 로컬 서버 내 리소스의 기준 경로를 지정할 때 이용

2. body: 컨텐츠 제공.

* CSS 적용방식
1. External Style 적용
2. Internal Style 적용
3. Tag에서 Style 적용
--> 사용자 환경에 따른 선택적 View 제공
--> HTML은 View와 관련된 내용을 가지면 유지보수 및 다양한 사용자 환경을 지원할 수 없음.

* Multi-View 적용방법
1. Media Query
2. Navigator 객체 이용하여 user-agent의 정보를 활용함. 운영체제, Browser 정보, 단말기 이름 등.

* body 내 정의된 Script Tag는 정의된 순서에 따라 실행 순서가 결정됨. 해당 Tag Block이 로딩될 때 실행.

* Semantic Tag: header, footer, section, article, aside, nav. 문서의 구성(구조)할 때 사용.
- aside: 현재 컨텐ㅊ의 부가적인 정보 제공.

* Layout Tag: div, span

* href='#' --> dummy link 제공. 공백보다 #가 좋음

* 임의의 텍스트를 제공하는 사이트: http://lipsum.com/

* 대체 이미지 제공 사이트: http://place-hold.it/[width]x[height]

* 모든 Browser에서 제공하는 폰트: Serif, Sans-Serif, monospace

* Selector의 종류 56가지. 조합해서 사용가능.

* CSS 형태
- 선택자 { 스타일 } 과 같이 정의
- 배치나 Layout 관련된 Style은 개발자도 잘 알아야 함.

* 선택자 종류
- 태그 선택자: body, header, ...
- ID 선택자: #myFrom, ...
- Class 선택자: .myClass, ...
- 자손 선택자: body h1 --> 가운데 공백, body 및 body 자손 태그 밑에 있는 모든 h1 태그를 선택함.
- 자식 선택자: body > h1 --> body 바로 밑에 있는 h1 태그를 선택함.

* Web Font Service: 서버가 클라인언트에 제공하는 폰트. Browser에서만 사용되며 시스템에 설치되지는 않음.

* Style 지정 시 순서
margin: 1px 2px 3px 4px; --> top, left, bottom, right를 의미. top 부터 시계방향으로 지정됨.
margin: 0px auto; --> 상하, 좌우; auto는 좌우를 자동으로 조정하는 데 같이 맞추며 가운데로 배치되는 효과가 있음.

* display : [block | inline | none]
- block, inline 태그의 속성을 전환할 때 사용
- none 으로 지정하면 Web Page에서 제거됨. 영역 자체가 없어짐.

* block 요소 태그의 특징
- 특정 영을 갖는다. (사각형 형태)
- 기본적으로 좌우배치만 조정 가능하다.
- 다른 block 요소 태그와 순차적으로 수직 배열 된다.
- 수평 배치하려면 style 중 float: [left|right]를 이용함. float 속성 지정 시 width 속성도 같이 지정해야 함.

* float를 지정하면 이후에 나오는 모든 태그에 영향을 주므로 적당한 시점에 해제할 필요가 있음. clear: [left|right|both] 이용.

* inline 태그
- 자신만의 영역이 없다 --> width, height, layout 관련 속성 없음.
- 부모 태그의 영역에 종속됨.

* Web의 기본 폰트 크기: 16px --> 1em
- 하지만 16px는 너무 커서 12px를 주로 사용하며 0.75em 정도됨.
- 폰트의 크기를 지정할 때는 px 보다 em을 사용하여 사용자 환경에 대비할 수 있도록 해야 함.

* CSS의 vendor prefix
- 표준으로 받아 들여지기 전 각 Browser 벤더들이 정하여 사용하고 있는 스타일을 구분
- 형식: -[벤더 prefix]-
--> -ms- : Internet Explorer
--> -o- : Opera 계열
--> -webkit- : WebKit 엔진 이용. Chrome, Safari
--> -moz- : 모질라 계열. FireFox
- 표준으로 받아 들여진 경우 vendor prefix를 쓸 필요 없지만, Browser에 따라 구현 여부가 다르기 때문에 써 주는 것이 좋다.

* Flash 대체 기술
- canvas
- svg
- css3: 다음 세가지 이용 가능
--> transition
--> transform: rotate, scale,skew, translate
--> animation

* <table> --> <theader> <tbody> <tfooter>로 구분됨. 별도로 지정하지 않으면 <tbody>가 추가되어 입력된 내용 포함된.

* JavaScript에서 false인 것들: 0, '', NaN, null, undefined

* checkbox, radio --> name 속성이 같으면 같은 그룹으로 묶임

* boolean 속성: <input type='checkbox' checked ...>에서 checked같이 단독으로 쓰이는 애들을 말함. 즉, 값이 따로 지정되지 않으며, 속성값을 쓰면 true, 않쓰면 false임. HTML에서는 가능하지만 XML에서는오류이기 때문에 호환성을 위하여 checked='checked'와 같이 사용할 수 있음.

* JavaScript의 유사 배열 객체
- 배열의 성격을 가지고 있는 객체.
- document.querySelectorAll()의 반환 객체가 대표적임.
- 배열과는 다름. 배열인지 유사 배열 객체인지를 확인하려면 Array.isArray(object) 이용. true면 배열, 아니면 객체.
- 객체이기 때문에 for-in을 사용하면 (값이 아니라) 전체 속성값을 순회하게 됨.
- 따라서, 유사 배열 객체는 값을 순회하기 위하여 for-in을 사용할 수 없음.
- obj.length와 obj[index]을 이용해야 함.

* form의 필수 속성
- action: Action을 취할 대상 URL 지정. 지정하지 않으면 현재 page URL로 인식됨.
- method: 값 전달 방식 지정. get, post.

* default event 객체
- <a>, <form> 등에서 따로 지정하지 않아도 자동으로 실행되는 event 처리 루틴.
- 이를 무시하는 방법:
--> 핸들러 함수에서 false를 반환. 하지만 addEventListener()로 추가된 이벤트 핸들러는 안됨. 이 경우는 다음 방법을 이용.
--> function handler(event) 와 같이핸들러 함수 지정 후, event.preventDefault(); 호출


저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No