개발 지식/WEB 지식

[λ°±μ—”λ“œ λ‘œλ“œλ§΅] 🌐 λΈŒλΌμš°μ €μ™€ λ™μž‘ 원리

인파_ 2021. 10. 22. 16:07

λΈŒλΌμš°μ € λ™μž‘ 원리

λΈŒλΌμš°μ € λ™μž‘ 원리

λΈŒλΌμš°μ € λ™μž‘ 원리

μš°λ¦¬κ°€ ν‰μ†Œμ— μ ‘ν•˜λŠ” 이 화면은 λ„λŒ€μ²΄ μ–΄λ–»κ²Œ λ‚˜νƒ€λ‚˜κ²Œ λ˜λŠ” κ²ƒμΌκΉŒ?

​

μš°λ¦¬λŠ” ν‰μ†Œμ²˜λŸΌ λ‹Ήμ—°ν•˜κ²Œ 인터넷 μ£Όμ†Œμ°½μ— μ£Όμ†Œλ₯Ό μž…λ ₯ν•˜κ³  거기에 ν•΄λ‹Ήλ˜λŠ” ν™ˆνŽ˜μ΄μ§€ 화면을 μ ‘ν•˜λ©° μ‚¬μ΄νŠΈλ₯Ό λŒμ•„λ‹€λ‹ˆκΈ°λ§Œ ν–ˆμ§€, μ΄λ ‡κ²Œ 화면이 λ³΄μ—¬μ§€λŠ” 과정이 μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€λŠ” 생각해보지 λͺ»ν–ˆμ„ κ²ƒμž…λ‹ˆλ‹€.

​

ν”„λ‘ νŠΈμ—”λ“œ 개발자 μ—­μ‹œ, HTMLκ³Ό CSS λ¬Έμ„œλ₯Ό μž‘μ„±ν•˜κ³  Javascript μ½”λ“œλ₯Ό μ§œλ©΄μ„œ κΈ°λŒ€ν•˜λ˜ λ™μž‘μ„ ν™•μΈν•˜λ©° μ›Ή κ°œλ°œμ„ ν–ˆμ„ 것이고, μ‹€μ œλ‘œ 이 HTMLλ¬Έμ„œκ°€ μ–΄λ–»κ²Œ 자리λ₯Ό μž‘μ•„μ„œ μ›Ή νŽ˜μ΄μ§€μ— 각자 μžλ¦¬μ— DOM μš”μ†Œλ“€μ΄ μ„ΈνŒ…μ΄ 되고 CSS μŠ€νƒ€μΌμ΄ μ μš©λΌμ„œ κ·Έλ €μ§€λŠ”μ§€ 생각해볼 κΈ°νšŒκ°€ μ—†μ—ˆμ„ κ²ƒμž…λ‹ˆλ‹€.

​

이 κΈ°νšŒμ— ν•œλ²ˆ μžμ„Ένžˆ μ•Œμ•„λ³΄μ£ .

λΈŒλΌμš°μ € λ™μž‘ 원리


β€‹λΈŒλΌμš°μ €μ˜ μ£Όμš” κΈ°λŠ₯

λΈŒλΌμš°μ €μ˜ μ£Όμš” κΈ°λŠ₯은, 'μ„ νƒν•œ μžμ›μ„ μ„œλ²„μ—κ²Œ μš”μ²­ν•˜κ³ , 전솑받은 μžμ›μ„ λΈŒλΌμš°μ € 화면에 ν‘œμ‹œ' ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

​

μžμ›μ˜ μ’…λ₯˜λŠ” μ•„λž˜μ™€ 같은 μš”μ†Œλ“€μ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

- HTML

- CSS

- JavaScript

- PDF

- Image

- 기타 λ“±λ“±

λΈŒλΌμš°μ € λ™μž‘ 원리

​

그러면 μ΄λŸ¬ν•œ μžμ›μ€ λΈŒλΌμš°μ €κ°€ μ–΄λ–»κ²Œ μ„œλ²„μ—κ²Œ μš”μ²­μ„ ν•  수 μžˆλŠ” κ²ƒμΌκΉŒμš”?

