원문 : https://morioh.com/p/6d422fc49bd2

웹 언어인 HTML은 가장 잘 알려진 웹 기술 중 하나입니다. HTML은 도입된 이후로 인터넷을 구축하기 위해 지속적으로 사용되고 있습니다.

많은 새로운 기술들이 웹사이트 생성 프로세스를 보다 간단하고 효율적으로 만들었지만, HTML은 그 중에 항상 핵심이었습니다.

HTML5는 2014년에 나왔습니다. 하이퍼텍스트 마크업 언어의 표준화를 향한 또 다른 단계였습니다. 2014년 10월에 개정된 HTML 사양은 합리적이었습니다.

사람들은 이제 또 다른 업그레이드를 기다리고 있는데, 무엇일까요? 바로 HTML6가 오고 있습니다.

WHATWG - HTML 사양을 규제하는 기관은 HTML 사양을 한 번에 광범위하게 변경하지 않고, 천천히 시간이 지남에 따라 지속적으로 변경하고 있습니다. (출처에서 알 수 있듯이)

이 아티클에서는 HTML6의 새로운 점과 가장 많이 바뀔 사항들을 살펴보겠습니다.

 

목차

  • 익스프레스 태그 (Express Tags)

  • 기본 모달 지원 (Native Modals Support)

  • 자유로운 이미지 크기 조정 (Freedom to Resize Image)

  • HTML6 전용 라이브러리 (HTML6 Dedicated Libraries)

  • 이미지 및 비디오에 대한 주석 (Annotations for Images and Videos)

  • 인증 향상 (Authentication Enhancement)

  • HTML6의 사용자 메뉴 (Customized Menus in HTML6)

  • HTML6 통합 카메라 (HTML6 Integrated Camera)

  • 유용한 마이크로포맷 (Good Microformats)

  • 자바스크립트 없는 단일 페이지 애플리케이션 (Single-Page Apps without JavaScript)

  • 결론

익스프레스 태그 (Express Tags)

이름에서 유추할 수 있듯이, 이 태그는 표현식으로 쓰입니다. 웹 페이지의 로고와 같은 태그를 사용할 수 있습니다.

또한 , , 와 같은 태그를 사용할 수 있습니다.

기본 모달 지원 (Native Modals Support)

dialog 요소는 HTML6에서 사용합니다. 이 요소는 자바스크립트 기반의 모달 창과 동등한 것으로 간주됩니다.

dialog 요소는 이미 표준화 되었지만, 크롬과 삼성 인터넷 브라우저와 같은 일부 브라우저에서만 완벽히 지원합니다. 그렇더라도 곧 모든 브라우저에서 작동할 것입니다.

기본 포맷으로 된 해당 요소는 배치된 위치 위로 띄어서 노출될 것입니다.

보다 일반적인 모달과 같은 인터페이스를 사용하려면, 자바스크립트를 통해 모달 메서드를 열 수 있습니다.

<dialog>
  <form method="dialog">
    <input type="submit" value="Ok" />
    <input type="submit" value="Cancel" />
  </form>
</dialog>

기본 양식에서 요소는 비대화형인 컨텐츠가 포함된 회색 배경을 만듭니다.

dialog 요소 내의 양식에서 메소드 속성을 사용할 수 있습니다. 이것은 값을 제출하고 값을 다시 대화 상자 객체로 전달합니다.

전반적으로, 이 dialog 요소는 사용자와의 상호작용 및 UI 향상에 유리합니다.

표준 HTML 형식으로 open 속성을 토글시켜 dialog 요소를 열고 닫을 수 있습니다.

<dialog open>
  <p>Dialog Box Built with HTML 6</p>
</dialog>

자유로운 이미지 크기 조정 (Freedom to Resize Image)

전문가들은 브라우저가 최상의 뷰 환경을 위해 이미지 크기를 조정할 수 있는 업데이트가 진행되고 있다고 생각합니다.

브라우저는 장치 및 윈도우 창 크기에 따른 최상의 이미지 크기를 표시하기가 어렵습니다.

src 및 img 태그는 이 문제를 처리하는데 그다지 효율적이지 않습니다. 새로운 태그 <srcset>를 사용하면 가능할 것입니다.

이 태그를 사용하면 브라우저에서 최상의 뷰를 보여주기 위해 둘 이상의 이미지 중에서 하나를 선택할 수 있습니다.

HTML6 전용 라이브러리 (HTML6 Dedicated Libraries)

HTML6에 캐시 가능한 라이브러리를 도입하는 것은 웹 디자이너와 사용자의 생산성을 향상시키는 단계가 될 것입니다.

이미지 및 비디오에 대한 주석 (Annotations for Images and Videos)

