가상 DOM 이란?

원글
https://medium.com/tony-freed-consulting/what-is-virtual-dom-c0ec6d6a925c#.wdffntbv4

What is DOM?

가상 DOM 에 대해 말하기 전에 실제 DOM에 대해서 먼저 말해보자.

DOM은 Document Object Model의 약자로, 구조화된 문서를 표현하는 방법을 말한다. 크로스 플랫폼이고 랭귀지 독립적인 컨벤션을 가졌으며 HTML, XML 등에서 데이터를 표현하거나 상호작용하는데 사용된다. 웹브라우저는 DOM 을 사용하기 때문에 우리는 자바스크립트와 CSS를 사용해서 상호작용할 수 있다. 노드를 검색하고 해당 노드의 디테일을 변경하거나, 삭제하고 새롭게 생성할 수 있다.
이제 DOM API는 대부분의 크로스 플랫폼이며 크로스 부라우저 를 지원한다.
그럼 뭐가 문제일까?

DOM Problem

제일 큰 문제점은 DOM은 다이나믹 UI를 생성하는데 최적화 되어 있지 않다는 점이다.

우리는 자바스크립트와 JQuery 같은 라이브러리를 사용해서 개발을 하지만, JQuery 같은 라이브러리들은 퍼포먼스 문제를 해결하기엔 부족하다. 트위터나 페이스북, 핀터레스트 같은 모던 소셜 네트워크를 보면 조금만 스크롤해도 유저는 수천개의 노드를 받게 된다. 이런상황에서 효울적인 DOM사용은 중요한 문제가 된다. 예를 들어 1000 개의 div를 5 픽셂만 옮긴다면 1초이상 걸릴 것이다. 모던웹에선 너무 긴 시간이다. 스크립트와 몇몇 트릭으로 최적화 할 수 있을진 몰라도 결국엔 다이나믹 UI와 많은 페이지를 작업하기엔 너무 힘든 일이다.

이 문제를 해결할 수 있을까? 그럴 수 있을것 같다.
현제 W3C 그룹은 Shadow DOM을 작업중이다.
Shadow DOM - W3C working draft standard 이다. 명세에 따르면 여러 DOM트리를 하나의 계층에 통합하고 이 트리가 다른것에 어떻게 영향을 미치는지 알게되어 좀더 나은 DOM 구성이 가능하다고 한다.
다른 옵션으로 Virtual DOM이 있다. 표준은 아니지만 표준 DOM에서 해결책으로 사용되고 있다.

Virtual DOM

DOM을 직접 건드리기 보다 우리는 이것의 추상화된 버전을 만든다. 다시 말해서 가벼운 버전의 DOM 복사본을 만드는 격이다.
가상 DOM에 수정을 하고 실제 DOM에 적용할 수도 있다. 실제 DOM에 적용하기 전에 바뀐 부분이 있는지 비교한 후에 적용한다.

렌더링 비용이 큰 부분들이 전부 필요하지 않기 때문에 직접 DOM을 핸들링하는것 보다 훨씬 빠르다. 좋은 방법이지만 올바르게 사용해야 한다.
2가지 주의해야할 사항이 있다. “언제 DOM을 다시 렌더링 할것인가?” 와 “어떻게 효율적으로 할 것인가?”

언제.
데이터가 바뀌면 업데이트할 필요가 있다. 하지만 데이터가 바뀌었는지 어떻게 알까?
두가지 방법이 있다. 간단히 생각해서(dirty checking) 데이터의 모든 값을 체크하는 것이다.
두번째 방법으로 (observable)  상태(state)가 바뀌는지 관찰(observe) 하고 있는것이다. 만약 바뀐게 없다면 아무것도 하지 않으면 된다. 만약 바뀌었다면 무엇을 업데이트 해야할지 알게 된다.

어떻게.
가상 DOM 을 실제로 빠르게 하는 것은 무었인가?

  • 효과적인 비교 알고리즘.
  • DOM을 읽고 쓰는 작업
  • 효율적으로 서브 트리만 업데이트하는 것.

위에 나열한 것들은 쉽게 구현하기 힘든 것들이다. 그래서 도움을 받을 라이브러리들이 있다. 제일 유명한 것으로 페이스북의 React JS 가 있다.