μ—¬κΈ°μ„œ μš°λ¦¬λŠ” URI(Uniform Resource Identifier) λΌλŠ” κ°œλ…μ„ μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€.

​

URIλŠ” 각 μžμ›μ˜ μ„œλ²„ μ£Όμ†Œλ₯Ό λ§ν•©λ‹ˆλ‹€. 이 μ£Όμ†ŒλŠ” μ„œλ²„ μ–΄λ”˜κ°€μ— λͺ…μ‹œλ˜μ–΄ 있고, λͺ…μ‹œλœ μ£Όμ†Œλ₯Ό 톡해 μ„œλ²„μ—κ²Œ ν•΄λ‹Ή μ£Όμ†Œμ˜ μžμ›μ„ μš”μ²­ν•˜μ—¬ λ°›μ•„μ˜€κ²Œ λ©λ‹ˆλ‹€.

​

URIλ₯Ό ν†΅ν•œ μžμ› μš”μ²­ 방법은 λΈŒλΌμš°μ €μ— μžˆλŠ” μ£Όμ†Œμž…λ ₯ 창이 될 μˆ˜λ„ 있고, 데이터 μš”μ²­μ„ μœ„ν•œ API μ£Όμ†Œκ°€ 될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 

 

[WEB] 🌐 URL & URI 차이

URIλŠ” Uniform Resource Identifier URL은 Uniform Resource Locator URN은 Uniform Resource Name μ„€λͺ…κ³Ό 같이 URIλŠ” URLκ³Ό URN을 ν¬ν•¨ν•˜κ³  μžˆλ‹€. 각 λœ»μ€ μžμ›μ˜ μ‹λ³„μž(URI) μœ„μΉ˜(URL) 이름(URN)으둜 μœ μΆ”ν•΄..

inpa.tistory.com

πŸ’‘ν•œ 가지 예λ₯Ό λ“€μ–΄λ³΄μžλ©΄

μš°λ¦¬κ°€ λΈŒλΌμš°μ € μ£Όμ†Œμž…λ ₯ 창에 www.naver.com을 μž…λ ₯ν–ˆμŠ΅λ‹ˆλ‹€.

그러면 ν•΄λ‹Ή μ£Όμ†Œμ— λ§žλŠ” νŽ˜μ΄μ§€λ₯Ό λΈŒλΌμš°μ € 화면에 보여주기 μœ„ν•΄ HTML, CSS, Javascript νŒŒμΌμ„ ν¬ν•¨ν•˜μ—¬ ν•΄λ‹Ή νŽ˜μ΄μ§€μ— κ΄€λ ¨λœ λͺ¨λ“  λ¦¬μ†ŒμŠ€ 파일(이미지, λ™μ˜μƒ 파일 λ“±)듀을 넀이버 μ„œλ²„μ—κ²Œ μš”μ²­μ„ ν•˜κ³  λ°›μ•„μ˜¬ 것이죠.

​

그러면 μ—¬κΈ°μ„œ 'www.naver.com'은 URIκ°€ 되고,
νŽ˜μ΄μ§€λ₯Ό 보여주기 μœ„ν•΄ μš”μ²­ν•΄μ„œ λ°›μ•„μ˜¨ λͺ¨λ“  νŒŒμΌλ“€μ΄ μžμ›μ΄ λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€.


λΈŒλΌμš°μ €μ˜ κΈ°λ³Έ ꡬ쑰

