posts list

레이블이 자바인 게시물을 표시합니다. 모든 게시물 표시
레이블이 자바인 게시물을 표시합니다. 모든 게시물 표시

2014년 8월 25일 월요일

웹 개발 방법론의 변화/자바스크립트의 재발견, 2013


* 이번에는 자바스크립트에서 중요한 개념인 closure가 끝났으니 잠깐 쉬어가는 글로 다양한 웹 개발 방법론들에 대해서 써보려고 한다. 어렸을 때 부터 html은 조금씩 만져왔었지만, 웹개발에 대하여 처음으로 제대로 경험하고 배운 2001년 이후부터, 그리고 이후에 2004년, 2007년, 2012년 그리고 현재 중간중간 잠깐잠깐 웹 개발을 해온 동안 바뀌어온 웹 개발의 방법론들에 대하여 정리를 할 것인데, 오래 웹 개발을 해온 사람들은 추억을 되새길 수 있을 것이고, 웹 개발을 최근에 시작한 사람들은 현재 자신의 웹 개발 방법이 어느 정도로 와있나 가늠할 수 있는 계기가 되면 좋을 것 같고, 이 글을 쓰는 진정한 목표이자 "속깊은 자바스크립트 강좌"의 한 편으로 쓰는 것은 바로 초기 웹부터 사용되었던 자바스크립트가 이제는 재발견되어야할 언어라는 점이다. 아무튼 이번에는 회사에서 세미나 발표도 한겸 같이 정리를 하는 것이니 부담 없이 재미로 한번 읽어보면 좋을 것 같다.

* 개인적인 경험에서 나온 의견들이 많이 있으므로 내용에 대한 지적을 많이 해주셔도 됩니다.

- 이전 글




* 웹 페이지의 변천사
: 일단 개발 방법론에 대하여 쓰기 전에 먼저 이번에는 웹 페이지의 변천사부터 한번 알아보고, 각 웹페이지에서 활용하던 언어라던가 개발 방법론에 대하여 언급을 해보자. 해외의 경향과 트렌드보다는 초기 웹에서부터 한국에서 진행되고 변화 되었던 웹 페이지의 트렌드와 각 상황에 다른 주요 이슈들에 대하여 먼저 알아보는 것이다.

- 이전의 웹의 모습을 살펴볼 때 www.archive.org 라는 사이트를 이용할 것이다. 여기서 과거 웹의 모습을 살펴보는 것도 추억을 떠올릴 수 있는 재미일 것이다.


위의 Web 섹션 아래에 주소를 치면 과거 수집되었던 기록들이 남아있다

* 초기 웹 (~2000년)
: 한국에 처음 웹이 소개된 것은 93년에 네트워크 컨퍼런스인 'KRnet 93' 중에 열린 '제1회 한국학술전산망워크숍'에서 포항공대의 이재용 교수에 의해서 소개되었다.  이때는 전세계적으로 웹에 대한 관심이 폭증하였지만 이 때 당시에는 아직 PC통신이 주류를 이루고 PPP(Point-to-Point Protocol)를 통해 사설 네트워크 업체에 연결하여 인터넷을 겨우 느린 속도로 접속을 하던 시대였다. 이때 당시만해도 웹에는 멀티미디어 같은건 전화비를 낭비하는, 야간 정액이 아니면 꿈도 못꾸는 그러한 시대였다. 이때에는 웹 개발자가 아니라 오로지 사용자로서 PC통신을 사용하던 때였는데, 36k 모뎀에서 54k 모뎀로 업그레이드 했을 때의 경이로움은 잊을 수가 없다. 각설하고, 이때에는 보시다시피 모뎀이 주류이고 전화선을 이용한 통신이 주류였기 때문에 다른 것보다도 정보를 보여주기 위한 최소의 텍스트를 포함하는 것이 미덕이었다. 초창기 웹 페이지들의 모습을 몇 군데 살펴보자.


                              Yahoo (1997)                                                   Altavista (2000)


hanmail.net (1999)

: 이미지는 정말로 필요한 로고 부분에만 사용하고 담백하게 전부다 텍스트로 이루어진 모습을 확인할 수 있다. 이러한 방법을 이용한 것은 트래픽의 감소도 있지만, 브라우져가 발전되어있지 않았기 때문에 아직 텍스트 위주의 인터넷 서핑이 많았기 때문이다. 당시에는 이미지를 랜더링 못해주는 텔넷 등과 같은 기능과 프로그램을 이용해서도 인터넷 서핑을 했기 때문에 텍스트가 중요하고 그것이 메인이 되었던 것이다. 따라서 HTML을 통해 순수한 텍스트(Document)를 보여주는 것이 목적이었다.

