📚 기초 지식

브라우저의 구조

Mia_ 2023. 1. 15. 19:12

브라우저의 구조

브라우저의 구조의 도식화

 

사용자 인터페이스 (User Interface)

- UI라고도 부름

- 가장 유저와 밀접하게 맞닿아 있는 부분

- 주소 표시줄, 이전/다음 버튼, 북마크 메뉴 등에 관련된 GUI 부분을 통칭

 

 

브라우저 엔진 (Browser Engine)

- 사용자 인터페이스와 렌더링 엔진 사이에 동작을 제어

- 브라우저 엔진의의 주된 역할은 HTML 문서와 기타 자원의 웹 페이지를 사용자의 장치에 시각 표현으로 변환 시키며, 문서 객체 모델(DOM) 자료 구조를 구현함

 

- 레이아웃 엔진(Layout Engine)이라고도 함

- 렌더링 엔진과 밀접한 연관이 있어 보통 브라우저 엔진과 렌더링 엔진을 묶어 브라우저 엔진으로 부르는 경우가 많음

- 이러한 브라우저 엔진은 웹 브라우저 마다 전용 엔진을 사용하고 있음

- 아래 표가 유명한 브라우저 엔진이나 이외에도 많은 브라우저 엔진이 존재

이름 설명
게코(Gecko) 모질라 재단에서 만든 브라우저 엔진
파이어폭스가 해당 엔진을 탑재
웹킷(Webkit) KHTML에서 파생된 브라우저 엔진
사파리가 해당 엔진을 탑재
블링크(Blink) 웹킷에서 파생된 브라우저 엔진
크롬, 오페라가 해당 엔진을 탑재
트라이던트(Trident) 마이크로소프트의 브라우저 엔진
인터넷 익스플로러, 아웃룩 익스프레스, 마이크로소프트 아웃룩이 이를 탑재
엣지HTML(EdgeHTML) 트라이던트에서 파생된 브라우저 엔진
마이크로소프트 엣지 스파르탄 버전(~2019)까지 탑재
(현재는 블링크로 교체)

 

 

렌더링 엔진 (Rendering Engine)

- 요청한 콘텐츠를 화면에 출력하는 역할

- HTML, CSS 등을 파싱해 최종적으로 화면에 그려주며, 렌더링 엔진은 HTML 및 XML 문서와 이미지를 표시할 수 있음

- 위에서 기술한 브라우저 엔진과 밀접하게 결합되어 있으므로 브라우저 엔진과 묶어서 하나의 엔진으로 보는 시각이 많음

- 렌더링 엔진 또한 웹 브라우저마다 전용 엔진을 사용하고 있으나 엔진의 동작 원리는 공통된 부분이 많음

 

 

통신 (Networking)

- HTTP 요청과 같은 네트워크 호출에 사용됨 

- 보통 플랫폼의 독립적인 인터페이스이고 각 플랫폼 하부에서 실행됨 

 

 

자바스크립트 해석기 (JavaScript Interpreter)

- 자바스크립트는 코드를 위에서 아래로 한 줄씩 읽어가는 방식으로 파싱(parsing)하는 언어임 

- 따라서 자바스크립 코드를 해석하고 실행하는 자바스크립트 해석기가 필요함 

 

- 자바스크립트 해석기는 자바스크립트 엔진이라고도 함

- 여러 목적으로 사용되나 대체적으로 웹 브라우저에서 이용되며, 브라우저마다 전용 엔진이 탑재되어 있음

- 아래 표의 엔진 외에도 다양한 엔진이 있음

이름 설명
Rhino 모질라 재단에서 운영하는 오픈소스 엔진
자바(Java)로 개발되었다는 특징
SpiderMonkey 최조의 자바스크립트 엔진으로 넷스케이프 내비게이터를 지원
현재는 파이어폭스를 지원
V8 구글이 개발한 오픈 소스 엔진
구글 크롬의 자바스크립트 엔진
JavascriptCore 애플에서 개발
처음에 WebKit 프레임워크를 위해 개발
현재는 사파리와 React Native App를 지원
Chakra 마이크로소프트가 개발한 엔진
Edge 브라우저 지원

 

▶ V8 엔진을 통한 자바스크립트 엔진 구조 설명

- V8 엔진의 메모리 구조는 크게 Heap Memory와 Call Stack으로 구성되어 있음

V8 엔진 구조

 

힙 메모리 (Heap Memory)

- 힙 메모리 내부에는 다양한 공간이 있음 

- 힙은 동적 메모리 할당에 사용되는 자료구조

- 힙을 이용하여 V8은 객체 또는 동적 데이터를 저장 