λΈŒλΌμš°μ €μ˜ κΈ°λ³Έ ꡬ쑰

 β– μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€ - μ£Όμ†Œ ν‘œμ‹œμ€„, 이전/λ‹€μŒ λ²„νŠΌ, 뢁마크 메뉴 λ“±. μš”μ²­ν•œ νŽ˜μ΄μ§€λ₯Ό λ³΄μ—¬μ£ΌλŠ” 창을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λͺ¨λ“  λΆ€λΆ„

 β– λΈŒλΌμš°μ € 엔진 - μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€μ™€ λ Œλ”λ§ 엔진 μ‚¬μ΄μ˜ λ™μž‘μ„ μ œμ–΄.

 β– λ Œλ”λ§ 엔진 - μš”μ²­ν•œ μ½˜ν…μΈ λ₯Ό ν‘œμ‹œ. 예λ₯Ό λ“€μ–΄ HTML을 μš”μ²­ν•˜λ©΄ HTMLκ³Ό CSSλ₯Ό νŒŒμ‹±ν•˜μ—¬ 화면에 ν‘œμ‹œν•¨.

 β– λ„€νŠΈμ›Œν‚Ή - HTTP μš”μ²­κ³Ό 같은 λ„€νŠΈμ›Œν¬ ν˜ΈμΆœμ— μ‚¬μš©λ¨. 이것은 ν”Œλž«νΌ 독립적인 μΈν„°νŽ˜μ΄μŠ€μ΄κ³  각 ν”Œλž«νΌ ν•˜λΆ€μ—μ„œ 싀행됨.

 β– UI λ°±μ—”λ“œ - select / input λ“± 기본적인 μœ„μ ―μ„ κ·Έλ¦Ό. ν”Œλž«νΌμ—μ„œ λͺ…μ‹œν•˜μ§€ μ•Šμ€ 일반적인 μΈν„°νŽ˜μ΄μŠ€λ‘œμ„œ, OS μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€ 체계λ₯Ό μ‚¬μš©.

 β– μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμ„œ - μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό ν•΄μ„ν•˜κ³  μ‹€ν–‰.

 β– 자료 μ €μž₯μ†Œ - Cookie, Local storageλ“± local에 dataλ₯Ό μ €μž₯ν•˜λŠ” μ˜μ—­.


λ Œλ”λ§ 엔진

λ Œλ”λ§ 엔진은 μš”μ²­λ°›μ€ μžμ›μ„ λΈŒλΌμš°μ € 화면에 ν‘œμ‹œν•˜λŠ” μž‘μ—…μ„ ν•©λ‹ˆλ‹€.

μœ„μ—μ„œ μ„€λͺ…ν•œ κ²ƒμ²˜λŸΌ μžμ›μ˜ μ’…λ₯˜λŠ” νŽ˜μ΄μ§€ λ Œλ”μ— ν•„μš”ν•œ HTML, CSS, JavaScript 뿐 μ•„λ‹ˆλΌ PDF, JPG λ“± μ„œλ²„μ— μš”μ²­ν•˜μ—¬ κ°€μ Έμ˜¬ 수 μžˆλŠ” λͺ¨λ“  것이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

λ Œλ”λ§ 엔진

 

λ Œλ”λ§ μ—”μ§„μ˜ μ’…λ₯˜λŠ” μ—¬λŸ¬ 가지가 μžˆμ§€λ§Œ, 그쀑 λŒ€ν‘œμ μΈ 엔진 두 가지λ₯Ό μ†Œκ°œν•œλ‹€λ©΄ μ›Ήν‚·(Webkit)κ³Ό κ²Œμ½”(Gecko)κ°€ μžˆλŠ”λ°,

웹킷은 크둬과 μ‚¬νŒŒλ¦¬, κ²Œμ½”λŠ” νŒŒμ΄μ–΄ν­μŠ€μ—μ„œ μ‚¬μš©λ˜λŠ” 엔진 μž…λ‹ˆλ‹€.

​

λ Œλ”λ§ 엔진 λ™μž‘ κ³Όμ •

λ Œλ”λ§ 엔진은 μ›Ήμ„œλ²„λ‘œλΆ€ν„° 전달받은 HTML λ¬Έμ„œλ₯Ό 맨 처음 λ„€νŠΈμ›Œν¬ λ ˆμ΄μ–΄μ—μ„œ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€.

그리고 μ•„λž˜μ™€ 같은 기본적인 Flow λ₯Ό κ±°μΉ©λ‹ˆλ‹€.