HTML로 이미지와 비디오에 주석을 달 수 있다면 좋을 것입니다. HTML5는 이미지, 비디오가 아닌 단어, 문장 및 단락을 해석 할 수있는 기능을 제공합니다.

이 분야의 많은 조직들이 솔루션을 제공했으며 WHATWG가 적어도 일부를 고려한 것처럼 보입니다.

곧 HTML에서 이미지와 동영상에 주석을 달 수 있을것입니다.

인증 향상 (Authentication Enhancement)

HTML5는 보안 측면에서 나쁘지 않지만, 브라우저와 웹 기술도 합리적인 보호 기능을 제공합니다. 의심 할 여지 없이 인증 및 보안 영역에서 더 많은 작업을 수행할 수 있습니다.

키는 오프라인 사이트에 저장할 수 있습니다. 이것은 권한이 없는 사람들의 접근을 막고 인증을 강화합니다. 쿠키 대신 내장되어 있는 키 사용, 디지털 서명 개선 등등

사람들과 싱크 탱크는 WHATWG가 수락하거나 거부 할 수있는 많은 솔루션을 제공합니다.

HTML6의 사용자 메뉴 (Customized Menus in HTML6)

The UL and OL tags are beneficial but do not fit well in every need. A tag or menu tag that could handle interactive elements better is the need of the hour.

<ul><ol> 태그는 유용하지만 모든 상황에 적합하지는 않습니다. 대화형 요소를 보다 잘 처리할 수있는 태그 혹은 <menu> 태그는 시간이 좀 더 필요합니다.

<menu> 요소는 메뉴 내부의 버튼으로 트리거 된 목록 요소를 처리 할 수 있습니다.

<menu type="toolbar">
  <li><button>Cut</button></li>
  <li><button>Copy</button></li>
  <li><button>Paste</button></li>
</menu>

이 메뉴는 HTML에서 목록의 기능을 향상시킬 수 있으며 일반적인 목록과 마찬가지로 잘 작동 할 수 있습니다.

HTML6 통합 카메라 (HTML6 Integrated Camera)

HTML6을 사용하면 사용자 기기에서 카메라와 미디어를 최대한 활용할 수 있습니다. 카메라 및 카메라의 효과, 모드, 파노라마 이미지, HDR 등을 제어할 수 있습니다.

모든 미디어를 사용하고 용도를 변경할 수 있습니다. 카메라와 HTML6으로 더 나아질 수있는 것들이 많이 있습니다.

유용한 마이크로포맷 (Good Microformats)

인터넷에서 일반적인 정보를 정의해야하는 경우가 많습니다. 일반정보는 전화번호, 이름, 주소 등과 같은 공개정보일 수 있습니다. 마이크로포맷은 일반 데이터를 정의할 수 있는 표준입니다.

마이크로포맷은 디자이너의 능력을 향상시키고 공개 정보를 추론하는데 필요한 검색 엔진의 노력을 줄일 수 있습니다.

자바스크립트 없는 단일 페이지 애플리케이션 (Single-Page Apps without JavaScript)

FutureClaw 잡지의 편집장인 Bobby Mozumder 는 다음과 같이 제안합니다.

앵커 요소를 JSON / XML, API 엔드 포인트에 연결하여 브라우저가 내부적으로 데이터를 새로운 데이터 구조로 로드하면,
브라우저는 DOM 요소를 필요에 따라 로드된 데이터로 바꿉니다. 
초기 데이터(및 표준 오류 응답)는 헤더 픽스처에 있을 수 있으며 원하는 경우 나중에 교체 할 수 있습니다.

그에 따르면, 이것은 자바스크립트를 로드 할 필요가 없기 때문에 응답성과 로딩 시간을 향상시키는 단일 페이지 앱 웹 디자인 패턴입니다.

결론

HTML도 완벽하지는 않습니다. 그러므로 HTML 사양을 개선 할 수 있는 사항들은 많이 있습니다.

HTML의 힘을 향상시키기 위해 몇 가지 유용한 규범들을 표준화해야 합니다. 작은 변화들은 이미 실행되기 시작했습니다.

기술 전문가들이 말하는 것을 고려하고 또한 일반 대중들의 의견을 듣는 것이 하나의 아이디어를 제공할 수 있습니다.

블루투스 지원 강화, p2p 파일 전송, 멀웨어 방지, 클라우드 스토리지 통합 등은 HTML의 다음 버전에서 고려해야 할 사항들입니다.

이것은 미래를 위한 것입니다. 그러나 이미 소개된 업데이트도 있고, 조만간 발표될 가능성이 가장 높은 반면, 단순한 예측에 불과한 업데이트도 있습니다.

