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 : 브라우저가 별도로 지원함

자바스크립트의 특징

  • 인터프리터 언어(interpreter language)
  • 개발자가 별도의 컴파일 작업을 수행하지 않음

 

대부분의 모던 자바스크립트 엔진

  • 인터프리터와 컴파일러의 장점을 결합함
  • 비교적 처리 속도가 느린 인터프리터의 단점을 해결함
  • 크롬의 V8, 파이어폭스의 SpiderMonkey, 사파리의 JavaScriptCore, 마이크로소프트 엣지의 Chakra 등
컴파일러 언어 인터프리터 언어
코드가 실행되기 전 단계인 컴파일 타임에
소스코드 전체를 한번에
머신코드(기계어)로 변환한 후 실행한다.
코드가 실행되는 단계인 런타임에
문 단위로 한 줄씩
중간코드인 바이트코드로 변환한 후 실행한다.
실행 파일을 생성한다. 실행 파일을 생성하지 않는다.
컴파일 단계와 실행 단계가 분리되어 있다.
명시적인 컴파일 단계를 거치고, 명시적으로 실행 파일을 실행한다.
인터프리트 단계와 실행 단계가 분리되어 있지 않다.
인터프리터는 한 줄씩 바이트코드로 변환하고 즉시 실행한다.
실행 전에 컴파일은 단 한번 수행된다. 코드가 실행될 때 마다 인터프리트 과정이 반복 수행된다.
컴파일과 실행 단계가 분리되어 있으므로 코드 실행 속도가 빠르다. 인터프리트 단계와 실행 단계가 분리되어 있지 않고 반복 수행되므로
코드 실행 속도가 비교적 느리다.

ES6 브라우저 지원 현황

인터넷 익스플로러를 제외한 대부분의 모던 브라우저는 ES6를 지원하지만 100% 지원하고 있지는 않다.

Node.js는 v4부터 ES6를 지원하기 시작했다.

 

참고 : https://kangax.github.io/compat-table/es6/