자바스크립트 기술면접 1편

Genie·2021년 6월 2일
29
post-thumbnail
  • 자바스크립트의 탄생

1995년 넷스케이프 커뮤니케이션즈에서 웹 페이지의 보조적인 기능을 수행하기 위해 브라우저에서 동작하는 경량 프로그래밍 언어를 도입하기를 결정한다. 그래서 탄생한 것이 브랜던 아이크가 개발한 자바스크립트이다.


  • 크로스 브라우징 이슈가 발생하기 시작한 이유

넷스케이프 커뮤니케이션즈와 마이크로소프트는 자사 브라우저의 시장 점유율을 높이기 위해 자사 브라우저에서만 동작하는 기능을 경쟁적으로 추가하기 시작했다. 이로 인해 브라우저에 따라 웹 페이지가 정상적으로 동작하지 않는 크로스브라우징 이슈가 발생하기 시작했고, 결과적으로 모든 브라우저에서 정상적으로 동작하는 웹 페이지를 개발하기가 무척 어려워졌다.


  • ECMAScript가 등장하게된 이유

자바스크립트의 파편화를 방지하고 모든 브라우저에서 정상적으로 동작하는 JS의 필요성이 대두되기 시작했다. 그래서 1997년 ECMA-262라 불리는 표준화된 JS 초판(ECMAScript 1) 사양이 완성되었고, ECMAScript로 명명되었다.

- ECMAScript 버전별 특징


  • 렌더링(rendering)

HTML, CSS, JS로 작성된 문서를 해석해서 브라우저에 시각적으로 출력하는 것을 말한다. 때로는 서버에서 데이터를 HTML로 변환해서 브라우저에게 전달하는 과정(SSR: Server Side Rendering)을 가리키기도 한다.


  • SPA란?

SPA는 최초 한 번 페이지 전체를 로딩한 후, 데이터만 변경하여 사용할 수 있는 애플리케이션을 의미한다.

SPA는 클라이언트 사이드 렌더링 방식이다.

SPA는 기본적으로 페이지 로드가 없고, 모든 페이지는 단순히 HTML5 History에 의해 렌더링될 뿐이다. 그래서 언제 새로운 데이터를 불러와야 할지 스스로 정해서 구현해야한다.

전통적인 웹 방식(SSR)은 SPA 방식에 비해 성능문제 이슈가 있었다.

전통적인 웹 방식(SSR)은 요청 시 마다 새로고침이 일어나며 페이지를 로딩할 때마다 서버로부터 리소스를 전달받아 해석하고 렌더링하는 방식이기 때문이다.

이 방식은 사용자와 인터렉션이 많은 요즘 웹앱에서는 충분하지 않은 방법이다. 렌더링을 서버쪽으로 하는 것은, 그만큼 서버 자원이 사용되는 것이고 불필요한 트래픽도 낭비되는 것이다.

반면 클라이언트 사이드 렌더링은 사용자의 행동에 따라 필요한 부분만 다시 읽어들이기 때문에 서버 측에서 렌더링하여 전체 페이지를 다시 읽어들이는 것보다 빠른 인터렉션을 기대할 수 있다.

서버는 단지 JSON 파일만 보내주고, html을 그리는 역할은 JS를 통해 클라이언트 측에서 수행한다.


  • CSR(클라이언트 사이드 렌더링)과 SSR(서버 사이드 렌더링)의 차이점

CSR(클라이언트 사이드 렌더링)

  • 장점
    1. 필요한, 변경된 데이터만 받아서 그리기 때문에 트래픽이 감소한다.
    2. 새로고침이 발생하지 않아 사용자가 네이티브 앱과 비슷한 경험을 할 수 있다.

  • 단점

  1. 검색엔진(SEO)
    JS 위주로 돌아가는 프로젝트는 JS 엔진이 돌아가지 않으면 원하는 정보를 표시해주지 못한다. 구글의 검색엔진에는 JS 엔진이 내장되어 있지만 네이버, 다음 등의 검색엔진은 제대로 크롤링하지 못하기 때문에 SSR을 따로 구현해야한다. 즉, JS 엔진이 돌아가지 않으면 html 파일을 읽을수가 없기때문에 SEO문제가 발생한다.

