구글 Dart는 자바 스크립트 대체재인가?

 
By 2012년 5월 7일 

Dart는 구글이 내놓은 웹 프로그래밍 언어입니다. 처음에 Dash라는 프로젝트로 시작된 뒤 Dart로 명칭이 변경되었고 변경하여 2011년 10월 GOTO 컨퍼런스에서 처음 소개가 되었습니다. 오픈소스로 공개되어 Google Code에서 다운로드할 수 있습니다. Dart는 세간에 Javascript를 대체하기 위해서 나온 언어로 알려져 주목을 받았습니다.

Dart는 Class기반 객체지향언어이며, C#, Java 그리고 Javascript 문법을 적절히 채택하여 설계 됐습니다. 기존 개발자들도 큰 전환 비용 없이 배울 수 있는 언어입니다.

현재 Dart 버전은 0.08이며, Technical Preview상태입니다. 출시된지 오래되지 않았음에도 브라우저에서 언어를 바로 테스트 해볼 수 있는 Dartboard, Eclipse를 이용한 Dart언어 전용 에디터인 Dart Editor가 나와 있습니다. Dart로 작성한 파일을 Javascript로 변환해주는 변환기도 있습니다. Dart를 작동 시킬 수 있는 Virtual Machine와 VM을 장착하고 있는 브라우저 Dartium도 배포되고 있습니다. 나온지 얼마 되지않은 언어임에도 모든 개발 환경을 구축하고 있으며 사용자를 확보하기 위해 많은 노력이 시도되고 있는 중입니다.

Javascript의 장단점
소위 Web 2.0라 불리는 시기가 오면서, Ajax가 전성기를 맞았습니다. 당시 새로운 시대를 맞아 많은 웹 서비스 제공업체들은 좀 더 강력한 기능을 제공하기 원했고, 많은 라이브러리의 등장을 요구하게 되었습니다. 이에 따라 Prototype.js, YUI, jQuery 등 Javascript Framework 등장이 줄을 이었습니다.

이러한 라이브러리들은 웹의 새로운 가능성을 열었고, 대형 인터넷 업체와 스타트업들은 사용자 구미를 당기는 멋진 웹을 내놓기 시작했습니다. 이와 함께 Javascript는 사용하기 간결하고 모든 브라우저와 대다수 기기들에서 제공되는 특성을 앞세워 저변을 확보해 나갔습니다. 많은 프로그래머들은 사용자에게 애플리케이션을 설치할 필요가 없으며, 이미 많은 플랫폼을 확보한 Javascript 언어를 사용하기를 선호했고 다양한 애플리케이션을 개발했습니다.

그러면서, 기존에 몰랐던 Javascript의 문제점이 발견되기 시작합니다. 가장 먼저 부각 된 점은 “성능” 부분입니다. 대규모 애플리케이션을 Javascript로 작성하게 되면, 언어 특성상 사용자가 모든 소스를 다운로드 받아 로드까지 상당 시간을 소비한다는 문제점이 있습니다. 개발자들은 이러한 점을 극복하기 위해 많은 노하우를 통해 개선했지만, 여전히 많은 문제점이 있습니다.

그리고, 몇몇 Javascript Library에서 Class와 Extend 등을 지원하고 있지만, 거대한 애플리케이션을 설계하기엔 여전히 부족합니다. 이렇게 만들어진 애플리케이션은 문서화도 어렵습니다. 근래에 많이 등장해 사용되고 있지만, 여전히 부족하게만 느껴지는 Javascript 관련 도구들도 문제입니다. Google의 경우, Gmail, Google+ 그리고 Docs 등 대다수 서비스가 Full Javascript 애플리케이션으로 만들어지고 있습니다. 이에 따라 앞서 언급한 Javascript들의 단점은 큰 부담감으로 느껴지게 되었고, 이를 극복하기 위해 구글은 V8엔진과 Chrome을 개발하게 되었습니다. 결과적으로 성공한 행보였습니다. 크롬은 브라우저 시장의 많은 부분을 차지하게 되었고, 다른 브라우저 업체들에게 영향을 끼쳐 브라우저 생태계의 긍정적인 성장을 이끌어내고 있습니다.