: 이 때 당시에는 사용자의 동적인 데이터를 받는 경우는 극히 드물었고, 정적인 정보를 제공해주는 웹 페이지가 주를 이루게 된다. 이렇게 정보를 제공하는 웹 페이지들이 많기 때문에 이러한 웹페이지들을 검색해주기 위한 사이트가 필요했고, 그것이 위의 Yahoo라던가 Altavista와 같은 정보 검색 사이트였다. 이러한 정보 검색 사이트는 초창기 포탈의 개념으로 당시에는 여러 정보를 제공해주기 보다는 검색해서 다른 사이트로 라우팅 시켜주는 개념이었다.


* 초기 웹 개발 방법론
: 초기 웹에서는 정적인 데이터가 주를 이뤘지만  동적인 페이지를 생성하는 서버 언어 또한 존재 했다. 당시 가장 많이 활용 되었던 언어는 Perl 그리고 C였고, 이들을 이용한 CGI (Common Gateway Interface)가 동적인 데이터 제공에 이용된다. 이전 웹페이지들 주소를 보면 중간이 /cgi-bin/ 이렇게 들어있는 웹페이지들은 어김없이 CGI를 사용하고 있는 것이다. C를 이용한 아주 간단한 소스의 예를 들어보면 다음과 같다.

              C 언어 + CGI로 구현한 count 소스                                 초기 웹의 구성

: 인터넷에 실제로 올라와있는 예제를 가져왔는데, 이제부터 확인할 것은 붉은 색으로 해 놓은 태그들의 위치이다. 이 때에는 html도 C 언어 내부에서 생성되기 때문에 초기 정적인 html을 제외하고 모든 html 태그의 생성은 C나 Perl 안에서 이루어져 웹 서버를 통해 사용자에게 전해지게 된다. 이렇게 동적인 페이지의 html은 전부 C나 Perl에서 이루어지기 때문에 html과 cgi 파일은 위처럼 혼합되어 유지보수를 하려면 html과 C 또는 Perl을 반드시 같이 알아야만 했다. 이 때 당시에는 클라이언트측은 단순히 html 링크를 눌러서 페이지 요청을 하고 response 또한 html로 받아서 랜더링하는 것 밖에 하지 않아서 역할이 적었고, 정적인 정보를 제공하는 페이지가 많았으므로 위의 count.c의 예 처럼 파일을 이용하는 정도로 충분히 사이트의 정보들을 감당할 수 있었기 때문에 DB도 적극적으로 활용되지 않았다. 대신 웹서버에서 cgi까지 감당했기 때문에 모든 데이터 처리는 웹서버에 의존하기 때문에 웹서버의 역할이 아주 컸고, 클라이언트와 데이터베이스(파일시스템)의 역할은 아주 작았다.