SSR(서버 사이드 렌더링)

  • 장점
  1. SEO 가능(JS엔진 없이 완전한 페이지를 받기 떄문에 SEO가 가능)

  2. 성능 개선

    첫 렌더링된 html을 클라이언트에게 전달해주기 때문에 초기 로딩속도를 많이 줄여줄 수 있다. JS 파일을 불러오고 렌더링 작업이 완료되기 전에 사용자가 사이트 컨텐츠를 이용할 수 있게 된다.

  • 단점
  1. 페이지를 이동할 때마다 요청을 보내기 때문에 트래픽이 증가한다.
  2. 페이지를 이동할 때 화면이 깜빡거리는 문제가 있다.

  • Ajax(Asynchronous Javascript And XML)란?

자바스크립트를 이용해 서버와 브라우저가 비동기 방식으로 데이터를 교환할 수 있는 통신 기능인 Ajax가 XMLHttpRequest라는 이름으로 등장했다.

이전의 웹 페이지는 html 태그로 시작해서 html 태그로 끝나는 완전한 HTML 코드를 서버로부터 전송받아 웹 페이지 전체를 렌더링 하는 방식으로 동작했다. 따라서 화면이 전환되면 서버로부터 새로운 HTML을 전송받아 웹 페이지 전체를 처음부터 다시 렌더링했다. 이러한 방식은 변경할 필요가 없는 부분까지 포함된 HTML 코드를 다시 전송받기 때문에 성능 면에서 불리하다. 이로 인해 화면이 전환되면 화면이 순간적으로 깜빡이는 현상이 발생하였다.

Ajax의 등장은 이전의 패러다임을 획기적으로 전환했다. 즉, 웹 페이지에서 변경할 필요가 없는 부분은 다시 렌더링하지 않고, 서버로부터 필요한 데이터만 전송받아 변경해야 하는 부분만 한정적으로 렌더링하는 방식이 가능해진 것이다. 이로써 웹 브라우저에서도 데스크톱 애플리케이션과 유사한 빠른 성능과 부드러운 화면 전환이 가능해졌다.


  • V8 자바스크립트 엔진

V8 엔진의 등장으로 자바스크립트는 데스크톱 애플리케이션과 유사한 사용자 경험(UX)을 제공할 수 있는 웹 애플리케이션 프로그래밍 언어로 정착하게 되었다. 또한 웹 서버에서 수행되던 로직들이 대거 클라이언트(브라우저)로 이동했고, 이는 웹 애플리케이션 개발에서 프론트엔드 영역이 주목받는 계기로 작용했다.


  • Node.js란?

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

Node.js는 브라우저의 자바스크립트 엔진에서만 동작하던 자바스크립트를 브라우저 이외의 환경에서도 동작할 수 있도록 자바스크립트 엔진을 브라우저에서 독립시킨 자바스크립트 실행 환경이다.

Node.js는 비동기 I/O를 지원하며 단일 스레드 이벤트 루프 기반으로 동작함으로써 요청 처리 기능이 좋다.

따라서 Node.js는 데이터를 실시간으로 처리하기 위해 I/O이 빈번하게 발생하는 SPA에 적합하다. 하지만 CPU 사용률이 높은 애플리케이션에는 권장하지 않는다.

Node.js의 등장으로 자바스크립트는 이제 프론트엔드 영역은 물론 백엔드 영역까지 아우르는 웹 프로그래밍 언어의 표준으로 자리 잡고 있다.


  • ECMAScript란?
    • 자바스크립트 표준 사양인 ECMA-262를 말하며, 핵심 문법을 규정한다.
    • 각 브라우저 제조사는 ECMAScript 사양을 준수해서 브라우저에 내장되는 자바스크립트 엔진을 구현한다.

  • 자바스크립트란?
    • 웹 브라우저에서 동작하는 유일한 프로그래밍 언어이다.
    • 자바스크립트는 개발자가 별도의 컴파일 작업을 수행하지 않는 인터프리터 언어이다.

  • 프론트앤드 라이브러리, 프레임워크(React, Angular, Vue 등)를 사용하는 이유