이 기사가 당신이 HTML6에 대한 통찰력을 얻는데 도움이 되기를 바랍니다.

for과 for-in 패턴.md

이 글은 "JavaScript Patterns" 책을 공부하며 요약해 쓴 글입니다.


for

for 루프는 배열, arguments, HTMLCollection 등 배열과 비슷한 객체를 순회한다.

 

*HTMLCollection: HTML 요소들의 리스트로 유사배열객체이다.

 

 

일반적인 for 문

 

이 패턴은 루프 순회시마다 arr의 length에 접근한다.

 

만약 arr이 배열이 아닌 HTMLCollection이라면 코드가 느려질 수 있다.

  • 실제 DOM의 접근 비용은 일반적으로 크다.
  • HTMLCollection 객체의 length 속성 접근은 실제 DOM에 질의를 요청하는 것과 같다.
  • 실제 DOM 질의는 실시간으로 처리된다. 브라우저는 DOM 조작이 일어나면 다시 브라우저에 렌더링하는데에 수 많은 처리 과정을 거치는데, 이는 많은 비용이 요구된다. (reflow를 참고)

arr.length의 값이 10000이라면 브라우저를 10000번 렌더링하는 것과 같다.

 

여러 최적화 방법들

 

1. 배열(또는 콜렉션)의 length를 캐시
 

HTMLCollection 객체의 length 값을 초기화 변수에 저장하여 한 번의 DOM 접근만이 이루어진다.

 

2. 변수 갯수 줄이기, 배열을 거꾸로 순회
 

length 변수를 없애고, 배열의 카운트를 감소시켜 0으로 내려간다. (미세 최적화)

  • 0과 비교하는 것이 배열의 length 또는 0이 아닌 값과 비교하는 것보다 대게 더 빠르다.
  • 성능이 결정적인 요소가 되는 작업에서 사용하는 것을 권장

for-in

for-in 루프는 배열이 아닌 객체를 순회할 때 사용해야 한다.

  • 자바스크립트의 배열은 객체이기 때문에 for-in 루프를 통해 순회할 수 있지만, 권장사항이 아니다.
  • 배열 객체에 사용자가 정의한 기능이 추가되면 논리적인 오류가 발생할 수 있다.
  • 열거 순서가 정해져있지 않다. 실제로 배열은 for-in이 아닌 for 루프로 순회하는 것이 좀 더 빠르다.
 

 

일어날 수 있는 오류 피하기

코드 내에 'Object.prototype.메서드명'이라는 사용자가 지정한 메서드가 모든 객체에 추가되었다고 가정하자.

이 메서드 프로퍼티는 프로토타입 체인을 따라 상속되어 모든 객체의 프로퍼티로 사용할 수 있게 된다.

이 문제로 인해 어떤 객체가 for-in 루프로 순회하는 과정에서 의도치 않게 메서드가 사용될 수 있다.

ex)

 

 

1. hasOwnProperty() 사용

Object의 hasOwnProperty 메서드를 사용하여 객체 변수의 고유 프로퍼티만을 사용할 수 있다.

 

 

2. Object.prototype.hasOwnProperty.call() 사용

이 패턴은 만약 fruits 객체의 hasOwnProperty 메서드를 오버라이딩 했을 경우에도, 온전한 hasOwnProperty 메서드를 사용할 수 있게 해준다.

 

 

3. Object.prototype.hasOwnProperty 캐시

프로퍼티 탐색이 체인을 따라 Object까지 거슬러 올라가지 않게 하기 위해, 지역 변수를 사용하여 메서드를 캐시한다.

 

 

hasOwnProperty()를 사용하지 않았다고 해서 오류가 발생하지는 않으며, 루프 속도가 약간 감소될 수 있지만, 객체와 객체 프로토타입 체인의 내용을 보장할 수 없다면 hasOwnProperty()로 확인하는 것이 좀 더 안전한 방법이다.

about-objects.md

Ruby koans의 about_objects.rb를 정리한 내용


is_a

 

인수의 클래스가 오브젝트의 클래스이거나 부모 클래스의 오브젝트 중 하나 혹은 모듈이 오브젝트에 속해 있으면 true를 반환한다.

=> 위의 예제는 Integer, Float, String, nil, Object 모두 Object 클래스를 부모 클래스로 가지고 있으므로 true를 반환한다.

 

to_s

 

to_s는 어떤 오브젝트든 문자열로 표현할 수 있는 메서드이다.

=> 위의 예제는 숫자 123(Integer)을 문자열 "123"로, nil("아무것도 없음"을 의미, nothing)을 문자열 ""로 변환한다.

 

inspect

 

inspect는 to_s처럼 오브젝트를 문자열로 변환한다. 하지만 차이점이 있다.