(세뢀적인 ν”Œλ‘œμš° 및 각 κ°œλ…μ„ μ–΄λ–€ 이름을 λΆ™μ΄λŠ”μ§€λŠ” λΈŒλΌμš°μ €λ³„λ‘œ λ‹€λ₯Ό 수 μžˆμ§€λ§Œ μš°μ„  기본적인 λ‹¨κ³„λŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.)

λ Œλ”λ§ 엔진 λ™μž‘ κ³Όμ •

1) HTML νŒŒμ‹± ν›„ DOM 트리 λ§Œλ“€κΈ°
2) λ Œλ” 트리(Render Tree) λ§Œλ“€κΈ°
3) λ Œλ” 트리(Render Tree) λ ˆμ΄μ•„μ›ƒ λ§Œλ“€κΈ°
4) λ Œλ” 트리 νŽ˜μΈνŒ… (Renter Tree Painting)

HTML νŒŒμ‹±ν›„ DOM 트리 λ§Œλ“€κΈ°

HTML νŒŒμ‹± 과정에 λŒ€ν•΄ μ„€λͺ…ν•˜κΈ° 전에, 기본적인 컴파일 λ™μž‘ 과정을 보면,

HTML νŒŒμ‹±ν›„ DOM 트리 λ§Œλ“€κΈ°

β€‹λ Œλ”λ§ 엔진은 μš°μ„  λ„€νŠΈμ›Œν¬ λ ˆμ΄μ–΄λ₯Ό 톡해 전달받은 HTML λ¬Έμ„œ(Source code)λ₯Ό νŒŒμ‹±(Parsing) ν•˜μ—¬ 각 μš”μ†Œλ“€μ„ DOM Tree(Contents Tree)의 각 DOM λ…Έλ“œ λ“€λ‘œ μ „ν™˜ν•©λ‹ˆλ‹€.

DOMμ΄λž€ Document object model 의 μ€€λ§λ‘œ λ§ˆν¬μ—… ν˜•νƒœμ˜ HTML λ¬Έμ„œλ₯Ό 였브젝트 λͺ¨λΈμ˜ ν˜•νƒœλ‘œ 바꿔놓은 κ²ƒμž…λ‹ˆλ‹€.

λ‹Ήμ—°νžˆ HTML λ¬Έμ„œμ˜ 각 λ§ˆν¬μ—…κ³Ό DOM의 각 μš”μ†ŒλŠ” 1:1 λ§€μΉ­λ©λ‹ˆλ‹€.

<html>
  <body>
    <p>
      Hello World
    </p>
    <div> <img src="example.png"/></div>
  </body>
</html>

이 μ½”λ“œλ₯Ό DOM Tree둜 μ „ν™˜ν•  λ•Œ μ•„λž˜μ™€ 같이 ꡬ성됨.

HTML νŒŒμ‹±ν›„ DOM 트리 λ§Œλ“€κΈ°

​


β€‹λ Œλ” 트리(Render Tree) λ§Œλ“€κΈ°

HTML λ¬Έμ„œλ“€μ„ νŒŒμ‹±ν•˜μ—¬ DOM Treeλ₯Ό κ΅¬μ„±ν•œ ν›„, λ Œλ”λ§ 엔진은 CSS/Style 데이터λ₯Ό νŒŒμ‹±ν•˜κ³  κ·Έ μŠ€νƒ€μΌ λ°μ΄ν„°λ“€λ‘œ λ Œλ” 트리(Render Tree)λ₯Ό λ§Œλ“­λ‹ˆλ‹€.

​

DOM νŠΈλ¦¬κ°€ μ›Ή 상에 λ‚˜νƒ€λ‚  λ‚΄μš©(Contents)λ₯Ό κ΅¬μ„±ν•œλ‹€λ©΄

λ Œλ” νŠΈλ¦¬λŠ” μ‹œκ°μ  μš”μ†Œ, μ–΄λ–»κ²Œ λ‚˜νƒ€λ‚ μ§€ κ·Έ μŠ€νƒ€μΌμ„ μ§€μ •ν•©λ‹ˆλ‹€.

​

λ Œλ” νŠΈλ¦¬λŠ” 색상, 차원 λ“± μ‹œκ°μ  지침듀을 담은 μ •μ‚¬κ°ν˜•λ“€λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

