재사용할 수 있고 캡슐화된 위젯을 위한 새로운 웹 규격 모음인 웹 컴포넌트를 브라우저에서 지원하려고 합니다. 웹 컴포넌트 위에 만들어진 웹을 위한 새로운 타입의 라이브러리인 Polymer와 현대적인 웹 개발을 위한 새로운 구조화된 언어이자 라이브러리인 Dart 덕분에, 스타일(style) 및 구조(structure)와 행동(behavior)을 캡슐화하는 커스텀 HTML 요소(custom HTML element)를 만들 수 있습니다.
개인적으로 저는 Polymer의 Dart 포트인 Polymer.dart의 팬입니다. 자바스크립트를 사용하고 싶다면 일부 세부 사항은 다르지만, 본래의 Polymer 라이브러리를 사용할 수 있습니다. Polymer와 Polymer.dart 모두 개발이 매우 활발하게 진행되고 있으며, 이 프로젝트에 참여하는 개발자들은 피드백을 기대하고 있습니다.
이 글에서는 간단한 자동 완성(auto-complete) 위젯을 커스텀 요소로서 생성하는 방법을 보여드립니다. 사용자가 필드(field)에 입력하면, 그 값을 접두사(prefix)로 하는 목록이 검색됩니다. 사용자는 더 정확하게 일치시키기 위해 계속 입력하거나 위아래를 이용하여 선택하거나, 혹은 마우스를 사용할 수 있습니다.
시작하기 위해 Dart 에디터를 사용하는 것을 추천합니다. 맥, 리눅스, 윈도우 용으로 내려받을 수 있습니다. 콘텐츠를 생성하지 않은 새로운 프로젝트를 만드세요.
Polymer.dart 패키지를 내려받고 설치하기 위해 pub 패키지 매니저를 사용하세요. (술집(pub)에서 다트(darts) 놀이를 하기 때문입니다!) 다음 콘텐츠를 담은 pubspec.yaml 파일을 새로운 프로젝트에 생성하세요.
name: my_autocomplete_demo
description: A fun demo of polymer.dart.
dependencies:
polymer: any
pubspec.yaml 파일을 저장할 때, Dart 에디터는 추이 종속성(transitive dependencies, 역자주: 어떤 의존성을 사용하려면 반드시 같이 추가돼야 하는 의존성)을 따르며 pubspec.yaml에서 선언한 패키지를 설치합니다. pubspec.yaml을 처음 저장할 때, 새로운 packages 폴더가 프로젝트에 나타납니다.
커스텀 요소를 위한 HTML 생성
종속성을 가지는 것들(dependencies)이 설치되면, 커스텀 요소를 만들 때입니다. 프로젝트에 web 디렉터리를 생성하고, web 안에 auto_complete.html 파일을 생성하세요. 바로 이 부분입니다!
새로운 HTML 태그를 정의하는 데 HTML을 사용한 것입니다. auto_complete.html 안에 auto-complete 태그를 선언하세요.
팁: 커스텀 요소는 이름에 대시(-)를 포함해야 합니다.
커스텀 요소를 다른 HTML 태그로부터 만들 수도 있습니다. auto-complete 요소 내부 구조를 정의하기 위해 태그를 사용하세요. 이 내부 구조는 일반적으로 페이지의 메인 DOM에는 숨겨지는데, Shadow DOM이라는 새로운 웹 규격 덕분입니다. 커스텀 요소의 구조를 위한 진정한 캡슐화입니다!
참고: Shadow DOM은 이 글의 범위를 넘어서는 깊이 있는 주제입니다. 집중할 준비가 되었을 때, Shadow DOM 101을 확인해보세요.
auto-complete를 위해 다음의 템플릿(template)을 추가하세요.
Polymer는 데이터 바인딩(data binding)을 설정하기 위해 {{와 }}를 찾습니다. 사용자가 입력 필드에 입력할 때, 해당 Polymer 요소를 뒷받침하는 데이터 모델에서의 검색 속성도 업데이트됩니다. 이 코드가 검색 속성을 업데이트한 적이 있다면, 입력 필드 값도 변합니다. 페이지에서 요소를 찾거나 이벤트 리스너 및 다른 지루한 작업을 연결할 필요가 없습니다. Polymer가 도와줍니다.
Polymer 요소도 이벤트 핸들러를 선언할 수 있습니다. 앞의 코드에서 keyup 메소드는 입력 필드에 key-up 이벤트가 발생하면 실행됩니다.
Dart 클래스 생성하기
검색 속성과 keyup 메소드는 이 커스텀 요소를 뒷받침하는 Dart 클래스 안에서 정의됩니다. auto-complete 태그의 각 인스턴스는 AutoCompleteElement 클래스 인스턴스를 얻습니다. 이제 Dart 클래스를 생성해 봅시다.
web 디렉터리 내에, auto_complete.dart라는 새로운 파일을 생성하세요. 초기 콘텐츠는 이렇습니다.
import "package:polymer/polymer.dart";
import "dart:html";
@CustomTag("auto-complete")
class AutoCompleteElement extends PolymerElement with ObservableMixin {
@observable String search;
keyup(KeyboardEvent e, var detail, Node target) {
// ...
}
}
Dart 코드는 자바스크립트, 자바, C#, C++, 액션스크립트 3 등에 배경지식을 가진 개발자들에게 익숙합니다. 간단히 살펴봅니다.
import - Dart 라이브러리를 불러옵니다. 어떤 라이브러리는 패키지로부터 오고, 다른 것들은 Dart SDK에서 생성돼 오며, 다른 라이브러리는 단순히 URI로 찾을 수 있습니다.
class - 클래스를 생성합니다. Dart는 객체 지향, 클래스 기반, 단일 상속 언어입니다.
with - mixin을 적용합니다. Dart는 상속 구조를 방해하지 않고 클래스에 기능을 도입하는 방법인 mixin을 지원합니다.
@CustomTag - 메타데이터 주석(annotation). 특별히 이 클래스를 auto-complete 커스텀 요소에 바인딩하는 데 사용됐습니다.
@observable - Polymer.dart에 알려서, 이 필드의 변화를 살펴보고 데이터 바인딩을 통해 계속 동기화하도록 합니다.
keyup - 클래스 메소드
var - 동적이거나 "알려지지 않은(unknown)" 타입을 위한 축약. Dart는 선택적으로 타입화된 언어입니다. 메소드 파라메터가 하나의 타입보다 많으면 var를 사용하세요.
Dart 클래스 속성은 데이터 바인딩 표현을 위한 범위 안에 있습니다. auto-complete.dart에서 검색(search)은 auto_complete.html 파일의 {{search}}와 같습니다.
Dart 클래스에 커스텀 요소 HTML 연결하기
에 Dart 클래스를 연결하기 위해
애플리케이션 HTML 생성하기
index.html 페이지가 "앱"이며, 이는 그 요소를 불러오고(import) 사용합니다. index 페이지는 Polymer.dart를 위한 초기화 혹은 부트스트랩 코드에도 책임이 있습니다.
HTML 문서를 다른 HTML 문서에서 포함하고 재사용하기 위한 새로운 규격인 HTML imports로 커스텀 요소를 재사용할 수 있습니다.
이 완전한 애플리케이션은 보이는 결과에서, 위아래 방향의 키보드 내비게이션 뿐만 아니라 엔터를 눌러 옵션을 선택하는 것을 지원합니다.
요약
자동완성 검색을 실행하는 커스텀 요소를 만들기 위해 Polymer.dart를 사용하는 방법을 살펴보았습니다. 를 사용해, 요소의 구조를 정의하고 이를 지원하는 Dart 클래스와 데이터 바인딩을 하고 이벤트 핸들러를 선언했습니다. 또한, 조건절과 루프를 위해 태그를 사용했습니다. Dart 클래스를 생성하여, 검색 기능을 구현하고 검색 옵션과 검색어를 저장했습니다.
Web Components는 웹앱을 개발하는 방법에 혁신을 가져오기 위한 것입니다. 생겨나는 웹 표준의 지원을 받아 진정한 캡슐화와 재사용성을 얻습니다. 브라우저가 Web Components를 구현하기를 기다리지 마세요. Polymer와 Dart로 오늘 해보세요.