to_s는 오브젝트의 내용 자체를 문자열 변환하며, 객체 클래스의 경우 obejct_id를 문자열로 변환한다.

반면, inspect는 객체에 기록된 내용을 지정된 형식의 문자열 형태로 변환한다. 즉, 개발자가 디버깅하는데에 좀 더 친숙한 문자열 형태로 반환해준다.

ex) inspect user obj

 

=> 위의 예제에서 nil.inspect의 경우는 개발자가 읽기 쉬운 형태로 값을 변환해주기 때문에 nil을 문자열 형태로 변환하여 표현한다.

 

obj.object_id.class ==? Fixnum

 

Ruby의 Fixnum은 'Lisp'에서 온 것으로 32bit(in VM)의 고정된 정수 값을 나타낸다. 정수 값의 범위는 -((2^30)-1)에서 (2^30)-1로 -1073741824에서 1073741824의 정수를 표현한다. (그 외의 작고 큰 정수 값은 Bignum으로 표현한다.)

ex)

 

=> 위의 예제에서 object_id는 일반적으로 Fixnum이 표현할 수 있는 범위 내의 정수 값을 할당받게 되므로 object_id의 클래스명은 Fixnum이다.

 

object has different id

 

모든 객체 인스턴스는 자신을 유일하게 식별할 수 있는 고유한 object_id를 갖는다. 여기서 object_id는 정수(Interger) 값으로 표현한다. 고유한 정수 값이기 때문에 메모리 주소 값을 할당 받는다고 생각할 수 있다.

=> 위의 예제에서 obj와 another_obj 객체 인스턴스는 생성될 때 서로 다른 object_id를 갖기 때문에 not 비교문에서 true를 반환한다.

 

object_id pattern for small integers

 

위의 몇 가지 예제를 통해 객체 인스턴스는 고유한 obejct_id를 갖고 Fixnum을 통한 정수 값을 할당받는다고 설명했다. 그렇다면 true, false, nil과 같이 항상 같은 값을 갖는 오브젝트들은 어떻게 object_id 값을 설정할까? 또한 Fixnum 범위 내에서 정수(Integer)의 object_id 값은 어떻게 설정할까?

이렇게 객체 인스턴스뿐만 아니라 고정 오브젝트 타입의 obejct_id 값들을 설정하기 위해 bit pattern을 사용했다. (여러 참고 문서를 통한 추측일뿐 확실한 정보는 아님)

object_id는 "(Fixnum * 2) + 1"의 연산 결과값이 할당된다.

아래의 예제를 보면, Ruby에서 false는 값을 0으로 하드코딩한 것이 아니라 상단의 비트패턴 연산을 사용하여 값을 구한 것을 알 수 있다.

ex)

 

그러면 (Fixnum * 2) + 1의 비트 연산 과정을 자세히 살펴보자.

먼저 Fixnum은 32bit를 사용한다고 했다. 여기서 흥미로운 점은 만약 Fixnum의 마지막 비트가 0인 경우에는 31bit만을 사용하고, Fixnum의 마지막 비트가 1인 경우 32bit 모두를 사용한다.

아래는 정수 4와 5의 비트연산 예제이다.

ex) object_id of 4

 

ex) object_id of 5

 

이러한 계산 방식에는 2 가지의 부작용이 있다.

첫 번째로 위의 Fixnum 연산은 마지막에 1을 추가하므로 모든 Fixnum object_id는 홀수이다. 이를 통해 시스템에 다른 모든 객체의 object_id는 짝수라는 것을 알 수 있다.

두 번째로 홀수 Fixnum만이 Fixnum object_id로 사용된다. Fixnum 절반이 Fixnum object_id로 채워져 있고 나머지 절반에 다른 object_id를 채워넣어야 하는데, 다른 모든 obejct_id가 너무 커서 31비트에 들어가지 않는다는 것이다. 만약 시스템이 짝수 Fixnum 공간에 충분한 객체들을 인스턴스화 하는데에 써버린다면, 일반 객체의 object_id는 Bignum을 얻게 된다.

 

clone object

 

obj.clone을 사용하면 인스턴스 객체의 복사본을 생성할 수 있다.

일반적으로 객체는 주소값을 참조하기 때문에 코드 범위내에서 값을 공유한다. 객체의 값을 수정하면 같은 변수명을 가진 객체의 값 또한 변경된다.

하지만 객체의 복사본을 생성하면 서로 다른 주소값(object_id)을 할당 받기 때문에 값이 공유될 수 없으며 서로 다른 객체로 인식한다.

=> 그러므로 위의 예제의 비교문들은 true를 반환한다.


참고 자료

+ Recent posts