Programming/javascript

자바스크립트는 무엇일까?

KOOCCI 2022. 6. 22. 22:05

목표 : 자바스크립트가 무엇인지, 생김새(?) 를 알아보자!


자바스크립트로 처음 개발을 시작해보았으니, 거의 10년 가까이 보고 지낸 언어다.

그럼에도 제대로 공부한건 불과 얼마 안되었기에, 한번 기초이론을 정리해보고자 한다.

 

자바스크립트는 기본적으로 웹페이지의 보조적인 기능(생동감을 불어주는)을 수행하기 위해 만들어졌다.

 

처음에는 여러 파생 언어들이 나와, 호환이 완결적이지 않은 크로스 브라우징 이슈가 발생하기 시작한다.

 

그로 인해, 꾸준히 발전하며 ECMAScript라는 표준 고유 명세를 가지게된 언어다.

 

어떻게 성장해왔을까?

 

최초에는 앞서 말한 대로, 웹페이지의 보조역할을 하였고 대부분 웹 서버로직 + HTML/CSS 랜더링 수준이었다.

더보기

랜더링 : HTML, CSS, 자바스크립트로 작성된 문서를 해석하여 브라우저에 시각적으로 출력하는 것

때로는 서버에서 데이터를 HTML로 변환하여 브라우저에 전달하는 과정(SSR: Server Side Rendering)을 말하기도 한다.

Ajax

서버와 브라우저가 비동기 방식으로 데이터를 교환할 수 있는 통신 기능인 Ajax(Asynchronous Javascript And XML)가 등장한다.

기존에 완전한 HTML을 전송받고, 전체를 랜더링하던 방식으로 화면이 전환되면 전체 웹페이지를 처음부터 렌더링하던 방식에서 필요한 부분의 데이터만 전송받아 변경하는 한정적 랜더링 방식이 가능해졌다.

 

jQuery

아직도 너무나 보편적인 라이브러리다.

jQuery의 가장 큰 역할은 다소 번거롭던 DOM(Document Object Model)을 좀 더 쉽게 제어할 수 있게 되고, 크로스 브라우징 이슈가 어느정도 해소될 수 있게 도와준 라이브러리다.

 

자바스크립트 엔진

자바스크립트는 브라우저뿐만 아니라 서버에서도 실행할 수 있다. 그 외에도 자바스크립트 엔진이 있으면 동작이 가능하다.

브라우저는 자바스크립트 가상 머신이라 불리는 엔진이 내장되어 있다.

엔진의 종류는 다양한데, 특유의 코드네임을 가지고 있다.

  • V8 - 구글에서 개발하고 Chrome과 Opera에서 쓰인다.
  • SpiderMonkey - Firefox에서 쓰인다.
  • IE - 버전에 따라, Trident, Chakra 등이 쓰인다.
  • Edge - ChakraCore 가 쓰인다.
  • Safari - SquirrelFish가 쓰인다.

즉, 엔진마다 지원 기능의 차이가 있을 수 있다.

또한 V8 엔진과 같은 엔진의 등장은 과거 웹 서버가 담당하던 로직들을 클라이언트(브라우저)로 이동했고, 이로 인해 웹 애플리케이션에서 프런트엔드 영역이 주목받게 되었다.

 

Node.js

Node.js는 V8엔진으로 빌드된 자바스크립트 런타임 환경이다.

조금 더 자세히 말하면 브라우저의 자바스크립트 엔진에서만 동작하던 자바스크립트를 브라우저 이외의 환경에서도 동작할 수 있도록 자바스크립트 엔진을 브라우저에서 독립시킨 자바스크립트 실행 환경이다.

 

Node.js는 모듈, 파일 시스템, HTTP 등 빌트인(built-in, 내장) API를 제공한다.

Node.js는 서버 환경에서도 자주 사용하기에, 백엔드와 클라이언트가 동일한 언어를 사용할 수 있어, 별도의 언어 학습없이 시작할 수 있는 좋은 길이기도 하다. (내가 그러한 경우다)

 

비동기I/O를 지원하며 단일 쓰레드 이벤트 루프 기반으로 동작해, 요청 처리 기능이 좋다.

즉, 데이터를 실시간으로 처리하기 위해, I/O가 빈번히 일어나는 SPA(Single Page Application)에 적합하지만, CPU 사용률이 높다면 권장되지 않는다.

 

더보기

CPU 사용률 : 한 컴퓨터 프로그램이 CPU를 차지하여 일을 한 시간의 양