프로젝트 규모가 커지고, 다양한 유저 인터렉션이 전달된다면 그만큼 DOM 요소들 또한 변화가 이루어져야 한다. DOM 요소들이 변화하면 렌더 트리를 재생성하거나 리플로우, 리페인트 과정을 거쳐야 한다. 이런 과정이 반복될수록 많은 연산을 해야한다는 것이고, 이는 전체적인 프로세스의 비효율성을 야기한다. 또한 많은 DOM 요소의 변화를 개발자가 직접 관리하는 것은 적지 않은 짐으로 다가온다. 결국 React, Angular, Vue와 같은 라이브러리는 DOM 관리와 상태 변화 관리를 최소화하고, 개발자 오직 기능 개발, 사용자 인터페이스에 더 집중할 수 있도록 도와주기 때문에 사용한다.


  • 명령형 vs 선언형

명령형: 무엇을 어떻게 할 것인가? (How) ⇒ 자바스크립트

선언형: 무엇을? (What?) ⇒ 선언형


  • React를 사용하는 이유

⇒ 생산성과 유지보수를 용이하게 한다.

리액트에서는 컴포넌트 단위로 작성을 한다. 컴포넌트는 UI를 구성하는 개별적인 뷰 단위로서, UI 개발을 레고라고 한다면, 컴포넌트는 블록 역할을 하게 된다. 이러한 블록을 조립해 하나의 완성품을 만드는 것과 같다. 이러한 특징은 하나의 컴포넌트를 여러 부분에서 재사용할 수 있게 해준다.


  • JSX(Javascript + xml)

자바스크립트에 대한 확장 구문으로서, 리액트에서 요소를 제공해준다. 그래서 개발자가 단순히 마크업 코드에 익숙하다면 그것만으로도 JSX를 통해 컴포넌트를 구성하는데 쉽게 적응할 수 있다는 장점이 있다. JSX 코드는 Babel이 트랜스파일링해준다. 덕분에 익숙한 HTML 문법과 유사한 JSX를 통해 컴포넌트를 생성할 수 있게 된다.


  • Virtual DOM

유저의 인터렉션에 의해 상태변화가 일어나면 브라우저 작동 원리에 의해 렌더링 과정을 반복하게 된다. Virtual DOM은 이러한 과정에 의해 발생하는 비효율성을 최소화하기 위해 탄생하였다. 리액트는 성공적으로 가상돔의 개념을 적용한 선발 주자라고 할 수 있다.


  • 변수란?

값을 저장하기 위해 확보된 메모리 공간 자체


  • 자바스크립트에서 변수를 사용하는 이유?

값을 재사용하기 위해서


  • 변수 호이스팅이란?

변수는 선언 단계 초기화 단계로 나누어 진행된다. 그 중 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징이 호이스팅이다. 자바스크립트 엔진은 소스코드 평가과정에서 모든 선언문을 찾아내 먼저 실행한다. 따라서 변수 선언이 소스코드의 어디에 위치하는지와 상관없이 어디서든지 변수를 참조할 수 있다. 호이스팅은 스코프 단위로 동작한다. 즉, 호이스팅은 변수 선언이 스코프의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 말한다.


  • 가비지 콜렉터란?

애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되고 있지 않는 메모리를 해제하는 기능을 말한다. 자바스크립트는 가비지 콜렉터를 내장하고 있는 매니지드 언어로서 가비지 콜렉터를 통해 메모리 누수를 방지한다.


  • 자바스크립트 가비지 콜렉터 알고리즘 알고계시나요?

마크 앤 스위프(Mark-and-sweep) 알고리즘

  1. 가비지 콜렉터는 루트를 획득하여 그들을 마크(기억)한다.

