자바스크립트(JavaScript)의 역사와 배경
Series: JavaScript
JavaScriptcontains 1
들어가며
사마천의 술왕사 지래자(지난 일을 기술하여 다가올 일을 안다)에서 유래된 말이 있다.
역사는 현재를 비추는 거울이고 미래의 길을 제시하는 나침반이다
기술도 마찬가지다. 지금 우리가 사용하는 기술이 왜 이런 형태를 가지게 되었는지 이해하려면, 그 기술이 어떤 배경에서 탄생했고 어떤 과정을 거쳐 발전해왔는지를 아는 것이 중요하다. JavaScript 역시 단순히 웹에서 쓰는 언어라고 보기에는 그 역사와 맥락이 꽤 흥미롭다. 특히 JavaScript는 처음부터 거창한 설계 아래 만들어진 언어가 아니라, 급하게 만들어졌고, 경쟁 속에서 살아남았으며, 표준화 과정을 통해 지금의 모습이 된 언어이다. 이 글에서는 JavaScript가 어떻게 탄생했고, 어떤 사건들을 거쳐 지금의 위치까지 오게 되었는지를 흐름 중심으로 정리해보려고 한다.
1. 정적인 웹에서 동적인 웹으로
1990년대 초반의 웹은 지금과 완전히 달랐다. 당시 웹 페이지는 HTML로만 구성된 정적인 문서였다. 사용자는 링크를 클릭하면 새로운 페이지로 이동하는 방식으로만 상호작용할 수 있었다. 이러한 흐름 속에서 1993년, Mosaic이라는 브라우저가 등장한다. Mosaic은 최초로 이미지와 텍스트를 함께 보여주는 UI 기반 브라우저였고, 이후 웹의 대중화를 이끄는 중요한 계기가 된다.
Mosaic 개발을 이끌었던 Marc Andreessen은 이후 Netscape를 창업하고, 더 발전된 브라우저인 Netscape Navigator를 출시한다.
이 브라우저는 당시 웹 시장의 약 80%를 차지할 정도로 큰 성공을 거둔다. 하지만 이 시점에서 웹은 여전히 정적인 문서에 가까웠다. 버튼을 눌러도 아무 반응이 없고, 입력값 검증도 서버에 요청을 보내야만 가능했다. 사용자 경험 측면에서 한계가 분명했다. 그래서 Netscape는 이런 고민을 하게 된다.
브라우저 안에서 바로 동작하는 스크립트 언어가 필요하지 않을까?
2. JavaScript의 탄생
1995년, Netscape는 Brendan Eich를 영입한다. 그리고 매우 짧은 시간 안에 웹에서 동작할 수 있는 스크립트 언어를 만들어달라는 요청을 한다. 그 결과 탄생한 것이 바로 JavaScript다. 흥미로운 점은, JavaScript가 처음부터 JavaScript라는라는 이름이 아니었다는 것이다.
flowchart LR
A[Mocha] --> B[LiveScript]
B --> C[JavaScript]당시 Java라는 언어는 '한 번 작성하면 어디서든 실행된다(Write Once, Run Anywhere)'라는 슬로건과 함께 큰 인기를 끌고 있었다. 기업용 애플리케이션뿐만 아니라 웹에서도 활용 가능성이 주목받으면서, 개발자들 사이에서 매우 강력한 언어로 자리 잡고 있었다. 이러한 상황에서 Netscape는 자신들이 만든 스크립트 언어를 시장에 빠르게 확산시키기 위해 하나의 전략을 선택한다. 바로, 이미 인지도가 높은 Java라는 이름을 활용하는 것이었다. 그 결과 LiveScript라는 이름을 사용하던 언어는 JavaScript라는 이름으로 변경된다.
하지만 이름과는 달리 JavaScript는 Java와 설계 철학부터 실행 방식까지 거의 모든 면에서 다른 언어이다. Java가 클래스 기반의 정적 타입 언어라면, JavaScript는 프로토타입 기반의 동적 타입 언어이다. 또한 Java는 컴파일 과정을 거쳐 실행되지만, JavaScript는 브라우저에서 즉시 해석되어 실행되는 인터프리터 방식에 가깝다. 즉, 두 언어는 이름만 비슷할 뿐 실제로는 전혀 다른 목적과 특징을 가진 언어라고 볼 수 있다.
JavaScript가 빠르게 확산될 수 있었던 이유는 단순히 이름 덕분만은 아니었다. 이 언어는 웹 환경에 매우 잘 맞는 몇 가지 중요한 특징을 가지고 있었다. 우선, JavaScript는 별도의 설치 과정 없이 브라우저만 있으면 바로 실행할 수 있었다. 사용자가 어떤 웹 페이지에 접속하면, 그 안에 포함된 JavaScript 코드가 즉시 실행되기 때문에 별도의 프로그램을 설치할 필요가 없었다. 이는 웹을 사용하는 진입 장벽을 낮추는 데 큰 역할을 했다.
또한 문법이 비교적 간단하고 유연했기 때문에, 기존에 프로그래밍 경험이 많지 않은 사람들도 비교적 쉽게 접근할 수 있었다. HTML과 함께 사용되면서 자연스럽게 웹 개발의 일부로 받아들여졌고, 많은 개발자들이 빠르게 익히게 되었다. 무엇보다 중요한 점은, JavaScript를 통해 웹 페이지를 동적으로 만들 수 있게 되었다는 것이다. 버튼을 클릭하면 화면이 바뀌고, 입력값을 즉시 검증하며, 페이지 전체를 새로고침하지 않고도 일부만 업데이트할 수 있는 기능들이 가능해졌다.
이전까지의 웹이 단순히 정보를 보여주는 정적인 공간이었다면, JavaScript의 등장 이후 웹은 사용자와 상호작용하는 공간으로 변화하기 시작했다. 즉, JavaScript는 웹을 '문서'에서 '애플리케이션'으로 발전시키는 데 중요한 역할을 한 언어라고 볼 수 있다.
3. 브라우저 전쟁과 혼돈의 시대
1995년 8월, Netscape의 성공을 지켜보던 Microsoft는 웹 브라우저 시장에 뛰어든다. 그리고 Internet Explorer(IE)를 출시하면서 본격적인 경쟁이 시작된다. 문제는 여기서 발생한다. Microsoft는 JavaScript를 그대로 사용하지 않고, JScript라는 자체 구현 언어를 만들어버린다. 표준이 없는 상태에서 각 브라우저가 서로 다른 방식으로 JavaScript를 구현하기 시작한 것이다. 그 결과, Netscape에서는 잘 동작하는 코드가 IE에서는 동작하지 않거나, IE에서 동작하는 코드가 다른 브라우저에서는 동작하지 않는 문제가 발생한다. 당시 웹사이트에는 이런 문구가 흔했다.
이 사이트는 Internet Explorer에서 최적화되어 있습니다.이 시기는 브라우저 전쟁(Browser War)이라고 불리며, 개발자 입장에서는 매우 혼란스러운 시대일 수 밖에 없었다.
flowchart LR
Netscape[Netscape Navigator] --> JS[JavaScript]
Microsoft[Internet Explorer] --> JScript[JScript]
JS --> Conflict[호환성 문제]
JScript --> Conflict4. ECMAScript의 등장 (표준의 시작)
이 혼란을 해결하기 위해 Netscape는 표준화를 제안하게 된다. 그리고 1997년, ECMA International에서 JavaScript의 표준을 정의하게 된다. 이 표준이 바로 ECMAScript이다. 여기서 헷갈릴 수 있는데, JavaScript는 언어 이름이고, ECMAScript는 그 언어의 명세(스펙)이다.
즉,
- ECMAScript → 규칙
- JavaScript → 그 규칙을 구현한 언어
표준이 생기면서 브라우저 간 호환성 문제는 점점 개선되기 시작한다. 하지만 이 과정이 순탄했던 것은 아니다.
5. 정체기와 개발자들의 대응
2000년대 초반, Internet Explorer의 점유율이 90% 이상으로 올라가면서 Microsoft는 더 이상 표준화에 적극적으로 참여하지 않게 된다. 이 시기는 JavaScript 발전이 상당히 느려졌던 시기다. 하지만 웹은 계속 성장하고 있었고, 개발자들은 문제를 해결해야 했다. 그래서 등장한 것이 바로 라이브러리이다. 대표적으로 jQuery, Prototype, Dojo, MooTools가 있다. 이 라이브러리들의 공통 목표는 하나였다.
'브라우저 차이를 신경 쓰지 않고 개발할 수 있게 하자'
예를 들어 jQuery는 이런 식으로 사용됐다.
$('#button').click(function () {
alert('clicked');
});이 코드 하나로 다양한 브라우저에서 동일하게 동작하도록 만들어준다.
6. Ajax와 웹의 변화
이 시기에 또 하나 중요한 기술이 등장한다. 바로 Ajax(Asynchronous JavaScript and XML)이다. Ajax는 페이지 전체를 새로고침하지 않고도 서버와 데이터를 주고받을 수 있게 해준다.
sequenceDiagram
participant Client
participant Server
Client->>Server: 데이터 요청 (비동기)
Server-->>Client: 데이터 응답
Client->>Client: 화면 일부 업데이트이 기술 덕분에 웹은 단순한 문서를 넘어서 애플리케이션 형태로 발전하게 된다.
7. Chrome의 등장과 JavaScript의 부활
2008년, Google은 Chrome 브라우저를 출시한다. 이 브라우저에는 V8이라는 새로운 JavaScript 엔진이 탑재되어 있었는데, 이는 기존 브라우저들과 비교했을 때 JavaScript 실행 속도를 획기적으로 개선한 엔진이었다. 단순히 조금 빠른 수준이 아니라, JavaScript로 작성된 코드가 이전보다 훨씬 빠르게 실행되면서 웹 애플리케이션의 가능성을 크게 넓힌 사건이었다.
이 변화는 단순히 Chrome 하나의 성공으로 끝나지 않았다. V8 엔진의 등장으로 인해 JavaScript 실행 속도가 눈에 띄게 향상되자, 다른 브라우저 개발사들도 더 이상 성능 경쟁을 피할 수 없게 되었다. 그 결과 Firefox, Safari, Opera 등 다양한 브라우저들이 자체 엔진을 개선하며 경쟁적으로 성능을 끌어올리기 시작한다. 이 시점부터 웹 브라우저는 단순히 페이지를 보여주는 도구가 아니라, 하나의 실행 환경(runtime)으로 발전하게 된다.
이러한 성능 경쟁은 자연스럽게 JavaScript 자체에 대한 관심으로 이어졌다. 과거에는 브라우저마다 구현이 달라 개발자들이 고통받던 시기였다면, 이제는 더 빠르고, 더 일관된 JavaScript 환경을 만들기 위한 논의가 활발해진다. 이 과정에서 표준화에 대한 필요성이 다시 강조되었고, 그동안 정체되어 있던 ECMAScript 발전도 다시 속도를 내기 시작한다.
그 결과, 2009년에는 ECMAScript 5가 등장하여 기존 문법을 정리하고 안정성을 높이는 방향으로 발전하게 된다. 그리고 2015년, ECMAScript 6(ES6)가 발표되면서 JavaScript는 사실상 새로운 전환점을 맞이하게 된다. ES6는 단순한 문법 추가 수준이 아니라, 언어의 사용 방식 자체를 바꿔놓을 정도로 큰 변화를 포함하고 있었다. 예를 들어, 기존에는 함수를 다음과 같이 작성해야 했다.
function sum(a, b) {
return a + b;
}하지만 ES6 이후에는 훨씬 간결한 형태로 표현할 수 있게 된다.
const sum = (a, b) => a + b;이처럼 화살표 함수(Arrow Function), let과 const, 클래스 문법, 모듈 시스템 등 다양한 기능들이 추가되면서 JavaScript는 더 이상 단순한 스크립트 언어가 아니라, 대규모 애플리케이션을 개발할 수 있는 언어로 발전하게 된다. 결국 Chrome과 V8 엔진의 등장은 단순한 브라우저 출시 이상의 의미를 가진다. 이는 JavaScript의 성능을 끌어올리고, 브라우저 간 경쟁을 촉진하며, 표준화 논의를 다시 활성화시킨 계기가 되었고, 그 결과 JavaScript는 장난감 언어라는 이미지를 벗고 본격적인 프로그래밍 언어로 자리 잡게 되었다.
8. 현대 JavaScript 생태계
현재의 JavaScript는 더 이상 브라우저 안에서만 동작하는 단순한 스크립트 언어가 아니다. 과거에는 웹 페이지에 약간의 동적인 기능을 추가하는 역할에 머물렀다면, 지금은 하나의 언어로 다양한 플랫폼을 아우를 수 있는 범용 프로그래밍 언어로 자리 잡았다. 이러한 변화의 시작점 중 하나는 Node.js의 등장이다. Node.js는 JavaScript를 브라우저 밖, 즉 서버 환경에서도 실행할 수 있게 만들어주었다. 그 결과 개발자들은 더 이상 서버 개발을 위해 Java나 Python 같은 다른 언어를 반드시 배워야 할 필요가 없어졌고, JavaScript 하나로 프론트엔드와 백엔드를 모두 다루는 것이 가능해졌다.
프론트엔드 영역에서도 JavaScript의 역할은 크게 확장되었다. React, Vue, Angular와 같은 프레임워크와 라이브러리들은 복잡한 사용자 인터페이스를 효율적으로 관리할 수 있도록 도와주었고, 이를 통해 웹은 단순한 페이지의 집합이 아니라 하나의 애플리케이션으로 발전하게 되었다. 상태 관리, 컴포넌트 기반 구조, 가상 DOM 같은 개념들이 등장하면서 JavaScript는 점점 더 구조적인 개발을 요구하는 언어가 되었다.
또한 JavaScript는 데스크탑과 모바일 영역까지 확장되었다. Electron을 사용하면 웹 기술을 기반으로 데스크탑 애플리케이션을 만들 수 있고, React Native를 활용하면 하나의 코드베이스로 iOS와 Android 애플리케이션을 개발할 수 있다. 이는 한 번 배우면 여러 플랫폼에서 활용할 수 있는 언어라는 JavaScript의 강점을 더욱 부각시킨다. 이러한 흐름을 종합해보면, JavaScript는 이제 특정 환경에 종속된 언어가 아니라 다양한 실행 환경에서 동작하는 범용 언어가 되었다고 볼 수 있다. 즉, 하나의 언어로 웹, 서버, 모바일, 데스크탑까지 다룰 수 있는 시대가 열린 것이다.
한편, JavaScript 생태계가 빠르게 발전하면서 또 하나의 문제가 등장했다. 바로 브라우저 간의 지원 차이이다. 최신 JavaScript 문법은 계속 추가되지만, 모든 사용자가 최신 브라우저를 사용하는 것은 아니기 때문에 호환성 문제가 발생할 수 있다. 이 문제를 해결하기 위해 등장한 것이 바로 Babel과 같은 트랜스파일러이다. 개발자는 ES6 이상의 최신 문법을 사용해 코드를 작성하고, 이를 구형 브라우저에서도 실행 가능한 코드로 변환하는 과정을 거치게 된다.
flowchart LR
ES6[최신 JS 코드] --> Babel
Babel --> ES5[구형 브라우저 호환 코드]이 구조 덕분에 개발자는 생산성을 유지하면서도 다양한 환경을 지원할 수 있게 되었다. 다시 말해, JavaScript 생태계는 단순히 언어의 발전뿐만 아니라, 이를 둘러싼 도구들과 플랫폼이 함께 성장하면서 지금의 모습을 갖추게 된 것이다.
마치며
JavaScript는 처음부터 완벽하게 설계된 언어가 아니었다. 오히려 짧은 시간 안에 만들어졌고, 브라우저 경쟁 속에서 혼란을 겪었으며, 표준화 과정을 통해 점점 다듬어진 언어이다. 이 과정을 보면 JavaScript의 특징들이 왜 그렇게 설계되었는지도 이해할 수 있다.
유연하지만 때로는 혼란스러운 문법, 브라우저 중심의 구조, 표준화의 중요성
결국 JavaScript를 잘 이해한다는 것은 단순히 문법을 아는 것이 아니라, 왜 이런 형태가 되었는지를 이해하는 것이라고 생각한다. 이 글이 JavaScript를 공부하는 방향을 잡는 데 작은 도움이 되었으면 한다.