- 여기에 저장되는 메모리는 V8 엔진 내부에서 가장 큰 공간을 차지하고 있으며, 가비지 컬렉션 또한 발생하는 곳

 

콜 스택 (Stack)

- JavaScript는 기본적으로 싱글 스레드 기반의 언어 ≒ 콜 스택이 하나라는 의미

- 한 번에 한 작업만 사용할 수 있음 

- 콜 스택은 프로그램 상에서 우리가 어디에 있는지 기록하는 자료구조

- 만약 함수를 실행한다면 해당 함수는 콜 스택의 가장 상단에 위치함 → 만약 함수의 실행이 끝나면 해당 함수는 콜 스택 가장 상단에 위치하고 있기 때문에 바로 제거할 수 있음 

 

- 콜 스택의 동작 방식

함수를 실행하면 

- 제일 먼저 printSquare(4)가 호출됨 → 호출이 되는 순간 해당 함수가 스택으로 push 됨 

- 함수 printSquare 내부에서는 다시 square(n)을 호출하고 있으므로 함수 square를 이어 스택안으로 push함

- 그 뒤 함수 square 내부에서도 multiply(n, n)을 호출하고 있으므로 함수 multiply를 뒤이어 스택 안으로 push함 

- 이 과정에서는 return문으로 함수 호출만 되고 return 되는 특정 값이 없어 쌓이기만 함

- 함수 multiply까지 도착해서 return 되는 특정한 값을 얻음

 

- 이제 스택 안에서 return 되는 순서대로  stack을 제거함

- 따라서 스택 내부에서 차례대로 pop함 

- 함수 printSquare로 돌아오면 함수 내부에서 실행시켜야 하는 메소드(console.log(squared);)가 있음

- 함수 printSquare 내부에 콘솔 로그 명령이 있으므로 해당 메소드를 실행하는 순간 스택 안에 콘솔 로그 스택이 쌓임

- 이어 콘솔 로그의 실행이 끝나면 스택에서 제거되고 함수 printSquare 또한 실행이 완료되었으므로 스택에서 제거됨

 

- 여기서 스택에 쌓이는 데이터 하나하나를 스택 프레임(Stack Frame)이라고 함

- 이 스택 프레임들은 동작 방식에서도 알 수 있듯 쌓이는 순서가 있기 때문에 콜 스택 동작하는 방식을 안다면 스택의 추적 또한 가능해지게 됨

 

스택 오버플로 (Stack Overflow)

- 콜 스택은 힙과 달리 자료구조 자체가 크기에 제한이 있음

- 따라서 한정된 메모리 공간을 넘어버리게 되면 어떠한 에러를 발생시키게 되는데 그것을 바로 스택 오버플로(Stack Overflow)라고 함 

- 콜 스택 내부의 동일한 스택 프레임이 예상치 못한 수로 쌓일 때 나타남 

 

스택 추적 (Stack trace)

함수를 호출시켜 error를 일으키는 과정

- 위 그림에서 함수 baz()는 함수 bar()를 호출하고 bar()는 foo()를 함수를 호출하고 foo()는 마지막으로 에러 메세지를 출력함

- 이렇게 브라우저의 콘솔로그를 살펴보면 에러의 발생과 이유를 추적해 낼 수 있음 

- 이것이 바로 스택 추적이라고 부르는 것

 

 

UI 백엔드

- 렌더링 엔진이 분석한 Render Tree를 브라우저에 그리는 역할을 담당

- Select, Input 창과 같은 기본적인 위젯을 그려줌

- 플렛폼에서 명시하지 않은 일반적인 인터페이스로 OS 사용자 인터페이스 체계를 사용함 

 

* 사용자 인터페이스(User Interface;UI)란? 

: 사람과 사물 또는 시스템 특히 기계, 컴퓨터 프로그램 등 사이에서 의사소통을 할 수 있도록 일시적 또는 영구적인 접근을 목적으로 만들어진 물리적 가상적 매개체를 뜻함

 

* 명령어 라인 인터페이스(Command Line Interface;CLI)?

: mac이라면 터미널, 윈도우라면 명령 프롬프트 등의 문자로만 명령어를 입력해 처리해야 하는 인터페이스를 의미

 

* 일괄 처리 인터페이스(Batch Interface)?

: 사용자가 배치 처리에 앞서 배치 작업의 모든 세부 사항을 지정하고, 모든 처리가 완료되면 출력을 수신하는 비대화형 사용자 인터페이스

 

* 그래픽 사용자 인터페이스(Graphic User Interface; GUI)?

- 가장 일반적으로 사용됨 

- 마우스, 키보드, 모니터 등을 이용해 아이콘을 클릭하거나 직관적인 입력이 가능한 인터페이스

 

 

