02. 자바스크립트란?
2022. 9. 18. 17:09ㆍ기록/Modern JavaScript Deep Dive
- 목차
자바스크립트의 탄생
- 1995년, 웹 브라우저 시장을 지배하고 있던 넷프케이프 커뮤니케이션즈
- 웹페이지의 보조적인 기능을 수행하기 위한 언어를 도입하기로 결정함
- 브렌던 아이크(Brendan Eich)가 자바스크립트를 개발하게 됨
- 1996년 3월, 넷스케이프 내비게이터2(Netscape Navigator2)에 탑재됨
- 모카(Mocha)로 명명됨
- 9월, 라이브스크립트(LiveScript)로 이름이 바뀜
- 12월, 자바스크립트(JavaScript)라는 이름으로 최종 명명됨
- 얼마 지나지 않아 자바스크립트의 파생버전인 JScript가 출시됨
자바스크립트의 표준화
- 1996년 8월, 마이크로소프트는 JScript를 인터넷 익스플로러3.0에 탑재함
- 넷스케이프 커뮤니케이션즈 / 마이크로소프트는 자사 브라우저에서만 동작하는 기능을 경쟁적으로 추가하기 시작함
- 크로스 브라우징 이슈가 발생하기 시작함
- 브라우저에 따라 웹페이지가 정상적으로 동작하지 않는 것
- 1996년 11월, 넷스케이프 커뮤니케이션즈는 ECMA 인터내셔널에 자바스크립트의 표준화를 요청함
- 컴퓨터 시스템의 표준을 관리하는 비영리 표준화 기구
- 1997년 7월, 표준화된 자바스크립트 초판(ECMAScript 1)사양이 완성됨
- 상표권 문제로 자바스크립트는 ECMAScript로 명명됨
- 1999년, ECMAScript 3(ES3)이 공개됨
- 2009년, HTML5와 함께 표준사양으로 ECMAScript 5(ES5)가 출현함
- 2015년, ECMAScript 6(ES6)가 공개됨
- let/const 키워드, 화살표 함수, 클래스, 모듈 등을 도입하는 큰 변화가 있었음
- ES6 이후의 버전업은 비교적 작은 기능을 추가하는 수준으로 매년 공개할 것으로 예고되었음
[ ECMAScript 버전별 특징 ]
버전 | 출시 연도 | 특징 |
ES1 | 1997 | 초판 |
ES2 | 1998 | ISO/IEC 16262 국제 표준과 동일한 규격을 적용 |
ES3 | 1999 | 정규 표현식 try ... catch |
ES5 | 2009 | HTML5 와 함께 출현한 표준안 JSON strict mode 접근자 프로퍼티 프로퍼티 어트리뷰트 제어 향상된 배열 조작 기능 (forEach, map, filter, reduce, some, every) |
ES6 (ECMAScript 2015) | 2015 | let/const 클래스 화살표 함수 템플릿 리터럴 디스트럭처링 할당 스프레드 문법 rest 파라미터 심볼 프로미스 Map/Set 이터러블 for ... of 제너레이터 Proxy 모듈 import/export |
ES7 (ECMAScript 2016) | 2016 | 지수(**) 연산자 Array.prototype.includes String.prototype.includes |
ES8 (ECMAScript 2017) | 2017 | async/await Object 정적 메소드 - Object.values - Object.entries - Object.getOwnPropertyDescriptors |
ES9 (ECMAScript 2018) | 2018 | Object rest/spread 프로퍼티 Promise.prototype.finally async generator for await ... of |
ES10 (ECMAScript 2019) | 2019 | Object.fromEntries Array.prototype.flat Array.prototype.flatMap optional catch binding |
ES11 (ECMAScript 2020) | 2020 | String.prototype.matchAll BigInt globalThis Promise.allSettled null 병합 연산자 옵셔널 체이닝 연산자 for ... in enumeration order |
자바스크립트 성장의 역사
초창기 자바스크립트는 웹페이지의 보조적인 기능을 수행하기 위해 한정적인 용도로 사용되었다.
- 웹 서버 : 대부분의 로직 실행
- 브라우저 : 서버로부터 전달받은 HTML과 CSS를 단순히 렌더링
렌더링 (rendering)
- HTML, CSS, 자바스크립트로 작성된 문서를 해석해서 브라우저에 시각적으로 출력하는 것
- SSR(Server Side Rendering) 을 가리키기도 한다.
- SSR : 서버에서 데이터를 HTML로 변환해서 브라우저에게 전달하는 과정
1. Ajax (Asynchronous JavaScript and XML)
- 1999년, XMLHttpRequest 라는 이름으로 등장함
- 자바스크립트를 이용해 서버와 브라우저가 비동기 방식으로 데이터를 교환할 수 있는 통신 기능
- 서버로부터 필요한 데이터만 전송받아 변경해야 하는 부분만 렌더링하는 방식이 가능해짐
- 웹 브라우저에서도 데스크톱 애플리케이션처럼 빠른 성능과 부드러운 화면 전환이 가능해짐
2. jQuery
- 2006년, jQuery 의 등장으로 DOM을 더욱 쉽게 제어할 수 있게 됨
- 크로스 브라우징 이슈도 어느 정도 해결됨
- 배우기가 다소 까다로운 자바스크립트보다 배우기 쉽고 직관적인 jQuery를 더 선호하는 개발자가 양산됨
3. V8 자바스크립트 엔진
- 2008년, 구글이 발표함
- 더욱 빠르게 동작하는 자바스크립트 엔진
- 자바스크립트는 데스크탑 애플리케이션과 유사한 사용자 경험을 제공하는 웹 애플리케이션 프로그래밍 언어로 정착됨
- 자바스크립트의 발전으로 웹 서버에서 수행되던 많은 로직들이 클라이언트(브라우저)로 이동함
- 웹 애플리케이션 개발에서 프론트엔드 영역이 주목받기 시작함
4. Node.js
- 2009년, 라이언 달(Ryan Dahl)이 발표함
- 구글 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임 환경
- 자바스크립트를 브라우저 이외의 환경에서도 동작할 수 있도록한 자바스크립트 실행 환경
- 서버 사이드 애플리케이션 개발에 주로 사용되며, 이에 필요한 모듈, 파일 시스템, HTTP 등 내장 API를 제공함
- 비동기 I/O를 지원하며 단일 스레드 이벤트 루프 기반임
- 데이터를 실시간으로 처리하기 위해 I/O 가 빈번하게 발생하는 SPA(Single Page Application)에 적합함
- 하지만 CPU 사용률이 높은 애플리케이션에는 권장하지 않음
5. SPA 프레임워크
- 이전의 개발 방식으로는 복잡해진 개발 과정을 수행하기 어려워짐
- CBD(Component based development) 방법론을 기반으로 하는 SPA(Single Page Application)가 대중화 됨
- Angular, React, Vue.js, Svelte 등 다양한 SPA 프레임워크 / 라이브러리가 많이 사용되고 있음
자바스크립트와 ECMAScript
- 자바스크립트의 표준 사양인 ECMA-262 를 말함
- 프로그래밍 언어의 값, 타입, 객체와 프로퍼티, 함수, 표준 내장 객체 등 핵심 문법을 규정함
- 브라우저 제조사는 ECMAScript 사양을 준수해서 브라우저에 내장되는 자바스크립트 엔진을 구현함
자바스크립트
- ECMAScript 와 클라이언트 사이드 Web API 를 포함하고 있는 개념임
- ECMAScript: 일반적으로 프로그래밍 언어로서 기본 뼈대를 이룸
- 클라이언트 사이드 Web API : 브라우저가 별도로 지원함
- W3C(World Wide Web Consortium) 에서 별도의 사양으로 관리하고 있음
- 참고 : https://developer.mozilla.org/ko/docs/Web/API
자바스크립트의 특징
- 인터프리터 언어(interpreter language)
- 개발자가 별도의 컴파일 작업을 수행하지 않음
대부분의 모던 자바스크립트 엔진
- 인터프리터와 컴파일러의 장점을 결합함
- 비교적 처리 속도가 느린 인터프리터의 단점을 해결함
- 크롬의 V8, 파이어폭스의 SpiderMonkey, 사파리의 JavaScriptCore, 마이크로소프트 엣지의 Chakra 등
컴파일러 언어 | 인터프리터 언어 |
코드가 실행되기 전 단계인 컴파일 타임에 소스코드 전체를 한번에 머신코드(기계어)로 변환한 후 실행한다. |
코드가 실행되는 단계인 런타임에 문 단위로 한 줄씩 중간코드인 바이트코드로 변환한 후 실행한다. |
실행 파일을 생성한다. | 실행 파일을 생성하지 않는다. |
컴파일 단계와 실행 단계가 분리되어 있다. 명시적인 컴파일 단계를 거치고, 명시적으로 실행 파일을 실행한다. |
인터프리트 단계와 실행 단계가 분리되어 있지 않다. 인터프리터는 한 줄씩 바이트코드로 변환하고 즉시 실행한다. |
실행 전에 컴파일은 단 한번 수행된다. | 코드가 실행될 때 마다 인터프리트 과정이 반복 수행된다. |
컴파일과 실행 단계가 분리되어 있으므로 코드 실행 속도가 빠르다. | 인터프리트 단계와 실행 단계가 분리되어 있지 않고 반복 수행되므로 코드 실행 속도가 비교적 느리다. |
ES6 브라우저 지원 현황
인터넷 익스플로러를 제외한 대부분의 모던 브라우저는 ES6를 지원하지만 100% 지원하고 있지는 않다.
Node.js는 v4부터 ES6를 지원하기 시작했다.