React JS

페이스북에서 만든 자바스크립트 라이브러리이다.
React는 자바스크립트 오브젝트에서 가져온, DOM 트리를 흉내낸 가벼운 트리(lightweight tree)를 만든다. 이것으로 HTML을 만들고 HTML 엘리먼트에 append 나 insert 한다. 브라우저가 다시 렌더링 하게 하는 것이다.
React는 라이브러리 이지 프레임웍은 아니다. 그래서 Angular나 Ember와 비교할 순 없다.

다른 라이브러리와 프레임웍

  • virtual-dom by Matt Esch- A JavaScript Virtual DOM and diffing algorithm.
  • Mithril- A Javascript Framework for Building Brilliant Applications.
  • Bobril- Component oriented framework inspired by Mithril and ReactJs.
  • cito.js- avaScript framework for building fast, scalable and modularized web applications.

결론

가상 DOM은 DOM트리를 모방한 가벼운 자바스크립트 Object 를 통해 직접 DOM을 핸들링 하지 않고 퍼포먼스를 향상시킬수 있는 테크닉과 라이브러리, 알고리즘의 모음 이다.
가상 DOM의 아이디어는 훌륭하지만 새로운것은 아니다. 이미 오래전부터 DOM은 비싸다는것을 알고 있었지만 구현하는 방법이 어려웠을 뿐이다.
React와 같은 라이브러리 덕분에 더 나은 퍼포먼스의 어플리케이션을 개발할 수 있게 되었다.

감사합니다.


'programing' 카테고리의 다른 글

리액트 상태관리를 하는 가장 쉬운 방법 Plo  (0) 2020.03.12
gitignore 패턴  (0) 2017.07.20
java 정렬하기  (0) 2017.04.03
클로저 시작하기  (0) 2016.06.09

closure

맥 환경에서 라이닝겐을 설치하고 repl 을 사용해 보자

brew install leiningen
lein new hello-clojure
cd hello-clojure
lein repl

기본적인 함수 호출하기

user=> (- 1)
-1
user=> (+ 1 1)
2
user=> (* 10 10)
100

이것은 간단한 산수에 불과하다. 나누기는 약간 흥미롭다.

user=> (/ 1 3)
1/3
user=> (/ 2 4)
1/2
user=> (/ 2.0 4)
0.5
user=> (class (/ 1 3))
clojure.lang.Ratio

클로저는 ratio라는 기본적이 자료형을 가지고 있다. 이것은 정밀도가 상실되는 것을 피하기 위해서 계산 자체를 지연하는 멋진 기능이다. 원한다면 부동소수점을 이용해서 계산을 수행할 수도 있다. 이런 방식을 통해 나머지를 쉽게 계산할 수 있다.

user=> (mod 5 4)

나머지 연산을 수행하는 간략한 방법이다. 이러한 표기법은 전위 표기법prefix notation이라고 불린다. 지금까지 보았던 언어들은 모두 4+1-2 처럼 연산자가 피연산자 사이에 오는 중위 표기법infix notation을 사용했다. 우리는 수학 공식을 이런 방식으로 표기하는데 익숙하기 때문에 많은 사람이 이미 익숙한 중위 표기법을 선호한다. 하지만 전위 표기법의 장점도 있다.


user=> (/ (/ 12 2) (/ 6 2))
2

클로저는 괄호가 지정하는 순서대로 계산할 것이다.

user=> (+ 2 2 2 2)
8

원한다면 계산 과정에 또 다른 인수를 추가하는 것은 간단하다.

user=> (- 8 1 2)
5
user=> (/ 8 2 2)
2

이렇게 단순한 연산자 평가를 통해서 놀라울 정도로 강력한 결과를 얻을 수 있다.

user=> (< 1 2 3)
true
user=> (< 1 3 2 4)
false

훌륭하다. 이렇게 연산자 하나와 임의 개수의 인자를 이용해서 리스트의 내용이 정렬되어 있는지 여부를 판별할 수 있다.


출처
브루스 테이트의 세븐랭귀지

참고
https://leiningen.org/


'programing' 카테고리의 다른 글

