자바와 닷넷, 루비, SOA 등의 기술 기반의 엔터프라이즈 시스템 개발정보 포탈인 InfoQ(www.infoq.com)의 설립자인 Floyd Marinescuh는 2006년의 엔터프라이즈 기술 트렌드를 정리하면서 새롭게 떠오르는 메인스트림 기술로 AOP, Ajax, SOA와 함께 스크립트 언어를 꼽았다. 스크립트 방식의 다양한 언어들은 오래전부터 존재해왔고 지속적으로 새로운 스크립트 언어가 나왔지만 일부 웹 스크립트 언어를 제외한 메인스트림에서는 그다지 주목받지 못했다. 하지만 최근 몇 년 사이에 루비(Ruby)와 루비온레일즈(Ruby on Rails)의 놀라운 인기에 힘입어 스크립트 언어가 엔터프라이즈급 시스템 개발에 본격적으로 적용될 수 있을 것이라는 예측이 개발자들 사이에서 급격히 퍼지고 있다.
더 나아가서 기존 프로그래밍 언어의 한계와 단점을 훌륭하게 극복해줄 수 있는 대안으로까지 평가되어지고 있다. 그에 따라 자바와 C/C++, C# 등의 주류 프로그래밍 언어와 루비, 파이썬(Python), 그루비(Groovy), 펄(perl) 등의 스크립트 언어가 본격적인 경쟁 구도를 가지게 될 것으로 예상된다.
벌써부터 많은 자바와 닷넷 개발자들이 루비 개발자로의 변신을 꾀하고 있을 정도다. 각종 컨퍼런스와 세미나에 스크립트 언어와 관련된 세션이 인기를 끌고 있는 것은 물론이다. 지난해 해외의 개발자 구인 사이트에서 가장 높은 수요의 증가를 기록한 분야가 스크립트 언어와 관련된 사실만 봐도 스크립트 언어의 약진을 한눈에 확인할 수 있을 정도다.
새롭게 주목받는 스크립트 언어
한때, 간단한 웹 개발 이외에는 사용되지 않던 스크립트 언어가 새롭게 주목받고 있는 이유는 무엇일까? 그 이유는 세 가지 정도로 요약해 볼 수 있다. 먼저 간단히 정리하면 스크립트 언어가 오랜 세월을 거치면서 발전한 것이고, 스크립트 언어를 기반으로 하는 프레임워크의 발전도 한 몫 했다고 할 수 있다. 마지막 원인은 스크립트언어가 기존 언어들의 취약점을 보완해 줄 수 있게 되었다는 점이다. 각 이유들에 대해 좀 더 자세히 알아보자.
스크립트 언어자체의 발전
초기의 스크립트 언어는 시스템 관리자들이 손쉽게 사용할 수 있는 간단한 시스템 스크립트 제작이나 인터렉티브한 커맨드 쉘을 사용하는데 주로 사용되었다. 따라서 구지 컴파일이 필요한 복잡한 언어와는 달리 단순한 작업에 적합한 수준의 심플한 문법과 기능을 가지고 있었다. 쉘 스크립트로 대표되는 이러한 초기 스크립트 언어는 점차 그 사용 용도가 다양해지면서 범용적인 언어로 발전해 나간다. 초기엔 텍스트처리용으로 만들어졌던 펄은 언어의 확장성과 기능에 힘입어 점차 GUI와 네트워크, 데이터베이스 심지어 웹프로그래밍 용으로까지 발전했다. 결과적으로 펄은 범용 프로그래밍 언어로 발전하게 된 셈이다.
PHP는 처음부터 웹 프로그래밍을 목적으로 만들어진 스크립트 언어이다. 완벽하지는 않아도 객체지향적인 프로그래밍이 가능하고 웹 애플리케이션 개발과 관련된 거의 모든 기능도 제공하고 있다.
이런 과정에서 처음부터 범용적인 목적으로 만들어진 스크립트 언어들이 등장했다. 대표적인 것이 파이썬과 루비다. 두 언어 모두 완벽한 객체지향적인 프로그래밍이 가능하면서 매우 방대한 API를 통해서 범용 프로그래밍 언어가 할 수 있는 거의 모든 작업이 가능하도록 개발되었다. 이러한 언어들은 컴파일이 필요 없는 인터프리터기반이고 인터렉티브한 쉘을 지원하는 등의 스크립트 언어와 유사한 면이 있는 반면에 전통적인 스크립트 언어와는 차별되는 특징을 가지고 있다.
루비나 파이썬 같은 언어의 사용자들은 자신들이 사용하는 언어를 단지 스크립트 언어라고 부르는 것을 좋아하지 않는다. 대신 다이내믹 언어(Dynamic Language)나 다이내믹 스크립팅 언어(DSL)라고 부른다. 언어가 가진 다이내믹한 특성을 강조해서 부르는 것이다.
컴파일러 언어가 컴파일 할 때에 결정하는 많은 것들을 다이내믹 언어는 런타임 시에 결정한다. 다이내믹 언어의 특징으로는 실시간으로 코드를 해석하는 Eval이나 자신이 만들어진 시점의 콘텍스트를 액세스 할 수 있는 펑션 인스턴스인 클로저(Closure)가 있다. 또, 실행 상태를 저장했다가 나중에 재실행할 수 있도록 하는 컨티뉴에이션(Continuation), 프로그램의 코드 구조와 타입, 상태, 데이터 등을 실시간으로 분석할 수 있는 인트로스펙션(Introspection)과 리플렉션(Reflection) 등이 있다. 그 외에도 런타임 시에 프로그램의 기능과 타입을 스스로 확장할 수 있는 메타프로그래밍(Meta Programming)도 포함된다.
그 중에서도 가장 대표적인 특징은 다이내믹 타이핑(Dynamic Typing)이 가능하다는 사실이다. 그래서 최근에는 다이내믹 타이핑 언어(DTL)이라고도 불린다. 다이내믹 타이핑이란 객체지향 언어의 타입이 실시간으로 결정된다는 뜻이다. C++나 자바, C# 같은 언어의 스태틱 타이핑(Static Typing)방식과 비교해서 이런 다이내믹 타이핑이 최근 인기를 끌고 있는 스크립트 언어의 대표적인 특징이라고 볼 수 있다.
스크립트 언어 기반 프레임워크의 발전
애플리케이션을 개발하는데 프레임워크가 얼마나 중요한 지에 대해서는 더 이상 말할 필요도 없을 것이다. 특히 애플리케이션의 전 영역을 커버하는 애플리케이션 프레임워크는 날로 인기를 끌고 있다. 이제는 거의 대부분의 애플리케이션이 그러한 프레임워크 기반 위에서 개발된다.
다이내믹 스크립팅 언어가 아무리 심플하고 많은 장점을 가지고 있다 하더라도 그 자체로만은 견고하게 설계된 애플리케이션 프레임워크에서 개발되는 기존 개발방법과 비교해서는 부족한 것이 사실이다. 하지만 스크립트 언어도 점차로 다양한 프레임워크가 개발되었다. 이제는 스크립트 언어를 이용한 애플리케이션 개발에도 프레임워크를 사용하는 것이 점차 일반화되고 있다.
현재 가장 많이 개발되는 애플리케이션은 데이터베이스를 이용하는 웹 애플리케이션이다. 그래서 프레임워크도 이러한 웹 애플리케이션이 주류를 이루고 있다. 웹 개발에 최적화된 API를 가졌기 때문에 그 자체로도 코드가 매우 간결하다는 장점을 가진 PHP도 최근에는 수십여 개의 프레임워크가 인기를 끌고 있다. 파이썬이나 루비 또한 여러 가지 웹 애플리케이션 프레임워크를 보유하고 있다.
최근 스크립트 언어의 폭발적인 인기의 근원은 바로 루비를 기반으로 한 데이터베이스와 웹 애플리케이션 프레임워크인 루비온레일즈이다. 공개된 지 10년 이상 된 언어지만 소수의 마니아 층 외에는 그다지 관심을 가지고 있지 않던 루비가 지금은 개발자들이 가장 선호하는 대안언어로 부상한 배경에 루비온레일즈가 있음은 누구도 부인할 수 없을 것이다. 루비온레일즈는 다이내믹 스크립트 언어의 장점과 프레임워크의 편이성을 절묘하게 결합시켜서 만든 프레임워크로 개발자들 사이에서 기존의 언어와 개발방법보다 10배 이상의 생산성이 향상된다는 평가를 받고 있다. 생산성뿐만 아니라 스크립트 언어가 가진 심플함과 다이내믹 언어가 가진 유연성 덕분에 개발된 코드가 깔끔하고 품질이 높아진다는 장점도 가지고 있다.
기존 언어와 공존할 수 있는 가능성
아무리 좋은 언어가 나오더라도 개발자는 새 언어를 도입하기 전에 수많은 고민을 해야 한다. 그중에서 가장 큰 문제가 바로 기존 언어로 개발한 코드와 라이브러리들이 무용지물이 될 지도 모른다는 점이다.
물론 브릿지(bridge)를 개발해서 이용하거나 웹서비스와 같은 하이레벨의 연동방법을 사용하면 기존에 개발된 애플리케이션을 이용할 수 있다. 하지만 이 또한 방법이 매우 복잡하고 극히 제한적인 용도로 사용할 수밖에 없다. 최근에 등장하는 스크립트 언어들 중에는 이러한 문제점을 염두에 두고 처음부터 기존 언어와 결합을 용이하게 만드는 경우도 있다.
자바환경과 완벽한 결합이 가능한 것을 장점으로 내세우면서 등장한 그루비(Groovy)가 대표적인 예이다. 자바와 비슷한 문법체계를 가지고 자바 API를 자연스럽게 모두 불러다 사용할 수 있으면서 동시에 다이내믹 스크립트 언어의 장점도 모두 가지고 있는 언어이다. 따라서 언어를 바꿀 때 학습시간을 절약하게 해주고 기존에 개발한 자바 코드와 라이브러리를 모두 사용할 수 있게 해준다.
심지어 그루비 기반의 그레일즈(Grails)같은 프레임워크는 자바의 대표적인 프레임워크인 스프링과 하이버네이트를 핵심엔진으로 사용하면서 그루비 언어의 간결함을 극대화 할 수 있는 구조로 만들어져있다. 기존 자바영역에서 검증된 프레임워크를 사용하기 때문에 가지게 되는 신뢰성과 새로운 다이내믹 언어가 주는 아이디어들이 결합된 멋진 케이스라고 볼 수 있다. 그 외에도 자바언어의 디버깅과 인터렉티브한 사용을 목적으로 만들어진 빈쉘(BeanShell)도 처음부터 기존 언어와 결합을 목적으로 만들어진 경우이다.
이와는 다르게 독립적인 언어로 만들어졌지만 필요에 의해서 기존 언어와의 연동을 가지게 된 것들도 있다. 현재 가장 많이 쓰이는 개발 플랫폼인 자바와 닷넷은 둘 다 특정 언어에 종속적이지 않고 버추얼머신 기반의 유연한 플랫폼으로 설계되어있다. 따라서 그 위에서 구동 가능한 형태로 다양한 언어를 포팅 할 수 있다. 자바만 하더라도 200여개의 각종 언어가 JVM에서 구동될 수 있도록 개발되었다. 닷넷도 CLR 기반으로 구동되는 언어가 초기부터 여러 개로 시작해서 점차로 확대되는 중에 있다.
이런 플랫폼에 자연스럽게 다양한 스크립트 언어가 구동될 수 있는 인터프리터나 버추얼코드 컴파일러들이 등장했다. JVM에서 구동되는 대표적인 스크립트 언어는 파이썬의 JVM 버전인 자이썬(Jython)과 루비 인터프리터인 J루비(Ruby) 등이다.
CLR기반의 언어로는 파이썬을 구현한 IronPython과 루비를 CLR에서 구동할 수 있게 해주는 Ruby.NET이 있다. 구현들의 특징은 단지 기존 스크립트 언어를 버추얼머신에서 동작할 수 있게 만들어 주는데 그치지 않는다. 버추얼머신은 로우 레벨의 가상 바이트코드를 통해서 어떤 언어로 만들어진 코드라도 서로 연동할 수 있도록 해준다. 따라서 루비로 만들어진 코드에서 자바 API를 불러 쓰거나 파이썬으로 만들어진 코드에서 닷넷라이브러리를 호출 할 수 있는 것이다.
반대로 자바에서 루비로 만들어진 스크립트를 실행하고 그 결과를 가져오거나 인터페이스를 확장한 루비 클래스의 인스턴스를 이용할 수도 있다.
이정도 되면 독립적인 언어의 연동차원이 아니라 여러 개의 언어로 만든 코드가 마치 하나의 언어로 만들어진 애플리케이션처럼 융합되는 것과 같은 효과를 가져 올 수 있다.
스크립트 언어와 기존 언어의 상생
이렇게 기존 언어와 스크립트 언어를 결합해서 얻을 수 있는 장점은 무엇일까?
기존 언어는 점점 복잡해지고 어려워지고 있다고 한다. 계속 기능이 추가되면서 발전해온 언어는 처음 언어를 설계할 때 생각했던 것보다 훨씬 복잡하고 난해한 코드를 생산해 내고 있다. 동시에 날로 복잡해져 가는 애플리케이션을 더 짧은 시간에 개발해야 하는 부담이 증대되고 있기 때문에 높은 개발 생산성이 요구되고 있다. 이에 따라 기존 언어에서 가지고 있는 복잡도를 줄일 수 있는 영역은 점차로 스크립트 언어가 대체될 것은 분명하다.
똑같은 기능을 하는 두 개의 코드를 살펴보자. <리스트 1>은 자바로 만들어진 것이고 <리스트 2>는 그루비로 만들어진 것이다. 두 개의 코드는 예외처리까지 똑같은 기능으로 하고 있다. 성능을 극대화해야하는 특별한 시스템이 아니라면 이런 코드는 그루비로 만든 편이 좋다. 이렇게 하는 편이 생산성과 간결함으로 오는 오류를 줄이는데 훨씬 유리하기 때문이다.
(리스트)----------------------------------------------
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class WalkFile {
public static void main(String[] args) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("../simpleFile.txt");
String line = null;
while((line = br.readLine()) != null) {
System.out.println(line);
}
catch(FileNotNoundException e) {
e.printStackTrace();
}
catch(IOException e) {
e.printStackTrace();
}
finally {
if (br != null) {
try {
br.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
}
------------------------------------------------------
<리스트 1> 자바로 만든 파일처리 코드
(리스트)------------------------------------------------
import java.io.File
new File("simpleFile.txt").each { line ->
println(line)
}
--------------------------------------------------------
<리스트 2> 그루비로 만든 파일처리 코드
기존 언어 기반에서 스크립트 언어 활용하기
애플리케이션의 종류와 요구사항에 따라 스크립트 언어가 적용될 수 있는 부분은 매우 다양하다. 그중 대표적인 분야가 바로 웹 개발이다. 웹 개발은 스크립트 언어를 활용하는 것이 훨씬 편리하고 유리한 경우가 많다.
자바의 경우 표준 웹 개발 기술과 프레임워크가 정립되지 않아서 개발자들이 애를 먹고 있다. 어떤 방식으로도 자바로는 웹 개발에 최적화되고 편리한 방법을 만들기 힘들다는 주장도 점차로 제기되고 있다. 그래서 일부 개발자들은 자바로 만들어진 시스템에서 웹 영역을 루비나 그루비 같은 스크립트 언어로 개발하고 나머지 부분은 자바로 만들어 서로 연동하는 방법을 연구하고 있다.
대표적으로 스크립트 언어를 표준 빈(bean)으로 사용할 수 있도록 기능을 확장한 스프링 프레임워크는 자체 MVC 컨트롤을 자바가 아닌 루비나 그루비로도 만들 수 있는 기능도 제공하고 있다. 이를 이용해서 애플리케이션의 재배치(redeploy) 없이 웹 레이어의 스크립트 언어 코드를 수정하고 이를 실시간으로 변경할 수 있다.
스크립트 언어에서 기존 언어의 코드 활용하기
반대로 스크립트 언어의 프레임워크를 버추얼머신 기반의 플랫폼으로 가져오고 여기서 기존 언어로 개발된 코드나 라이브러리를 사용할 수 있도록 할 수 있다. J루비는 루비온레일wm를 JVM에서 구동할 수 있는 방법을 제공하고 있다. 그렇다면 루비온레일즈로 만들어진 스크립트 기반의 애플리케이션에서 자바로 만들어 놓은 레거시 시스템 연동 API나 비즈니스 로직 코드를 호출해서 사용하는 것도 가능할 것이다.
스크립트 언어를 도메인 레이어에 활용하기
또 간결한 스크립트 언어는 도메인 레이어에 활용되어질 수도 있다. 루비가 도메인 전용 언어(Domain Specific Language)로 사용하기에 매우 유리하다는 것은 잘 알려져 있는 사실이다. 이를 이용해서 루비로 만든 코드를 도메인 레이어로 구성하고 스마트 도메인 모델이나 DDD(Domain Driven Design)의 구현 등에 사용되고 기존 언어로 만들어진 인프라스트럭처 레이어나 데이터 레이어와 연동되어서 사용될 수 있다.
스크립트 언어 발전의 긍정적인 측면
결론적으로 스크립트 언어의 발전은 매우 반가운 일이다. 오랫동안 소수의 언어가 엔터프라이즈 개발을 장악해오고 그 결과 여러 가지 단점이 드러나고 있다. 이런 상황에 여러 고민을 해결해 줄 수 있는 많은 대안 기술과 특성을 가진 스크립트언어의 도전은 기존 언어의 변화와 발전에 긍정적인 자극이 되고 있다. 동시에 스크립트 언어가 기존 언어와 함께 사용되어질 수 있는 여러 방법이 등장하면서 애플리케이션 전 영역에 걸쳐서 구지 한 언어를 사용할 필요가 없어진 것이다.
느슨하게 연결된(loosely coupled) 시스템이 넓게 보자면 서비스지향아키텍처(SOA)로 구성될 수도 있다. 또, 협소하게는 한 개의 애플리케이션 안에서 그 필요에 따라 다양한 언어로 만들어진 코드들이 서로 자연스럽게 결합되어서 사용되는 형태로 만들어질 수 있는 것이다.
언어에 대한 유연한 태도가 필요
필자가 볼 때 모든 영역을 다 커버하고 모든 상황에 잘 들어맞는 최고의 언어란 존재할 수 없다. 모든 언어는 각자의 장점을 가지고 있다. 그것이 가장 잘 활용되어질 수 있는 상황과 영역이 제각기 따로 있는 것이다.
스크립트 언어는 한때 그 개발자는 프로그래머가 아니라 스크립터라고 비하될 정도로 무시되어져 왔다. 하지만 그런 오만함은 결국 기존 언어 개발자 스스로의 발등을 찍는 결과로 돌아왔다. 최고급의 아키텍처와 기술이라고 자랑하고 떠들썩했던 EJB가 결국 실패를 하고 초라해진 지금 개발자들은 언어와 기술을 대하는 자신의 자세에 대해서 다시금 진지하게 생각을 해야 할 것이다.
프로그래밍 언어는 그 자체의 장점을 증명하고 드러내기 위해 만들어 진 것이 아니다. 프로그래밍 언어는 그것을 이용해서 어떤 문제를 풀어내고 개발자들이 편리하게 개발할 수 있도록 해주는 도구로 활용될 때 가장 가치 있는 것이다. 그런 면에서 기존 언어가 낫다거나 스크립트 언어가 좋다는 식의 ‘언어 순수주의’적인 태도를 가진 경쟁은 지양해야 한다.
오히려 지금 많은 유연한 사고를 가진 개발자들에 의해서 만들어지고 있는 언어 상호간의 결합과 확장에 대한 노력을 지지해야 한다. 특히 그동안 개발자를 힘들게 했던 많은 고민들을 해결해 줄 수 있는 장점을 가진 스크립트 언어에 관심을 가지고 그것을 포용하려는 노력이 절실하게 필요하다.
참고 자료
1. 파이썬 홈페이지, http://www.python.org/
2. 루비 홈페이지, http://www.ruby-lang.org
3. 그루비 홈페이지, http://groovy.codehaus.org
4. JRuby 홈페이지, http://jruby.codehaus.org
5. Jython 홈페이지, http://www.jython.org
6. IronPython 홈페이지, http://www.ironpython.com
7. Ruby.NET 홈페이지, http://www.plas.fit.qut.edu.au/rubynet
|