* 웹 언어의 활성화 (~2001년)
: 고속 인터넷이 보급되기 시작하면서 웹은 정적인 데이터와 텍스트에서 벗어나 다양한 미디어들과 융합하고 사용자와의 상호작용도 하기 시작했다. 2000년에 마시마로(http://www.mashimaro.com/), 졸라맨(http://www.dkunny.com/) 등과 같은 플래시 애니메이션들도 나오기 시작하면서 플래시에 대한 집중이 시작되었고, 나중에는 거의 모든 사이트에 필수적인 요소로 들어가게 되기도 했다. 거기다 최근에는 플래시를 이용한 다양한 게임들까지 나오면서 플래시의 활용은 대단했다. 이 때부터는 이전의 투박했던 정적인 텍스트에서 벗어나 이쁜, 감성적인 그러한 홈페이지들이 각광을 받으면서 플래시의 사용과 함께 웹 디자이너 또한 새롭게 집중을 받게 된다.

이러한 플래시로 이루어진 서브 풀다운 메뉴는 기본이 되었다.

: 이렇게 플래시가 새롭게 주목을 받으면서 이 때부터는 더이상 홈페이지는 '웹마스터' 혼자서 만들고 관리하는 것이 아니라, 클라이언트 개발자, 서버 개발자, 그리고 웹디자이너 3박자가 이루어져야만 제대로된 홈페이지를 만들 수 있게 된 것이다. 그리고 이러한 플래시를 통한 rich media와 함께 사용자들 간의 커뮤니케이션이 집중이 되면서 프리첼 커뮤니티나 네이버의 지식인이 전성기를 맞이하게 된다.

              2001년 네이버의 모습                                             2002년 프리첼의 모습

: 이후 프리첼은 전성기를 구가하다가 유료화라는 결단에 무너지게 되고 네이버는 지식인을 필두로 내세우고 개인 블로그로 싸이월드와 양강 체계가 구축된다. 사용자들은 플래시, ActiveX 등을 통해 배경음이 나오는 등  좀더 풍부한 인터랙티브한 웹페이지들을 접하고 개인 단위의 블로그/싸이월드가 유행을 하게 되고, 이 당시의 인터넷 격변을 일으켰고 현재는 대형 포털이 된 사이트들이 사용자들의 커뮤니케이션을 활성화 시키면서 수 많은 사용자들을 유입시켜 몸집을 부풀릴 수 있게 된 것이다.


* 웹 언어의 개발방법론 (~2001년)
: 이렇게 미디어 컨텐츠쪽은 플래시가 주목을 받았다면, 웹 페이지 자체는 웹 언어가 급격히 활발하게 활성화하기 시작한다. ASP, JSP, PHP가 대표적인 언어로 퍼져나갔고, 이제는 슈퍼보드(CGI 기반)라던가 제로보드(PHP 기반)와 같은 게시판 프레임워크도 나오면서 인터넷은 사용자들간의 커뮤니케이션의 장이 되었다. 많은 사용자들이 시도때도 없이 계속 글을 쓰고 그러다보니 사용자들의 다양한 입력들을 효율적으로 저장하고 관리해야 하는것이 중요한 위치를 차지하게 되고, 이제는 웹 언어와 묶어서 다양한 데이터베이스들이 활용되기 시작한다. 이때의 개발 방법은 php파일에다가 html과 php 소스를 묶어서 처리를 하는 방식이었다. 아래와 같이 간단한 예가 있다.



: 이렇게 페이지를 구성하게 되면 다른 것보다도 웹 프로그래밍을 처음 접하는 사람들은 웹언어가 실행되는 순간과 스크립트 언어가 실행되는 순간에 대하여 엄청 헷갈려하기도 하고 위의 빨간 네모 안에 있는 HTML과 PHP 소스가 뒤엉켜있는 경우 혼란스러움이 생기게 된다. 이런식으로 HTML 태그와 PHP소스가 섞여 있는 것은 그래도 양호한 편이다. 만약 자바스크립트와 PHP소스가 엉켜있다고 하면 그것을 개발한 개발자 본인 조차도 일주일이 지나면 그것을 한참 들여다보고 있어야할지도 모르는 상황이 되어버린다. 이러한 상황들로 인해 웹언어가 나오면서 가장 문제가 많았던 것은 바로 '유지보수'였다. 하지만 웹 프로그래밍이라하면 누구나 할 수 있는 쉬운 프로그래밍이 아닌가! 그러니 이 때 당시에 웹페이지에 대한 유지보수는 필요없고 그냥 새로 만들면 그만이었다. 때마침 웹언어가 유행을 하면서 누구나 쉽게 웹 개발을 할 수 있다는 것에 너도나도 전부다 뛰어들어 웹 프로그래밍을 공부하기 시작한것이고, 기존 웹페이지에 대한 유지보수가 안 되기 때문에 웹개발을 하게 되는 그 수요 또한 많아서 잘 돌아가는듯 했다. 하지만 이내 곧 구글에 의해 웹페이지의 대격변을 일으킨 개념이 '제대로' 소개된다.

- 덧: 웹언어들은 웹프로그래밍이 누구나 할 수 있는 쉬운 인식을 심어주기도 했지만, 그 무엇보다도 가장 큰 역할을 한 것은 바로 MVC 모델을 초보 프로그래머들도 쉽게 실용적으로 배울 수 있는 실제적인 환경이 되어 주었다는 것이 전체적인 프로그래밍 개발 방법론과 프로그래머들의 지식 향상에 엄청난 발전을 도와주기도 했다.


* AJAX: Asynchronous Javascript And XML (~2006년)
: AJAX는 지금도 흔히 쓰이고 있는 단어로 자바스크립트를 이용해서 비동기적으로 HTTP Request를 서버로 보내는 기술이다. AJAX라는 말을 많이 들어봤겠지만 실제로는 무엇이 좋은지는 모르는 경우가 많다. 다른것보다도 AJAX의 가장 눈에 띄는 장점은 바로 적절한 활용으로 UX를 향상시킬 수 있다는 점이다. 이제는 웹페이지 자체가 새로고침을 안해도 페이지의 일부가 변하는 것은 일상이 되었지만, 이것이 처음 나왔을 때에는 새로운 개발 패러다임을 만들어 버린 충격 그 자체였다. 구글은 AJAX를 2004년 Gmail에서 처음 사용하였지만, 사실을 말하자면 Gmail은 ajax의 사용으로 충격 받았다기 보다는 당시 제일 흥했던 한메일 등은 몇백메가 수준의 메일 용량을 줬을 때 구글은 과감하게 기가 단위의 무료 메일을 준다는 것이 너무나 충격이었다. 하지만 그 다음해 2005년에 나왔던 구글맵은 이야기가 달랐다.

현재 모습의 구글 맵, 2005년에 처음 공개했다.

: 이때까지만 해도사이트를 만든다고 하면 일단 페이지의 목록부터 쭉 나열하고 그 흐름을 잘 짜는 것이 중요했다. 게시판만해도 list.php, write.php, write_ok.php, comment_ok.php 등과 같이 여러개의 웹 페이지가 있는 것은 당연한 것이었는데 구글맵은 하나의 페이지를 통해서 무려 이미지가 동적으로 변하는 모습을 보여준 것이다. 이것은 소스보기를 해보면 플래시인 것도 아니고 순수한 html과 자바스크립트로 이루어졌지만 페이지의 refresh 없이 이미지가 확대도 되고 자유자재로 변한다는 것이 상상할 수 없는 일이었다. 기존에 맵 서비스를 한다고 하면 만약 확대 버튼을 누르면 페이지가 하얗게 없어졌다가 확대된 모습을 보이고 조금 더 발전한 경우는 iframe으로 나름 페이지의 일부만 깜빡이게 하는 것 정도는 생각해봤지만 구글은 구글맵을 통해 AJAX를 화려하게 데뷔(?)시키게 된다.

- 덧: 사실 AJAX에서 사용하는 XMLHttpRequest는 이전부터 있었다. 이미 1997년 IE5에서부터 소개 되어 ActiveX의 객체 중 하나인 XMLHttp로 나왔고, 당시의 XMLHttp로 현재의 AJAX 기능들을 어느정도 구현할 수도 있다. 하지만 구글맵이 한 것은 AJAX를 본격적인 상용의 무대로 불러와 어떻게 사용해야하는지 그 예를 보여주면서 콜롬버스의 달걀을 세운 것이다.


* AJAX를 활용한 개발방법론
: 이제는 비동기적으로 소스를 처리하는 것이 가능해졌기 때문에 웹언어로 HTML 페이지 전체를 생성하는 것이 아니라 웹언어는 웹페이지의 일부만을 생성하고 AJAX를 통해 그 생성된 페이지 일부를 불러와서 현재 페이지에 심어주는 DHTML이 매우 유용하게 활용된다.


: 위와 같이 이제 이제 커다란 HTML의 틀은 기본 HTML 파일에 들어있고, 데이터를 이용한 동적인 HTML은 웹언어를 통해서 생성하게 된다. 이때 넘겨받는 것은 일부 HTML인데 AJAX라 하면 X가 XML의 철자로 결과를 XML에 맞춰서 넘겨주는 것이 좋을 것이라 생각하고 진행했던 것이 바로 XML 규격에 맞게 HTML을 설정하도록 정한 XHTML 표준화 작업이었다. 이때부터 웹표준, 웹 2.0등과 같은 다양한 말들이 엄청 유행하면서 모두의 관심을 받기도 했다.

: 여튼 위의 예제 소스처럼 웹 언어의 역할이 전체 페이지를 랜더링하던 것에서 다소 역할이 작아져 일부 HTML을 그려주는 역할로 바뀌게 된 것이고, 일부 HTML을 페이지에 그려넣기 위해 DHTML이 활용하기 시작하면서 이제는 자바스크립트도 어느 정도 역할을 하게 되어 클라이언트에서 사용자의 입력에 따라 AJAX 요청을 보내고 결과를 받아서 반영시키는게 된다. 이렇게 AJAX로 UX는 놀랍도록 발전했지만 소스의 예에서 보시다시피 아직 HTML을 웹언어에서 생성하기 때문에 HTML 태그가 양쪽에서 보관되거나 생성되어 HTML 자체를 유지보수하려면 양쪽 페이지를 봐야하는 불편함이 있었고, 여전히 유지보수는 어려운 문제가 있었다.


* 다양한 API들의 등장 (~2008년)
: AJAX 이후에는 또다른 논라운 일들이 일어나는데 web service라고 집중 받았던 흔히들 말하는 API들이 대중적으로 활용되기 시작한다. 대표적인 API라하면 역시 구글 API가 맵, 광고 등과 같이 적용하기 쉬운 API들이 있고, API 뿐만 아니라 이제는 웹개발을 도와주는 프레임워크들도 많이 나오게 된다. 대표적인 자바스크립트 프레임워크라하면 jquery라던가 Prototype도 있는데, 이들이 자바스크립트에 대한 재발견을 도와주는 가장 큰 역할을 한 프레임워크들이 아닌가 생각한다.


: 이렇게 이제는 웹 개발자들이 다른 개발자들을 위한 API나 프레임워크를 만들고 제공하게 되는 새로운 에코시스템이 점차적으로 등장하게 되고, 이제는 유지보수가 중요한 한가지의 관점이 되면서 소스를 효율적으로 관리해야만 하기 시작했다.


* 웹 어플리케이션의 발달 (~현재)
: API들이 다양하게 나오면서 이들을 이용한 다양한 복잡한 기능들을 하는 웹들이 나오면서 기존의 정보 제공 위주의 앱에서 발달하게 된다. 이제는 웹페이지에서 '웹 어플리케이션'이라는 말로 실제로 업무 프로세스라던가 복잡한 일들을 데스크탑 스탠드얼른 어플리케이션이 아닌 웹으로도 할 수 있을 정도로 웹이 발달하게 된다. 가장 대표적인 것으로 빠르게 발달했던 것은 바로 구글 docs일 것이다.


Google docs (Drive), 웹으로 슬라이드쇼도 만들 수 있다

: 하나의 웹 페이지에서 여러 사람이 동시에 하나 문서를 수정하는 것은 기존의 워드 문서 작업기로도 힘들었던 일인데 이제는 웹으로 그러한 기능을 구현한 것이다. 그럼 이제 이러한 웹 어플리케이션들과 API들이 활용하는 개발 방법을 알아보자.


* API들과 웹 어플리케이션들의 개발방법론
: 이제는 유지보수를 하기 위해 클라이언트와 서버사이에 떠다니는 것은 HTML이 아니고, 이제는 정보를 주고받기 시작했다. 처음에는 XML로 했으나, XML에는 태그에 들어가는 스트링의 크기가 만만치 않았기 때문에 일반 텍스트, CVS로 많이 주고 받았지만, 이제는 자바스크립트에서 바로 객체로 활용가능한 JSON규격으로 많이 주고 받게 되었다. 간단한 예는 아래와 같다.



: 이제 HTTP Response로 오는 것은 JSON이고, 서버에서 웹언어가 생성하는 것은 데이터베이스로부터 받은 데이터를 JSON으로 포매팅한 것이다. JSON을 클라이언트에서 받으면 그 데이터를 기반으로 자바스크립트로 직접 HTML을 그려주게 된다. 이제 웹언어에서 HTML은 실종되었고 php 같은 경우는 json_encode와 같은 함수가 5.3버전부터 나와 JSON에 대한 호환성을 높여주고 있다. 다양한 API들도 RESTful로 요청하게 되는 경우 JSON으로 결과를 보내주는 등 API들도 이제는 JSON을 통한 통신 방식이 많이 활성화 되어있는 실정이다.

: 하지만 만능은 없는 법. 이렇게 개발을 하게 된다면 HTML의 구조를 파악하기가 약간 불편한 점이 있다. 그리고 자바스크립트를 기존의 form validation 정도로만 사용했던 사람들은 위의 자바스크립트를 보면 아마 현기증이 일어날 것이다.

- 덧: 이렇게 웹으로 구현하게 되면 쉬운 접근성, 쉬운 호환, 그리고 쉬운 개발을 뽑을 수 있다. 하지만 좋은 퍼포먼스를 낼 수 없다는 점, UI가 세련되지 못하다는 점, 그리고 대부분 온라인으로 진행해야한다는 점이 웹 어플리케이션의 대표적인 장단점이다. 현재도 모바일 앱을 개발하는 경우 웹 앱이냐 네이티브 앱이냐 또는 하이브리드 앱이냐에 대한 토론은 계속 분분히 나오고 있는데, 어느 개발 방법을 선택하느냐에 대한 정답은 자신의 상황과 목적에 맞는 개발 방법을 택하는 것이다.


* 정리
: 위의 단계별로 개발 방법론의 변화를 간단하게 살펴보면 아래와 같다.


: 이제는 웹서버에서 웹언어가 하는 역할이 점점 줄어들고 있고, 클라이언트에서 처리하는 데이터의 양이 점점 많아지고 있는 것을 볼 수 있다. 시대에 따른 이슈와 화제거리가 개발 방법론을 변화시키기도 했지만 클라이언트 단말의 성능의 향상이 이제는 이러한 그림을 가능하게 만들었고, 클라이언트 단말이 발전할수록 웹서버의 역할은 점점더 줄어들 수 밖에 없을 것이다. 그럼 이제는 자바스크립트와 CSS의 역할 변화에 대해서도 간단하게 살펴보면 아래와 같다.


: HTML5의 표준화를 위해서 빠질 수 없는 자바스크립트와 CSS의 역할의 변화도 재미있을 것이다. 점점 커지고 많아지는 그 역할들이 클라이언트의 역할이 커짐을 대변하고 있다.


* 앞으로는?
: 이제 앞으로는 어떠한 개발방법론이 나오게 될지는 모르지만 다른 것보다도 중요한 것은 이제는 웹 프로그래밍을 이전과 똑같이 해서는 안된다는 점이다. 이전에 웹언어로 유지보수가 없었던 시절처럼 웹을 만드는 것은 단순한 한번 만들고말 홈페이지에 해당하는 경우, 정말로 빠르고 쉽게 프로토타입을 만드는 경우가 아니라면 충분히 설계를 잘 해서 개발을 해야할 것이다. 이제는 이쁘고 독특한 것도 중요하지만 속도 빠르게 '잘' 만드는 것 또한 빠져서는 안되는 중요한 시대가 되었다. 그리고 그러한 품질을 결정하는 가장 중요한 요인은 바로 데이터 처리를 하는 자바스크립트이다. 사실 자바스크립트는 처음 LiveScript라는 이름이 나왔을 때부터 변한 것은 거의 없다. 그렇기 때문에 당시에 자바스크립트를 접했던 사람들은 여전히 '디버깅하기 어렵고' '요상하게 동작하고' '정말 쉽지만' (표현을 약화시켜보면) '개발하기에 더러운 언어'라는 인식이 많다. 하지만 변함없었던 자바스크립트와는 달리 개발 방법론은 현격하게 바뀌었기 때문에 이제는 그러한 인식들도 바꿔야하고 실제로 자바스크립트가 웹 앱에서 기여하는 것이 90%이기 때문에 이를 잘 공부하고 잘 이해해야만 한다. 사실 자바스크립트는 IE 말고는 아무것도 없던 시절 정말 다루기 힘든 언어였지만 이제는 제대로 다루기만 하면 이보다도 좋은 언어는 없고 '굳이 웹언어를 써야하나' 라는 생각에 이르게 될 것이고, 그러한 인식의 변화를 이끌기 위해 이 '속깊은 자바스크립트 강좌'를 시작하기도 했다. 이제 다시 강좌를 시작하고 조금 더 진행되면 다양한 디자인 패턴들과 실제로 활용하는 것을 공부하면서 자바스크립트에 대한 인식을 재발견하기를 바란다.

: 이제 다음편에는 오래도 미뤄왔던 prototype에 대하여 공부하도록 하자.

끝.

- 다음 편

웹 컴포넌트: 차세대 프론트엔드 웹 개발로 가는 관문, 2014


2014년 2월 23일 일요일

[튜토리얼/MashUp] 웹 컴포넌트: 차세대 프론트엔드 웹 개발로 가는 관문(Web Component: the Gate to Next Front-end Web Developments)

오랜만에 업데이트를 하게 되는군요. 그간 HTML5Rocks의 튜토리얼들을 함께 번역해주신 분들의 노력에 힘입어 Web Component에 관련하여 설명할 수 있는 문서의 뼈대가 만들어졌습니다. 다른 한글화 및 업데이트 소식들도 밀려있는데 잠시 미뤄두고 이에 대한 포스팅을 하고자 합니다.

완전히 동의합니다. :) [출처: +Zeno Rocha - A future called Web Components]