Dart는 Javascript를 대체하기 위해 나왔을까?
구글은 왜 Dart를 개발했을까요? Dart 개발진은 Javascript를 대체하기 위해서라는 말은 하지 않습니다. 단지 거대한 웹 애플리케이션을 개발하는 개발자들을 위해 개발했다고 얘기합니다. 즉, 표준화 된 언어와 잘 정리된 도구들 그리고, 이 모든 것이 통일 된 환경에서 나오는 향상된 개발 경험을 개발자에게 주고자 개발되었다는 겁니다. 구글은 이러한 새로운 개발 환경을 통해 개발자들이 더 빠르고 쉽게 거대한 웹 어플리케이션 개발을 할 수 있을 것이라고 믿고 있습니다. 실제로, Dart를 개발하고 있는 팀은 V8엔진을 개발하던 개발진이며, Google의 경우 여전히 Javascript를 발전시키기 위해 TC39와 협조하고 있으며 여전히 V8엔진을 발전시키고 있습니다.

이 말은 현재 “Javascript를 대체하기 위해”라는 자극적인 주제보다는 “더 나은 웹 개발을 위한 새롭고 발전 된 개발환경을 제공한다”는 명분이 Dart와 어울린다고 볼 수 있습니다. 정리하자면, Dart는 개발자에게 기존의 개발경험을 살리면서 더 명확하게 웹 애플리케이션을 개발할 수 있는 기회를 주기 위해 탄생 되었다고 할 수 있습니다.

Dart의 특징
Dart는 Javascript와는 다르게 기본적으로 Class와 Interface를 지원하고 있습니다. (주: 기존 Javascript에도 Class를 넣고자 하는 움직임이 있었으나, 강력한 반대로 유명무실 하게 되었습니다.)
다음 코드는 Dartlang.org에서 제공되는 Class와 Interface 예제입니다.
Java와 C#으로 개발하시던 분들에겐 익숙한 문법이라 생각합니다.


interface Shape {

num perimeter();

}

class Rectangle implements Shape {

final num height, width;

Rectangle(num this.height, num this.width); // Compact constructor syntax.

num perimeter() => 2*height + 2*width; // Short function syntax.

}

class Square extends Rectangle {

Square(num size) : super(size, size);

}

Dart는 Optional Types라는 좀 더 편안한 기능을 제공하고 있습니다. 변수 Type을 확정하지 않고, 기능이 제공될 수 있도록 코드를 작성을 할 수 있는 방법입니다. 예제를 먼저 보겠습니다.


class Point {

var x, y;

Point(this.x, this.y);

scale(factor) => new Point(x*factor, y*factor);

distance() => Math.sqrt(x*x + y*y);

}

main() {

var a = new Point(2,3).scale(10);

print(a.distance());

}

위 코드를 살펴보면 scale, factor, distance에 대한 정의가 이뤄지지 않았습니다. Dart에서는 이것을 스스로 판단하여 scale은 Point type, factor와 distance는 num type로 정의하게 됩니다. 이 기능은 많은 개발자들이 많은 스트레스를 받지 않고 기능 중심의 개발을 할 수 있도록 해주는 유용한 것이라 할 수 있습니다.

그 다음 소개할 것은 Dart의 가장 큰 특징 중 하나인 Isolate 입니다. 실제로 Dart는 Javascript와 마찬가지로 Single Thread로 동작합니다. Javascript에서는 Multi-Thread효과를 위해 여러 방법들이 사용되어 왔습니다. 스크립트를 동적으로 여러차례 로딩 시키거나 이벤트 드리븐 방식을 통한 동시에 실행되는 효과를 구현하는 것이 그 예라고 할 수 있습니다.

Dart는 자체적인 VM을 가지고 있어 복잡한 사전 구현 없이 Isolate를 이용하여 간편히 작성 할 수 있습니다. Isolate는 객체를 독립적으로 생성, 이들간 메세징 기반 통신을 할 수 있도록 도와주어 Multi Thread를 구현할 수 있도록 합니다. 다음 예제를 보겠습니다.


#import('dart:isolate');

echo() {

port.receive((msg, SendPort reply) {

reply.send(“I received: $msg”);

});

}

main() {

SendPort sendPort = spawnFunction(echo);

sendPort.call(“Hello from main”).then((reply) {

print(reply); // I received: Hello from main

});

}