여기서 루트는 코드에서 참조되는 전역변수이다. ex) window, global

  1. 그런 다음 모든 루트와 그 자식들을(자식의 자식 계속 타고 검사) 검사해서 마크한다. (활성상태 여부를 체크한다.)

  2. 마지막으로 가비지 컬렉터는 활성으로 표시되지 않은 모든 메모리를 OS에 반환한다.


  • 예약어

예약어는 프로그래밍 언어에서 사용되고 있거나 사용될 예정인 단어를 말한다.


  • 자바스크립트에서 일반적인 네이밍 컨벤션
    • 변수, 함수이름 ⇒ 카멜케이스
    • 생성자 함수, 클래스 이름 ⇒ 파스칼 케이스(앞에 대문자)

  • 자바스크립트 데이터 타입(자료형)

    • 자바스크립트는 7개의 데이터 타입을 제공한다.
    • 데이터 타입은 원시타입(primitive type)객체타입(reference type)으로 분류할 수 있다.
    1. 원시 타입

      • 숫자(number)
      • 문자열(string)
      • 불리언(boolean)
      • undefined
      • null
      • symbol : 변경 불가능한 원시타입의 값, 다른 값과 중복되지 않는 유일무이한 값 ⇒ 충돌 위험이 없는 객체에 유일한 프로퍼티 키를 만들기 위해 사용한다.
      1. 객체 타입
      • 객체, 함수, 배열 등

  • 자바스크립트의 number 타입은 다른 언어와 차이점이 무엇인가?

다른언어는 다양한 숫자 타입이 있지만, JS number 타입은 모든 수를 실수로 처리한다.


  • undefined와 null의 차이점

undefined는 개발자가 의도적으로 할당하기 위한 값이 아니라 자바스크립트 엔진이 변수를 초기화할 때 사용하는 값이다. 그래서 변수를 참조했을때 undefined가 반환된다면 초기화하지 않은 변수라는 것을 알 수 있다.

null은 변수에 값이 없다는 것을 의도적으로 명시할 때 사용한다. (의도적 부재) 이는 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것을 의미하며, 자바스크립트 엔진은 누구도 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행한다.


  • 데이터 타입이 필요한 이유
    • 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해서
    • 값을 참조할 때 한 번에 읽어들어야 할 메모리 공간의 크기를 결정하기 위해서
    • 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해서

  • 정적타입언어 vs 동적타입언어

C나 자바같은 정적타입언어는 변수의 타입을 변경할 수 없으며, 변수에 선언한 타입에 맞는 값만 할당할 수 있다. 정적 타입 언어는 컴파일 시점에 타입 체크를 수행한다. 만약 타입 체크를 통과하지 못했다면 에러를 발생시키고 프로그램 실행 자체를 막는다. 이를 통해 일관성을 강제함으로써 더욱 안정적인 코드의 구현을 통해 런타임에 발생하는 에러를 줄인다.

정적타입언어는 변수 선언 시점에 변수의 타입이 결정되고, 변수의 타입을 변경할 수 없다. 하지만 동적타입언어인 JS는 선언이 아닌 할당에 의해 타입이 결정되고, 재할당에 의해 변수의 타입이 동적으로 변할 수 있다.


  • 동적타입언어의 단점
    • 변수의 값을 추적하기 어렵다.
    • 유연성은 높지만 신뢰성은 떨어진다.

  • ==와 ===의 차이점

    • 동등 비교(==) 연산자는 좌항과 우항을 비교할 때, 암묵적 타입 변환을 통해 타입을 일치시킨 후, 같은 값인지 비교한다. 따라서 타입이 다르더라도 암묵적 타입 변환 후에 같은 값이라면 true를 반환한다.

    • 일치 비교(===) 연산자는 좌항과 우항의 피연산자가 타입이 같고, 값이 같은 경우에 한하여 true를 반환한다.

      ⇒ 동등비교(==)는 예측하기 어려운 결과를 만들어내므로, 일치 비교(===) 연산자를 사용하는 것이 권장된다.

profile
front-end engineer

0개의 댓글