목차
1. 모의면접 준비
1. 브라우저 렌더링 과정
질문List
- 브라우저에 특정한 URL을 입력하면 발생하는 각각의 단계에서 어떤 일이 발생하는지 알려주세요.
URL 파싱
,DNS 조회
,ARP로 MAC주소 변환
,TCP 통신
,브라우저 렌더링
- 1. 서버의 주소를 찾는 과정
url 해석
: 프로토콜과 url, port 번호를 통해 찾을 목적지와 방법에 대해서 정의합니다.DNS 조회
: 도메인 주소를 IP 주소로 변환하는 단계Appache
: 로컬과 브라우저 캐시에서 먼저 검사라우터
: 네트워크 장비의 라우터를 통해 실제 server가 존재하는 게이트웨이 까지 이동ARP
: IP 주소가 MAC 주소로 변환- 2.server와 통신을 주고 받는 과정
TCP
: client와 server의 연결을 보장하는 통신 프로토콜- 3way-handshake 방식을 통해, 서로를 확인하고 연결하는 과정
응답
: HTML, CSS , Javascript 파일등- 3. 실제 화면에 그려주는 과정 (브라우저 렌더링과정)
답변
브라우저가 주소창 입력이벤트를 감지 후 ,
1) url을 해석하여 실제 resourse가 존재하는 서버의 주소를 찾는과정
2) 해당 server와의 연결을 통해 통신을 주고 받는 과정
3) 실제 화면상에 이를 그려주는 과정
- 브라우저 렌더링 과정을 흐름에 따라 설명해주세요.
HTML파싱
,CSSOM
,DOM Tree
,RenderTree
,Layout(reflow)
,Paint
HTML파싱
: HTML 파일의 파싱 → DOM 트리 생성CSSOM
: CSS link만나서 CSS 파싱 → CSSOM 생성RenderTree
: DOM트리와 CSSOM을 합쳐서 RenderTree 생성- 렌더트리는 요소의 위치, 크기, 모양등의 정보를 가짐
Layout
: 렌더트리의 요소들이 화면에 실제 어디에 위치해야하는지 결정Paint
: 레이아웃 트리를 순회하며, 페인트 순서정하기, 실제 화면 픽셀로 변환- 합성 단계를 거쳐 1장의 비트맵으로 출력
답변
- Reflow와 Repaint는 무엇이고, 언제 발생하나요?
- reflow (링크)
- 전체 reflow
글꼴 크기 변경
과 같이 모든 렌더러에 영향을 주는 전역 스타일 변경.화면 크기 변경
에 의한 결과.- 부분 reflow
- 위치가 바뀌면, 해당 요소와 자식, 형제들 까지 리플로우 & 페인팅
- DOM 추가 시, 추가 된 노드 리플로우 & 리페인팅
- display: none → block
- 페이지 초기 렌더링 시(최초 Layout 과정)
- 윈도우 리사이징 시 (Viewport 크기 변경시)
- 노드 추가 또는 제거
- 요소의 위치, 크기 변경 (left, top, margin, padding, border, width, height, 등..)
- 폰트 변경 과(텍스트 내용) 이미지 크기 변경(크기가 다른 이미지로 변경 시)
- repaint
- 요소의 색깔만 바뀌는 경우, 해당 요소만 리페인팅
- visibility, outline
- 해결방법
- position 속성 fixed, absolute는 리플로우 영향 받지 않음
- inline 속성사용안하기
- css class 필요한 만큼만 적기
virtual DOM
을 사용하는 것이 항상 옳을까요? (링크)virtual DOM
의 장단점장점
: DOM 조작 시 반복되는 리플로우,리페인팅 과정의 비효율성 해결- Virtual DOM은 실제 DOM 변화를 최소화 시켜주는 역할을 합니다.
- virtualDOM을 이용하는 이유는 효율성 때문입니다. virtualDOM을 활용하면 실제 DOM을 직접 바꾸는 것보다 시간 복잡도가 현저히 낮아지는데요.
- Virtual DOM은 뷰에 변화가 있다면, 그 변화가 실제 DOM에 적용되기 전에 Virtual DOM에 적용시키고 최종 결과만 실제 DOM에 전달합니다. 따라서 20개의 변화가 있다면 Virtual DOM은 변화된 부분만 가려내어 실제 DOM에 전달하고 실제 DOM은 그 변화를 1회로 인식하여 단 한번의 렌더링 과정만 거치게 됩니다.
답변
답변
- script 태그를 body 가장 하단에 삽입하는 이유는 무엇일까요?
DOM 조작
,로딩 시간
답변
[한 줄]
브라우저 렌더링과정을 고려했을 때 화면을 빠르게 보여주기 위해서라고 생각합니다.
[script]
script 태그가 body의 마지막 부분에 있는 것은, <head>부분에 존재할 경우 html 파싱이 끝나기 전 script가 실행이 되어 html파싱이 멈추고, 그에 따라 존재하지 않는 DOM요소에 접근하게되어 오류가 발생할 수 있습니다.
따라서 html파싱 중 자바스크립트 파일이 반드시 필요하지 않다면 html파싱 이후에 스크립트가 실행되도록 하여, 오류발생을 막고 빠르게 화면을 보여줄 수 있습니다.
[css]
한편 css 태그의 경우 스크립트와 다르게 html 파싱과정을 멈추게 하지 않고, 별도의 css파서가 스타일을 관리하기 때문에 헤드에 위치하도록 합니다.
또 script 가 실행될 때, 스타일이 파싱되지 않는 경우 의도치 않은 화면을 보여줄 수 있기 때문에 보통 body태그에 있는 스크립트에 앞서 실행되도록 합니다.
- script 태그의
async
,defer
어트리뷰트에 대해서 설명해주세요 HTML 파싱 블로킹
,비동기
답변
[script태그]
<script> 태그는
브라우저
에서 자바스크립트 파일을 다운로드
하고 실행하도록
동작하게 하는 태그를 의미합니다.
일반적으로 script 태그는 <body>태그가 끝나기 전에 위치
하여 html파싱 이후
실행되도록 합니다.
[script async & defer]
script async와 defer 는 head 태그안에 script태그를 넣고자 할 때
사용할 수 있는 script태그의 속성들입니다.
[async]
script 태그는 스크립트 파일을 다운로드 하는 것과 실행하는 단계가 존재하는데,
async 속성의 경우 html파일 파싱과정에서 script태그를 만났을 때, html파싱과 동시에 javascript 파일의 다운로드
를 진행합니다. 하지만 곧이어 script 파일을 실행되면서 html파싱은 잠시 중단
됩니다.
또 여러개의 스크립트가 존재할 경우 순서에 상관없이 다운로드 된 파일이 먼저 실행되는 문제
가 있습니다.
[defer]
이를 보완할 수 있는 태그가 defer 태그라고 할 수 있습니다.
defer속성은 html파싱 중 스크립트 태그를 만나면 html파싱과 동시에 스크립트 다운
을 진행하되, html파싱 이후에 스크립트를 실행시
킵니다.
따라서 html파싱이 중간에 멈추지 않으며, 스크립트도 순서에 따라 실행될 수 있어 이상적이라고 할 수 있습니다.
html파싱과 동시에 스크립트 다운, html파싱 이후 스크립트 실행
꼬리질문
visibility: hidden과 display: none의 차이를 렌더링 관점에서 설명
- DOM 트리와 렌더트리의 차이
reflow되었는지 repaint 되었는지 어디서 어떤 기준으로 판별하고 최적화할 수 있을까요?
2 해시테이블 링크
해시테이블 (Hash Table)에 대해서 간단하게 설명해주세요.
답변
- 해시테이블은
효과적인 데이터 탐색을 위한 자료구조
- 키와 값을 대응하도록 저장
해시함수를 통해, 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하여 저장
- 키 값을 해시함수를 통해 변환하고, 이를 배열의 idx로 참조하여 값을 저장하고 찾는 방법
- js에는 배열의 크기가 고정되어 있지 않기 때문에 객체 키를 통해 값을 찾는 행위가 해시테이블
- 해시함수는 동일한 입력값에 항상 같은 값을 리턴
해시테이블을 사용하는 이유, 장점에 대해서 설명해주세요.
답변
- 직접주소테이블(
입력받은 value가 바로 key가 되는 방식
)이 가지는 데이터공간 비효울성 문제 해결 비효율성문제
: 입력받은 value가 크다면, 사이의 모든 공간이 비는 문제해결
: 해시함수를 통해, index의 범위를 보장후속문제
: 해시값이 같아지는 해시충돌 발생
해시충돌에 대해서 설명해주세요
해시 충돌의 해결 방법에 대해서 설명해주세요.
답변
- 좋은 해시함수 만들기
좋은해시함수
: 해시충돌이 적게 발생하도록, 해시값이 균등하게 퍼지는 알고리즘을 가진 해시함수 - 근본적 해결 불가
- 개방주소법 (Open Address)
개방주소법
: 충돌이 발생할 경우, 비어있는 공간을 찾아 해당 index에 저장하는 방식- 선형탐사법, 제곱탐사법, 이중해싱등
- 선형탐사
- 가장 기본적인 충돌해결기법으로 위에서 설명한 기본적인 동작방식이다. 선형탐사는 바로 인접한 인덱스에 데이터를 삽입해가기 때문에 데이터가 밀집되는
클러스터링(Clustering) 문제
가 발생하고 이로인해 탐색과 삭제가 느려지게 된다. - 제곱탐사
- 말 그대로 1^2,2^2,3^2.. 으로 탐사를 하는 방식으로 선형탐사에 비해 더 폭넓게 탐사하기 때문에 탐색과 삭제에 효율적일 수 있다. 하지만 이는 초기 해시값이 같을 경우에 탐사하는 역시나 클러스터링 문제가 발생하게 된다.
- 이중해싱
- 선형탐사와 제곱탐사에서 발생하는 클러스터링 문제를 모두 피하기 위해 도입된 것이다. 처음 해시함수로는 해시값을 찾기 위해 사용하고 두번째 해시함수는 충돌이 발생했을 때
탐사폭을 계산하기 위해 사용
되는 방식이다.
상세 설명
- 테이블 크기 재할당 (resizing)
resizing
: 데이터공간의 70%이상이 찼을 경우, 해시테이블의 크기를 2~3배 늘려주어 테이블 공간을 확보
- 자주 hit 되는 값을 cashe 처리
해시테이블을 활용한 사례가 있다면 알려주세요. 없다면 언제 쓰일 수 있을까요?
답변
- js에는 배열의 크기가 고정되어 있지 않기 때문에 객체 키를 통해 값을 찾는 행위가 해시테이블
- 비밀번호 저장 사례
- 해시를 통해 암호화 하여 저장
해시테이블 시간복잡도
답변
- 충돌이 없는 경우
- 추가, 삭제, 탐색:
O(1)
- 충돌 발생한 경우
- 추가, 삭제, 탐색:
O(N)