| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- MVC요청플로우
- 공통기술
- model
- Ajax
- 공통규약
- 문제선택근거
- JDBC
- JPA
- 이벤트핸들러this
- 전전긍긍
- MVC
- 클린아키텍처
- 이벤트핸들러등록
- Transaction
- 디스크i/o
- DDD
- 커뮤니티서버
- 사면초가
- 냄새라도
- 설정세팅
- AOP
- SEQUENCE
- SpringLegacy
- index
- springsecurity
- 단위테스트
- OOP
- TDD
- string
- 로그백
- Today
- Total
개발이군고구마
[JS] 브라우저 렌더링 과정 (캐싱/SSR) 본문
1. 이유
[브라우저 렌더링]
- 프로젝트에서 gnb 에 데이터는 Tiles 를 호출하여 model 객체에 담아서 보내주고 있음
- Tiles 호출 시기가 궁금하였고, 결국 SSR이 어떻게 화면을 응답받는지가 궁금하였음
[렌더링 과정에서 외부자원 호출 부분 - img]
- 또한 상품 상세에 이미지에 lazyloading 이 적용되었는데, 해당 스크립트가 "언제" 실행되는지
- 또 이미지가 "언제" 호출되어 나타나는지 알아야 했음
=> 그렇기 위해선 기본적으로 브라우저의 렌더링 과정을 완벽히 이해하고 있어야 함
2. 브라우저 렌더링 과정
- 파싱 : 텍스트 문서를 -> 토큰으로 분해 -> 토큰에 문법적인 의미와 구조를 반영 -> 파스 트리
- 렌더링 : HTML, CSS, JS 로 작성된 문서를 파싱하여 브라우저에 시각적으로 출력하는 것
[큰 흐름]
브라우저 요청 렌더링에 필요한 정보 (HTML, CSS, JS) 요청 응답
-> 브라우저 렌더링 엔진은 HTML, CSS 파싱하여 DOM, CSSOM 생성하여 "렌더트리"
-> 브라우저 자바스크립트 엔진은 JS 파싱하여 실행
-> "렌더트리" 기반으로 HTML 요소의 레이아웃 개선, 화면에 페인팅

1) HTTP 2.0
- HTML 내에 존재하는 css, js, img, link 등이 동시 전송이 가능함
2-1) HTML 파싱과 DOM 생성
- HTML 문서는 문자열로 이루어진 "순수한 텍스트"
- "DOM" 객체 (자료구조) : HTML 문서를 파싱한 결과물
- 파싱 과정 : 바이트 -> 문자 -> 토큰 -> 노드 -> DOM 트리
2-2) CSS 생성과 CSSOM 생성
- 렌더링 엔진은 HTML을 한줄씩 읽어가면서 DOM 을 생성함
- css 나 link, style 태그가 있으면 DOM 생성을 중단함 ( 🤔 여기서 img 태그는? => 태그 만나면 중단)
- 지정된 CSS 파일을 서버에 요청하고 CSS를 파싱하여
- 바이트 -> 문자 -> 토큰 -> 노트 -> CSSOM 생성
3) 렌더 트리 생성
- 브라우저 화면에 렌더링 되지 않는 노드 (script, display none)들은 포함하지 않음
4) 자바스크립트 파싱과 실행
- DOM API : DOM은 HTML 문서 정보 뿐 아니라 HTML 요소와 스타일은 변경할 수 있는 인터페이스
- script 태그를 만나면 주도권은 js engine으로 넘기게 됨
- cpu가 이해할 수 있는 저수준 언어로 변환하고 실행함
- 자바스크립트 소스 코드 -> 토큰 -> AST -> 바이트코드 -> "인터프리터"
🤔 의문점
- Render Tree 이후에 자바스크립트 엔진이 실행되는 것인지
- img는 언제 서버에 요청을 하는 것인지
- html이 한줄씩 읽어가면서 dom을 생성한다면 img 태그에서 src 로 서버에서 이미지를 호출하는 부분도 그때 html파싱을 블로킹 시켜서 호출하는 것인지?
=> img 태그 만나면 dom 그리기 중단 후 서버와 요청함
3. BOM과 DOM 객체
- window : HTML 로딩이 완료된 시점에 가장 먼저 만들어지는 객체, DOM이 들어올 창
- document : window의 프로퍼티 중 하나로써 window가 생성되고 만들어짐