자료 저장소

- 말 그대로 자료를 저장하는 계층

- 쿠키를 저장하는 것과 같이 모든 자원을 하드 디스크에 저장할 필요가 있기 때문에 존재

- HTML5 명세에는 브라우저가 지원하는 웹 저장소(Web Storage, 이하 웹 스토리지라고 지칭)스펙이 정의되어 있음

- 영구적인 저장소인 로컬스토리지(localStorage)와 임시적인 저장소인 세션스토리지(sessionStorage)를 따로 두어 데이터의 지속성을 구분할 수 있어 응용 선택에 맞는 선택이 가능해짐

 

웹 스토리지(Web Storage) 특징

- 웹 스토리지는 웹 브라우저가 직접 데이터를 저장할 수 있게 해줌 

- 또한 사용자 측에서 좀 더 많은 양의 정보를 안전하게 저장할 수 있게 해줌 

- 이런 모든 정보는 절대 서버로 전송되지 않으므로 저장된 데이터가 클라이언트에만 존재하기 때문에 네트워크 트래픽 비용 또한 줄여줌

 

- 이러한 웹 스토리지는 오리진(origin)마다 단 하나씩만 존재함 

- 오리진(origin)은 도메인(domain)과 프로토콜(protocol) 한 쌍으로 이루어진 식별자

- 하나의 오리진에 속하는 모든 웹 페이지는 같은 데이터를 저장하기 때문에 같은 데이터로 접근할 수 있게 됨 

 

웹 스토리지 종류

1. 로컬스토리지(localStotrage)

- 로컬스토리지 객체는 보관 기한이 없는 데이터를 저장 

- 따라서 브라우저 탭이 닫히거나, 컴퓨터를 재부팅해도 이 저장소에 저장된 데이터는 사라지지 않음

- Window 전역 객체에  localstorage라는 컬렉션을 통해 저장과 조회가 가능

- 도메인마다 별도의 localstorage가 생성됨 → 도메인만 같으면 적역으로 데이터 공유가 가능

 

2. 세션스토리지(sessionStorage)

- 하나의 세션만을 위한 데이터를 저장

- 데이터를 지속적으로 보관하지 않고 브라우징되고 있는 브라우저 컨텍스트 내에서만 테이터가 유지

- 브라우징이란? 브라우저 프로그램을 실행해서 인터넷에 들어가 정보를 찾는 행위를 말함

- 브라우징 컨텍스트란? 브라우저가 문서를 표시하는 환경. 각 브라우징 컨텍스트는 특정 출처 및 활성화되고 있는 문서 출처, 표시했던 문서 방문기록을 가지고 있음

 

- 저장과 조회는 Windows 전역 객체의 sessions Storage라는 컬렉션을 통해 이루어지며 도메인 별도로 생성

- 브라우저 컨텍스트가 다르면 서로 다른 영역이 된다는 특징

- 즉 브라우저를 두 개 실행해 같은 페이지를 열었을 때 브라우저 컨텍스트가 서로 다르므로 이 두페이지의 세션스토리지는 별개의 영역으로 인지되어 서로 데이터의 공유가 불가능해짐 

 

웹 스토리지를 사용하기 위한 문법 

- window.localStorage : 만료 날짜가 없는 데이터를 저장할 때 쓰임

- window.sessionStorage : 세션이 있는 데이터를 저장할 때 쓰임 → 브라우저 탭을 닫으면 손실되는 것을 의도한 데이터를 저장할 때 쓰임

- 아래의 코드는 웹 스토리지를 사용하기 이전의 해당 브라우저 버전이 웹 스토리지를 지원하는지 확인하고자 할 때 쓰는 코드

// window 객체에 있는 Storage 객체를 통해 확인할 수 있음
// 해당 객체가 존재하지 않는 브라우저라면 undefined를 반환하고, 존재한다면 function을 반환
if(typeof(Storage) !== 'undefiend'){
  // web storage를 위한 코드 부분
} else {
  // web storage를 지원하지 않는 브라우저를 위한 안내 부분
}

 

웹 스토리지를 활용한 대표적인 기능

- 브라우저 컨텍스트 내에서 저장한 데이터를 가지고 활용할 수 있기 때문에 복구 및 백업에 관련된 기능에 주로 사용

- 블로그 글을 작성하다가 사용자가 창을 벗어난 경우 관련 작성 내용을 복구하거나 백업해 주는 기능

- 사용자가 입력 form을 통해 정보를 입력하다가 페이지를 벗어난 경우 복구 및 백업을 해주는 기능

- 현재 읽은 글의 히스토리 저장(카운팅, 혹은 읽은 글 표시 등으로 활용)