리액트 상태관리를 하는 가장 쉬운 방법 Plo  (0) 2020.03.12
gitignore 패턴  (0) 2017.07.20
java 정렬하기  (0) 2017.04.03
가상 DOM 이란?  (3) 2016.06.21
aws는 올해부터 개인적으로 사용하기 시작했다. aws에 대해 자세히 알지 못했고, aws의 신규서비스나 이슈들에 대해서 따라가지 못하고 있었는데, 이번 aws 서밋을 통해 개괄적으로 알 수 있어서 좋았다.

전체적인 참관기로는 나처럼 이제 막 사용하기 시작한 사용자들을 위한 세션들과, 개념들에 대한 세션이 대부분이었고, 좀더 숙련된 사용자를 위한 세션이나, 구체적인 내용은 많이 없었다.

키워드를 간단히 정리해 본다.


Aurora

안쓸 이유가 없어 보인다. 


* 참고



DevOps

아마존의 개발 방식이 기존 monolithic 에서 microservices 로 바뀌었는데 이유는 다음과 같다.


단지 기다리고 있어서...

좋은 도구가 많이 있다. 이 세션에서는 aws codePipeline을 소개했다.  슬라이드쉐어를 참고하자.

* 참고 

http://www.slideshare.net/awskorea/devops-with-aws-seonyong-park




Lambda

람다로 hello world 를 출력해보자.

exports.handler = function(event, context) {
    context.succeed('hello world');
};

서버 인스턴스를 따로 구동시킬 필요없다.  당연히 nodejs를 구동할 필요도 없다. 
aws  콘솔에서 lambda로 들어가서 코드를 작성하면 그만이다. 
코드를 작성하고 aws API로 lamda function을 연결하면 api가 완성된다. 
요청 횟수에 따라 과금되기 때문에 24시간 인스턴스를 돌리는것보다 효율적일 수 있다. 
스케일아웃을 자동으로 관리해 주기때문에 전혀 신경쓸 필요가 없다.
nodejs, java, python 코드를 쓸 수 있다.

재작년에 선보여서 지금은 이미 많이 사용하고 있다고 한다. 하지만 서울 리전은 없다. 곧 오픈해 주겠지...

* 참고



Microservice

gilt.com 의 아키텍처 변화를 살펴보자 

2007년 Ruby on Rails로 간단하게 시작했다.


루비만으로는 서버가 다운되는걸 막기 힘들었나 보다. 자바를 도입한다.

자바를 도입했지만 전체 application이 너무 거대해지고 개발하기 힘들어 졌다.


"어플리케이션 개발을 좀더 빠르고 편하게 할 순 없을까?"
("How can we make it fast and easy to get to change to production?")

마이크로 서비스를 도입한다. 수많은 마이크로 서비스로 이루어진 개별 서비스들로 아키텍처를 바꾼다.



마이크로 서비스로 인해 gilt.com 은 

 - 팀간에 의존성 줄임: 코드에서 배포까지 빠른 개발

 - 수많은 프로젝트 동시 진행

 - 팀마다 원하는 언어나 프레임워크 사용

 - 서비스의 간단한 분리

 - 포기할 수 있는 코드: 쉬운 혁신이 가능하고, 실패도 쉽다. 그래서 계속 나아갈 수 있다.
(Disposable code: easy to innovate, easy to fail and move on.)


마이크로서비스아키텍처는 회사에서 도입 했으면 하기도 하고, 좀더 알아봐야할 부분도 있어서 다음에 더 자세히 다뤄보려고 한다. 


* 참고



전세계 수많은 회사들의 로고를 뒤로 하고 aws sales vp가 나와서 기조연설을 했었다. 전세계 소프트웨어 회사들 뿐만 아니라 공공기관들도 사용한다고 한다.



사실 aws를 직접 사용하기 전까진 비싼 비용 때문에 사용이 꺼려졌다. 하지만 나뿐만 아니라 누구라도 한번 사용하면 다시는 다른 클라우드는 생각하지 못할거다. 

정말 무서운 회사다.







'기타' 카테고리의 다른 글

쿨하지 못해 미안해  (0) 2016.05.21

+ Recent posts