Echo라는 function에서 메세지를 받을 port를 열어두고 대기하고 있다가 메세지를 받으면 돌려주는 역할을 하고 있습니다. 그리고, main함수에서 이 echo를 메세지를 받을 수 있는 곳에 등록 해두고(spawnFunction) 메세지를 입력하면, 돌려 받은 메세지를 출력하는 예제 입니다. 이를 응용하여 동시 처리해야 하는 경우에도 활용할 수 있습니다.
Dart는 이와 같이 Javascript에서는 대형 애플리케이션을 위해 개발자가 직접 작성 했던 부분들을 명확하고 사용하기 쉽게 제공해주고 있습니다.


Dart의 미래는 어떨까요?

가장 많은 분들이 궁금해 하는 부분이 아닐까 싶습니다. 현재 낮은 버전으로 인해 실전에서 사용 못하는 단계라 미래를 예측할 수 없기 때문이겠죠? 여전히 Dart는 덜 익은 열매이고 스펙이 계속 변경 되고 있으므로 바로 도입이 어려운 것은 사실 입니다.
하지만, 무엇이 Dart의 미래를 밝게 볼 수 있게 할 까요?

그것은 Dart개발팀이 V8과 Chrome도 관련되어있다는 것입니다. 멀지 않은 미래에 Chrome에서도 채택 될 것이며, Android Chrome에도 올라 갈 것입니다. 현재 마켓의 많은 부분을 차지하는 브라우저에서 더 빠른 앱을 돌릴 수 있다는 것은 상당한 강점이 아닐까 싶습니다. 생각을 좀더 넓혀본다면 Webkit 계열에서는 좀 더 쉽게 도입할 수 있지 않을까 싶습니다. 그렇게 되면 Apple 제품인 Safari 브라우저에서의 채택도 기대를 할 수 있겠습니다.

그리고, 다른 하나는 Server-side에서의 기대치 입니다. 현재 Node.js가 많은 개발자들의 기대를 받으면서 빠르게 발전하고 있습니다. 빠른 반응속도와 Javascript의 개발 생산성으로 인해 많은 주목을 받고 있습니다. Dart는 이미 Node.js를 분석하여 그들의 좋은 특성들을 포팅해둔 상태입니다. 간단한 채팅 서버와 웹서버를 돌려보면 그 속도가 Node.js보다 근소한 우위에 있음을 알 수 있습니다. 더군다나 Isolate와 결합한다면 처리능력 또한 증대 시킬 수 있기 때문에 그 기대감이 더욱 높습니다.

Server-side의 경우 Front-end보다 영향성이 적기 때문에 현재 Node.js와 재밌는 경쟁을 할 수 있을 것으로 예상하고 있습니다. Dart는 빠르게 발전하는 언어입니다. Dart는 V0.08상태이며, Technical Preview 상태입니다. 그럼에도 불구하고 간결한 문법으로 기존 개발자가 쉽게 넘어 올 수 있는 상태이며, 많은 도구를 제공하여 개발자들에게 먼저 다가가기 위해 노력하고 있습니다. 이러한 개발진의 노력으로 인해 저는 Dart가 단기간 내에 많은 발전을 할 것으로 생각하고 있습니다.

Dart팀은 개발자들의 의견을 받아 발전 시키기 위해 최대한 안정켜서 공개를 서둘렀다고 합니다. 그래서, 사용자들이 조금이나마 사용하고 계속 많은 피드백 주길 기다리고 있고, 이렇게 준 의견에 대해서 적극적으로 검토하는 모습을 보이고 있습니다. Dart팀은 언어가 만들어지는 순간을 많은 개발자가 같이 공유하고 만들어갈 수 있는 새로운 방법을 택한 것입니다. 이러한 시대적 움직임에 여러분들도 같이 즐기실 수 있습니다. 새롭고 흥미로운 Dart에 많은 관심을 가져주시기 바랍니다.

참고 문헌
Oreilly.com
Wikipedia.org
Dartlang.org

[필자소개]
김성훈님은 개발자로 현재 Dartlang Korean Users Group 운영자로 활동하고 있다.

페이스북으로 댓글을 남기실 수 있습니다.
THE AUTHOR