Single Thread 이므로, 하나의 CPU를 오래 점유하면 그만큼 전체 퍼포먼스는 내려간다.

SPA 프레임워크

모던 웹 애플리케이션은 데스크톱 애플리케이션과 비교해도 손색없는 성능과 사용자 경험을 제공하는 것이 필수가 되었다. 즉, 개발 규모와 복잡도도 상승했다.

 

이전의 개발 방식으로는 복잡해진 개발 과정을 수행하기 어려워 지면서, 변경이 유연하고 확장이 쉬운 아키텍처를 요구하게 되고, 프레임워크가 등장한다.

 

그에 따라, CBD(Component Based Development) 방법론을 기반으로 하는 SPA 가 대중화 된다.

흔히, Angular, Vue.js, React 등이 그 대표적인 예시다.

 

더보기

CBD(Component Based Development)

모든 에러 확인의 시작점은 Divide & Conquer 이듯, 부품을 조립하듯 만드는 개발 방법이다.

Component는 독립적인 기능(서비스)을 제공하는 단위 소프트웨어 모듈을 의미하며, 이런 컴포넌트들은 결국 재사용성이나 대체성을 강화해준다.

ECMAScript

자바스크립트 표준 사양인 ECMA-262를 말한다.

프로그래밍 언어의 값, 타입, 객체와 프로퍼티, 함수, 표준 빌트인 객체 등 핵심 문법을 규정한다.

즉, 각 브라우저 제조사는 ECMAScript 사양을 준수해서 브라우저에 내장되는 자바스크립트 엔진을 구현한다.

 

자바스크립트는 일반적으로 기본 뼈대(Core)를 이루는 ECMAScript와, 브라우저가 별도로 지원하는 클라이언트 사이드 Web API, 즉 DOM, BOM, Canvas, XMLHttpRequest, fetch, requestAnimationFrame, SVG, Web Storage, Web Component, Web Worker등을 아우르는 개념이다.

 

자바스크립트의 특징은?

자바스크립트는 결국 웹 브라우저에서 동작하는 유일한 프로그래밍 언어다.

기본적으로 개발자가 별도로 컴파일을 하지 않는 인터프리터 언어이며, 대부분의 모던 자바스크립트 엔진은 인터프리터와 컴파일러의 장점을 결합해 비교적 처리 속도가 느린 단점을 해결하고 있다.

 또한, 명령형, 함수형, 프로토타입 기반 객체지향 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어다.

컴파일러 언어 인터프리터 언어
코드가 실행되기 전 컴파일 타임에 소스코드 전체를 한번에 머신 코드로 변환한 후 실행 코드가 실행되는 단계인 런타임에 한줄씩 중간 코드인 바이트 코드로 변환한 후 실행
실행 파일을 생성 실행 파일을 생성하지 않음
컴파일 단계와 실행 단계가 분리, 명시적인 컴파일 단계를 가지고, 명시적으로 실행 파일을 실행 인터프리트 단계와 실행 단계가 구분되어 있지 않음. 한 줄씩 바이트코드로 변환하고 즉시 실행
컴파일과 실행단계가 분리되어 있으므로 코드 실행 속도가 빠르다. 인터프리터 단계와 실행 단계가 분리되어 있지 않고 반복 수행되어 코드 실행 속도가 느리다.

실행 환경이 중요하다?

모든 브라우저는 자바스크립트 엔진을 내장하며, Node.js도 자바스크립트 엔진을 가지고 있다.

즉, 위와 같은 환경에서 자바스크립트는 실행할 수 있다.

다만, 브라우저와 Node.js는 용도가 다른점이 있다.

 

  • 브라우저
    • HTML, CSS, 자바스크립트를 실행해 웹페이지를 화면에 렌더링 하는 것이 목적
    • 파싱된 HTML 요소를 선택하거나 조작하는 기능의 집합인 DOM API를 기본 제공
    • 보안상의 이유로 파일 CRUD(운영체제 역할), 디바이스 상호작용 (마이크 등), Same Origin Policy 등 제약이 있다.
  • Node.js
    • 브라우저 외부에서 자바스크립트 실행 환경을 제공하는 것이 목적
    • DOM API를 제공하지 않는다.
    • 파일의 생성과 수정을 지원하는 파일 시스템을 기본 제공한다.

조금 더 설명하자면, 모던 자바스크립트는 매우 안전한 프로그래밍 언어다.

메모리나 CPU같은 저수준 영역의 조작을 허용하지 않는다.

이런 접근이 불필요한 브라우저를 대상으로 만들어졌기 때문이다.