"다소 거창한 제목을 붙였습니다만;; 컴포넌트가 완전한 에코 시스템하에서 가지는 강력함과 파괴력을 우리는 다른 플랫폼에서서도 익히 봐왔습니다. 같은 관점에서 웹 컴포넌트 역시 프론트엔드 개발에 있어 많은 변화를 예고하고 있는 기술이라고 예상할 수 있지 않을까요?" 



웹 컴포넌트?


웹 컴포넌트(Web Component)의 개념 자체가 아주 새롭고 특별한 기술은 아닙니다. 오랜동안 개발을 해오신 분들이 아니더라도 '컴포넌트(Component)'라는 말은 들어보셨으리라 생각합니다. 그러나 웹 컴포넌트가 가지는 의미를 알기 위해 웹에서의 컴포넌트가 왜 필요한지에 대해 잠시 생각해보도록 하겠습니다.


> 골격만큼이나 중요한 다른 것들...


한두번쯤은 게시판을 꾸미기 위해 혹은 만들기 위해 마크업 작업을 해보신 경험이 있을 것입니다. 사실 의미적으로 마크업이 가지는 모습은 매우 명확합니다. ''에는 사용자의 눈에는 보이지 않지만 브라우저가 먼저 처리해야하는 많은 것들이 기술되어 있으며 ''에는 우리가 사용자에게 전달하고자 하는 정보들이 담긴 수많은 마크업과 텍스트들이 존재합니다. 물론 이미지도 말이죠. 단지 이 관점에서 보자면 문서는 그리 복잡하지 않습니다. 예를 들어 W3C의 대한민국 인터넷 관심그룹이 그렇습니다. 문서는 깔끔하게 필요한 태그들만을 가지고 있고 그 자체로도 문서는 완전합니다.