- window / document의 내장 메서드 실행 시점
- DOM TREE 완성 후 : document.ready / DOMContentLoaded
- CSS, JS, IMG 와 같은 외부 리소스 로딩 완료 후 : load
4. 브라우저 캐싱
- HTTP 요청을 할 떄마다, HTML, CSS, JS, img 등을 불러옴
- 매번 요청을 할 때마다 다시 불러오는 것은 성능상 부담
- 브라우저 캐시 적용
- HTTP 요청을 하는 클라이언트 에플리케이션 "내부 디스크" 에서 이루어지는 캐시
- HTTP 캐시라고 불리기도 함
- Etag를 적용하여 특정 버전의 리소스를 표시함, 요청에 리소스가 그대로이면 캐시에 저장된 정보를 보여줌
5. 서버사이드 렌더링과 클라이언트사이드 렌더링
- 현재 사이트는 JSP를 통해서 HTML 파일을 반환한다 -> SSR 방식을 취함
- controller의 결과로 해당 경로를 반환함
dispatcher servlet에서 해당 경로에 있는 jsp 파일을 view resolver에게 반환함-
- Jasper : 실제 JSP 페이지의 요청을 처리하는 서블릿,
- JSP 코드 -> 서블릿 코드 .java 로 변환됨 -> 서블릿 코드를 컴파일링 하여 bytecode(.class)
- modelAndView 로 바꾸어서 다시 dispatcherServlet으로 전달하면 view 에서 HTML 으로 응답

- Rest Controller와 같이 api 통신의 경우엔 dispatcherservlet에서 reolsver가 아니라 바로 데이터 값을 받아서 전달함
- React 와 같은 프레임워크는 API로만 데이터를 호출하고 화면은 클라이언트에서 그리는 -> CSR 방식
6. 질문에 대한 답
- lazyloading
- 서버에서 복수의 img에 대한 url 을 반환 받을 것
- 각 img 태그에는 src가 할당되어있지 않은 상태 (default 이미지는 지정해줌)
- observe를 통해서 노드 element 의 위치를 파악하고 scroll을 내릴 때마다
- 그때에 위치에 해당하는 태그에 맞는 url을 src에 담아주면서 서버(또는 클라우드)에서 이미지를 가져옴
* window와 document
Difference between Window, Document and Screen in JavaScript
Window object and Document object are often look alike and confusing ??
sushmithavootukuri.medium.com
* 브라우저 캐싱
https://yozm.wishket.com/magazine/detail/2341/
프론트엔드 개발자가 알아야 할 ‘캐싱’ 개념 정리 | 요즘IT
프론트엔드 개발자라면 아마 웹사이트 성능을 최적화하는 것에 관심이 있을 것이다. 웹사이트 로딩 시간을 줄이고, 물 흐르듯 자연스러운 사용자 경험을 만드는 것은 비즈니스에도 큰 영향을
yozm.wishket.com
*jsp 렌더링
https://medium.com/@js230023/jasper%EC%99%80-catalina-ea11a337945f
Jasper와 Catalina
재스퍼와 카탈리나
medium.com
'FRONT' 카테고리의 다른 글
| [JS] 이벤트 핸들러 방식과 this(DOM의 attribute/property) (0) | 2024.10.26 |
|---|---|
| [JS] aysnc와 await의 작동 순서 (Response.json()으로부터 촉발된) (0) | 2024.07.21 |
| [JS] 자바스크립트 동작 원리 2 (비동기와 이벤트루프) (0) | 2024.06.30 |
| [JS] 자바스크립트 동작 원리 1 (스레드, 동기, 비동기) (0) | 2024.06.22 |
| [React] 컴포넌트를 리랜더링 하기 위해 state 조작하기 (위시리스트) (0) | 2024.06.16 |