κ·Έ μ •μ‚¬κ°ν˜•λ“€μ€ μŠ€ν¬λ¦°μ— λ§žλŠ” μˆœμ„œλŒ€λ‘œ μ •λ ¬λ˜μ–΄μ•Ό ν•˜μ£ .

λ Œλ” 트리 각각의 μ •μ‚¬κ°ν˜•μ— ν•΄λ‹Ήν•˜λŠ” Renderer λ Œλ”λŸ¬ 듀은 DOM 트리 μš”μ†Œ(element)듀에 μ μš©λ˜μ§€λ§Œ 1:1 관계가 μ„±λ¦½λ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.

μ‹œκ°μ μ΄μ§€ μ•Šμ€ DOM μš”μ†Œλ“€μ€ λ Œλ” νŠΈλ¦¬μ— μ‚½μž…λ  수 μ—†μŠ΅λ‹ˆλ‹€.

​

<head> νƒœκ·Έ μ•ˆμ˜ μš”μ†Œλ“€μ€ 화면에 λ‚˜νƒ€λ‚˜λŠ” 값듀을 ν¬ν•¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ κ·Έ μ–΄λ–€ Renderer도 적용될 수 μ—†μ£ .

μ–΄λ–€ λ Œλ”λŸ¬λ“€μ€ DOM λ…Έλ“œμ— 적용될 수 μžˆμœΌλ‚˜ κΌ­ 트리의 같은 μœ„κ³„μ— 속할 ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€.

β€‹λ Œλ” 트리(Render Tree) λ§Œλ“€κΈ°


λ Œλ” 트리(Render Tree) λ ˆμ΄μ•„μ›ƒ λ§Œλ“€κΈ°

λ ˆμ΄μ•„μ›ƒμ„ λ§Œλ“ λ‹€λŠ” 것은 각 λ…Έλ“œλ“€μ—κ²Œ 슀크린의 μ–΄λŠ 곡간에 μœ„μΉ˜ν•΄μ•Ό 할지 각각의 κ°’(Positionm, Size)을 λΆ€μ—¬ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.


λ Œλ” 트리 νŽ˜μΈνŒ… (Renter Tree Painting)

λ Œλ” νŠΈλ¦¬κ°€ λ§Œλ“€μ–΄μ Έ λ ˆμ΄μ•„μ›ƒμ΄ κ΅¬μ„±λ˜μ—ˆλ‹€λ©΄, UI λ²‘μ—”λ“œκ°€ λ™μž‘ν•˜μ—¬ 각 λ…Έλ“œλ“€μ„ 정해진 μŠ€νƒ€μΌ 및 μœ„μΉ˜κ°’λŒ€λ‘œ 화면에 λ°°μΉ˜ν•©λ‹ˆλ‹€.

​

더 λ‚˜μ€ UX(User experience)λ₯Ό μœ„ν•΄, λ Œλ”λ§ 엔진은 각 μ½˜ν…μΈ λ₯Ό κ°€λŠ₯ν•œν•œ 빨리 μŠ€ν¬λ¦°μ— λ„μ›Œμ•Ό ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ λͺ¨λ“  HTML μš”μ†Œλ“€μ„ λ Œλ”λ§ μ—”μ§„μœΌλ‘œ λ„£μ–΄μ„œ ν•œλ²ˆμ— 좜λ ₯ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, 일뢀 μ½˜ν…μΈ λŠ” λ¨Όμ € 트리 과정을 거쳐 μŠ€ν¬λ¦°μ— λ‚˜νƒ€λ‚˜κ³ , κ·Έ 와쀑에 μ›Ήμ˜ λ‹€λ₯Έ μš”μ†Œλ“€μ€ λ„€νŠΈμ›Œν¬λ₯Ό 톡해 λ Œλ”λ§ μ—”μ§„μœΌλ‘œ 읽어듀어 μ˜€λŠ” 순차적인 λ°©μ‹μœΌλ‘œ μž…μΆœλ ₯이 μ§„ν–‰λ©λ‹ˆλ‹€.

 

​