그러나 실제는 어떤가요? 실제 현장까지 가지 않고 개인 홈페이지만 살펴보더라도 스타일에 대한 많은 시도들이 보이고 있습니다. 이들은 화려하고 아름답고 때로는 사용자 경험(UX)를 개선하는 많은 기능들을 제공합니다만 그 뒤에는 너무나도 복잡해져만 가는 마크업들과 스타일, 자바스크립트들이 존재합니다. 많은 요구사항들이 본래의 구조보다 많은 개발들을 요구하고 있죠. -물론 국내는 웹이 대중화되던 초기부터 그랬습니다. 지금은? :)-

GMail은 편리하지만 태그는 그렇지 않습니다. :( [출처: HTML5Rocks 'Custom Element' 튜토리얼]

GMail을 예로 들어보죠. 저는 GMail을 이용하고 있고 실제로는 애용하고 있습니다. 이 서비스는 쉽게 메일을 읽고 편리하게 기록 속에 남아 있는 다른 사용자들의 메일주소를 몇번의 타이핑만으로 찾을 수 있으며  답장 역시 현재 읽고 있는 페이지에서 가능합니다. 그러나 과연 개발도 그럴까요? 이 서비스를 개발자도구로 열어본다면 아마 그렇지 않다고 생각하게 될 것입니다.

전 오랜동안 네이티브 앱이나 서비스, 플랫폼을 개발해왔습니다. 사실 개발에 촛점을 맞춰보자면 웹 개발을 마지막으로 한 것은 CGI와 ASP가 전성시대를 열던 초기에 있었던 몇번이 제 경험의 대다수라고 해도 과언이 아닙니다. 그리고 현재 시점에서 다시 웹을 살펴보았을 때 정말 많은 것들이 바뀌었고 그에 놀라워함에도 불구하고 개발 방법 자체는 예전에 작업하던 많은 방식들이 그대로 이루어지고 있다는 것에 다시 놀랄 수 밖에 없습니다. (사실 편리해진 것들도 많고, 모든 것을 바꿔야할 필요가 없다는 것은 잘 알고 있습니다.)

여전히 우리는 다른 프로젝트에서 사용했던 리스트 아이템들을 새로운 프로젝트에서도 적용하기 위해 마크업을 복사해서 수정하고 스타일링을 위한 새로운 CSS를 작성하거나 기존 스타일과의 충돌을 제거하고, 자바스크립트를 최대한 모듈화하여 작성하고 있습니다. 그러나 여전히 이는 근본적인 재활용 방법이 아닌 개발자의 역량과 경험에 의존하고 있는 일종의 개선된 Workflow에 가깝습니다. 즉, 언제든지 우리는 태그의 바다(Tag Soup)와 같은 위험 지역에 다시 빠질 수 있는 가능성을 안고 있습니다. 게다가 태그의 바다에 빠진다는 것은 CSS나 자바스크립트의 태풍 속에 노출된다는 것과도 같죠.


> 무엇이 필요할까?


사실 우리는 필요한 것이 무엇인지는 이미 알고 있습니다. 다만 지금까지는 이를 방법론으로, 개발도구로, 경험으로 해결해왔을 뿐이죠. 이제 우리에게 필요한 것은 '자주 사용되는 유용한 것들 혹은 구조 상 분리가 필요한 것들을 개발의 다른 요소들과 충돌하지 않는 형태로 재활용이 가능하도록 만들어 주는 일관적인 방법'입니다. 특히 UI 요소들이 많은 프론트엔드 개발에서는 '리소스 관점에서 분리되어 있는 HTML, CSS, 자바스크립트를 하나로 묶어 주는 것' 또한 중요한 기능 중의 하나가 됩니다. 소프트웨어 개발에서는 이러한 요소들을 '컴포넌트(Component)'라는 개념으로 오랜동안 사용해 왔으며 예를 들자면 백엔드에서는 이미 다양한 형태의 컴포넌트가 각 플랫폼에 적합한 형태로 오랜동안 배포되고 사용되어 왔습니다. 이제 조금 더 나아가서 우리는 컴포넌트를 웹에서 (특히 프론트엔드 개발에서) 사용할 방법이 필요하며 가능하다면 도구적인 지원을 받을 수 있으면 더 좋을 것입니다.

다행스럽게도 W3C에서는 이러한 컴포넌트 기술을 웹에서 적용할 수 있도록 새로운 규격의 집합을 만들었으며 이 규격들을 묶어 '웹 컴포넌트(Web Component)'라고 부르게 되었고 이를 지원하는 도구와 라이브러리들의 작업이 여러 곳에서 매우 빠르게 진행되고 있습니다.



웹 컴포넌트를 지탱하는 규격들


앞에서 말씀드린 바와 같이 웹 컴포넌트는 하나의 규격으로 이루어진 것은 아닙니다. 개별적인 특성을 가진 여러개의 규격으로 이루어져 있죠. 이 포스트는 웹 컴포넌트의 기술적인 내용을 목적으로 하고 있지는 않지만 어떠한 규격들로 이루어져 있는지는 살펴보도록 하겠습니다.

웹 컴포넌트는 다음과 같은 4가지의 규격으로 구성되어 있습니다.

  • Shadow DOM - 컴포넌트의 DOM, CSS, JS를 감추는 캡슐화(encapsulation)와 외부로부터의 간섭을 제어하는 스코프(Scope)의 분리를 제공
  • HTML Template - 로딩 시간에는 비활성화되는 마크업을 정의하고 이를 실행 시간에 복제할 수 있는 기능을 제공
  • Custom Element - 웹 문서에서 사용할 엘리먼트의 동적인 등록을 통해 컴포넌트의 명시적인 alias를 선언
  • HTML Imports - 웹 문서 내에 외부 리소스를 포함(Import)하기 위한 기능을 제공


각 규격에 대해 간략하게 살펴보기 전에 +Eric Bidelman이 JSCamp에서 발표했던 다음 영상을 확인해보시기 바랍니다. (발표 자료는 여기에서 확인할 수 있습니다.)

JSCamp Talk: Eric Bidelman - WebComponents are the Future


> 캡슐화와 스코프의 제어 - Shadow DOM


지금까지의 웹 개발에서 하나의 페이지는 하나의 문서를 나타내었습니다. 이들은 구조를 나타내는 마크업이나 표현을 위한 스타일, 동작에 대한 자바스크립트들이 복잡하게 얽혀있지만 브라우저는 언제나 이들을 하나의 문서로 통합하여 제어해왔습니다. 하나로 보이는 것은 언제나 중요한 일입니다만, 실제로도 하나로 다루어지기 때문에 우리가 작성하는 모듈이나 마크업들은 언제나 다른 영역과 함께 보이고 관리되며 처리되어 왔습니다.

이러한 문제로 인해 웹 페이지를 개발할 때 몇 가지 UI 요소들은 지속적으로 재활용됨에도 불구하고 개발자가 올바른 DOM 트리를 구축하기 위해 마크업을 재작성하고 UI 요소를 둘러싸는 다른 요소들과의 구조적인 이슈들을 해결하기 위해 추가적인 작업을 필요로 합니다. 이러한 과정에서 발생하는 복잡한 DOM 트리들(좀 더 정확하게는 Tag Soup)은 재사용성과 개발 효율성에 크게 영향을 미치는 부분이기도 합니다.

Shadow DOM은 이러한 하나의 문서에서 특정한 DOM을 통해 복잡한 서브 DOM 트리를 대표할 수 있도록 만들었습니다. 이러한 개념을 우리는 캡슐화와 스코프 관점에서 바라 볼 수 있습니다.

"캡슐화(Encapsulation)은 소프트웨어 공학에서 매우 중요하게 다뤄지던 개념 중의 하나입니다. 캡슐화는 어떠한 모듈이나 기능 단위를 인터페이스만 남기고 외부로부터 완전하게 감추어주는 역할을 하며 Shadow DOM의 대표적인 장점 중의 하나이기도 합니다. 스코프(Scope)는 이러한 캡슐화 과정에서 나타나는 부산물이지만 여러가지의 모듈이 연동하는 소프트웨어에서 각 모듈의 독립적인 동작을 보장하는 매우 중요한 개념입니다. 조금 더 정확하게 얘기하자면 Shadow DOM은 스타일에 대한 캡슐화도 지원하고 있습니다."

이러한 동작들이 어떻게 이루어지는지를 이해하기 위해 +Eric Bidelman이 작성한 'Shadow DOM Visualizer'를 통해  시각적으로 확인해 볼 수 있습니다.



우리는 Shadow DOM을 이용하여 컨텐츠와 표현을 분리할 수 있습니다. Shadow DOM은 이를 이용하여 캡슐화된 DOM 트리를 HTML 문서에 활용할 수 있는 가장 기초적인 개념과 원칙을 제공합니다. 표현(Presentation)과 내용(Contents)의 분리는 하나의 웹 문서가 지나치게 복잡해지는 태그의 바다(Tag Soup)를 해결해줄 뿐만이 아니라 보다 근본적인 기능-즉, 개발된 UI 요소의 재사용을 위한 가장 기본적이고도 중요한 기능-을 제공합니다.

또한, Shadow DOM이 컴포넌트를 구성하는 DOM을 감추는 역할(encapsulation)뿐만이 아니라 스타일에 대한 캡슐화를 지원함으로써 여러분은 배포된(혹은 배포한) 웹 컴포넌트에 대해 여러분의 스타일을 유지하거나 반대로 사용자의 페이지의 Look&Feel을 상속받아 위화감 없는 스타일을 구성할 수도 있습니다. 이러한 스타일에 대한 캡슐화는 특히 사이트를 구축하는 UI 요소로써는 매우 중요한 속성이 될 것입니다. 더불어 이러한 캡슐화된 스타일을 어떻게 관리할 것인가도 웹 컴포넌트의 사용자들에게는 중요한 지점이 될 것입니다.


> 런타임에만 활성화되는 복제 가능한 마크업 - HTML Template


템플릿은 뷰를 위한 기반 구조로 사용되는 미리 작성된 형식의 문서나 파일입니다. 즉, 문서가 표현될 형식 마크업를 정의한 뒤 재사용하도록 하여 (마크업의 작성이나 런타임 마크업 생성 모듈과 같은) 추가적인 개발 작업으로부터 개발을 간편하게 만들어줍니다.

템플릿의 개념 역시도 웹 개발에 있어 새로운 것은 아닙니다. 서버 측에서의 템플릿 활용뿐만 아니라 클라이언트에서도 우리가 주로 사용해오던 여러가지 방법들이 이미 존재합니다. 

예를 들어, "오프스크린" 상에서 DOM을 생성하고 이를 hidden 속성이나 display:none을 사용하여 뷰로부터 이를 감추는 오프스크린 DOM은 브라우저에서 제공하는 다양한 기능을 활용하여 템플릿을 구현할 수 있지만 문서 내의 다른 DOM에 영향을 주는 등의 부작용을 가지고 있습니다. 반대로