😦 λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ κ³Όμ •

박상은·2022λ…„ 5μ›” 23일
0

ν•΄λ‹Ή ν¬μŠ€νŠΈλŠ” μžμ„Έν•˜κ²Œ λΈŒλΌμš°μ €μ˜ λͺ¨λ“  λ Œλ”λ§ 과정을 μ •λ¦¬ν•˜λŠ” 것이 μ•„λ‹Œ ν•„μž κΈ°μ€€μœΌλ‘œ ν˜„μž¬ μ΄ν•΄ν•˜κ³  μžˆλŠ” 만큼만 λ Œλ”λ§ 과정을 μ •λ¦¬ν•˜λŠ” ν¬μŠ€νŠΈμž…λ‹ˆλ‹€.

πŸ”Ž λΈŒλΌμš°μ €λž€

λΈŒλΌμš°μ €λž€ HTML, CSS, JavaScript둜 μž‘μ„±λœ νŒŒμΌμ„ νŒŒμ‹±ν•΄μ„œ 화면에 λ Œλ”λ§ν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μž…λ‹ˆλ‹€.

κ°„λ‹¨ν•˜κ²Œ μš”μ•½ν•˜μžλ©΄ HTML, CSS, JavaScript νŒŒμΌμ„ ν•΄μ„ν•΄μ„œ μ‚¬μš©μžκ°€ 보기 쒋도둝 화면을 κ·Έλ €μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μž…λ‹ˆλ‹€.

더 κ΅¬μ²΄μ μœΌλ‘œλŠ” μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€, λΈŒλΌμš°μ € 엔진, 톡신, UI λ°±μ—”λ“œ, JS 해석기, 자료 μ €μž₯μ†Œ λ“± λ§Žμ€ κΈ°λŠ₯듀이 λ‚΄μž₯λ˜μ–΄ μžˆμ§€λ§Œ ν˜„μž¬ ν¬μŠ€νŒ…μ— ν•„μš”ν•œ κΈ°λŠ₯만 μž‘μ„±ν•˜κ² μŠ΅λ‹ˆλ‹€.

πŸ›« 톡신 μš”μ²­

λΈŒλΌμš°μ €μ˜ 검색창에 νŠΉμ • URL을 κ²€μƒ‰ν•˜κ²Œ 되면 톡신 μš”μ²­μ„ ν•˜κ²Œ λ©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ www.naver.com둜 κ²€μƒ‰ν•˜κ²Œ λœλ‹€λ©΄ DNSλ₯Ό ν†΅ν•΄μ„œ μΌμΉ˜ν•˜λŠ” IPμ£Όμ†Œλ₯Ό μ°Ύκ³  ν•΄λ‹Ή μ£Όμ†Œλ₯Ό κ°–λŠ” μ„œλ²„λ‘œ μš”μ²­μ„ μ „λ‹¬ν•©λ‹ˆλ‹€.

  • CMDλ₯Ό ν†΅ν•΄μ„œ ping www.naver.com λͺ…령을 해보면 www.naver.com의 IPμ£Όμ†Œλ₯Ό μ•Œ 수 있으며, IPμ£Όμ†Œλ₯Ό μ΄μš©ν•΄μ„œ κ²€μƒ‰ν•˜λ©΄ www.naver.comκ³Ό 같은 νŽ˜μ΄μ§€λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μ„œλ²„λŠ” μš”μ²­μ„ ν™•μΈν•˜κ³  정해진 응닡을 ν•˜κ²Œ λ©λ‹ˆλ‹€.

  • 정해진 μ‘λ‹΅μ΄λž€ νŠΉμ • HTTPλ©”μ„œλ“œμ™€ URI의 μ‘°ν•©μœΌλ‘œ μš”μ²­μ„ 보내면 μ„œλ²„μΈ‘μ—μ„œλŠ” 그에 맞게 응닡을 미리 μ •ν•΄λ†¨μŠ΅λ‹ˆλ‹€. κ·Έ 응닡을 정해진 응닡이라고 ν‘œν˜„ν–ˆμŠ΅λ‹ˆλ‹€.
    ( html, json, 이미지, 폰트 λ“±μ˜ μ—¬λŸ¬κ°€μ§€ λ¦¬μ†ŒμŠ€λ₯Ό 응닡할 수 μžˆμŠ΅λ‹ˆλ‹€. )

μ•”λ¬΅μ μœΌλ‘œ μš”μ²­μ€ index.html을 μš”μ²­ν•˜λŠ” 것과 κ°™μœΌλ―€λ‘œ www.naver.com/index.html에 μš”μ²­μ„ ν•˜λŠ” 것과 κ°™κ³  μ„œλ²„μ—μ„œλŠ” ν•΄λ‹Ήν•˜λŠ” html을 μ‘λ‹΅ν•˜κ²Œ λ©λ‹ˆλ‹€.

μ‹€μ œλ‘œ www.naver.comκ³Ό www.naver.com/index.htmlλ₯Ό λ“€μ–΄κ°€λ³΄κ²Œ 되면 같은 응닡을 λ°›λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

www.naver.comμ—μ„œ λ„€νŠΈμ›Œν¬ νŒ¨λ„μ„ μ—΄κ³  μš”μ²­μ„ 해보면 μ΄μƒν•˜κ²Œλ„ index.html외에 λ§Žμ€ νŒŒμΌλ“€μ„ μš”μ²­ν•˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
JavaScript, CSS, 폰트, 이미지 λ“±μ˜ λ¦¬μ†ŒμŠ€λ“€μ„ μš”μ²­ν•˜κ²Œ λ˜λŠ”λ° 이것을 졜초 μš”μ²­ν•œ index.html을 νŒŒμ‹±ν•˜λŠ” 도쀑에 index.html λ‚΄λΆ€μ—μ„œ <script>λ‚˜ <link>둜 μΈν•΄μ„œ μš”μ²­ν•˜λŠ” νŒŒμΌλ“€μ΄κΈ° λ•Œλ¬Έμ— μΆ”κ°€μ μœΌλ‘œ μš”μ²­ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

πŸ› οΈ HTML/CSS νŒŒμ‹±

μ•žμ„œ 톡신 μš”μ²­μœΌλ‘œ μΈν•΄μ„œ html을 λ°›μ•„μ™”λ‹€λ©΄ html을 λΈŒλΌμš°μ € 자체적으둜 νŒŒμ‹±ν•˜κ²Œ λ©λ‹ˆλ‹€.
νŒŒμ‹±ν•˜λŠ” μ΄μœ λŠ” html은 일반 ν…μŠ€νŠΈμ™€ λ‹€λ₯Όκ²Œ μ—†κΈ° λ•Œλ¬Έμ— λΈŒλΌμš°μ €μ—μ„œ μ΄ν•΄ν•˜κ³  화면에 κ·Έλ €μ£ΌκΈ° μœ„ν•΄μ„œλŠ” DOM ν˜•νƒœλ‘œ λ³€ν™˜μ‹œμΌœμ€˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

HTML을 νŒŒμ‹±ν•΄μ„œ DOM으둜 λ³€ν™˜μ‹œμΌœμ£Όλ©΄ JavaScriptμ—μ„œλ„ 이해할 수 있고 λΈŒλΌμš°μ €λ„ μ΄ν•΄ν•˜κ³  λ Œλ”λ§μ΄ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

HTML을 νŒŒμ‹±ν•˜λŠ” κ³Όμ •μ—μ„œ CSSλ‚˜ JavaScript λ“±μ˜ λ¦¬μ†ŒμŠ€λ₯Ό ν•„μš”ν•˜κ²Œ λœλ‹€λ©΄ 일단 HTML νŒŒμ‹±μ„ μ€‘μ§€ν•˜κ³  μš”μ²­ν•œ CSSλ‚˜ JavaScriptλΆ€ν„° 톡신 μš”μ²­μ„ ν†΅ν•΄μ„œ μš”μ²­ν•˜κ³  CSSλ₯Ό μš”μ²­ν–ˆλ‹€λ©΄ CSSλ₯Ό λ¨Όμ € νŒŒμ‹±ν•΄ CSSOM을 λ§Œλ“€κ³  λ‚˜μ„œ λ‹€μ‹œ HTMLνŒŒμ‹±μ„ μ΄μ–΄κ°€κ²Œ λ©λ‹ˆλ‹€.

HTML을 일반 ν…μŠ€νŠΈμ™€ λ‹€λ₯Όκ²Œ μ—†λ‹€κ³  ν‘œν˜„ν•œ μ΄μœ λŠ” λ³€μˆ˜, 반볡문, 쑰건문, μžλ£Œκ΅¬μ‘°λ“±μ΄ μ—†λŠ” μ–Έμ–΄λΌμ„œ ν”„λ‘œκ·Έλž˜λ° 언어라고 μƒκ°ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. ( λ¬Όλ‘  개인적인 μƒκ°μž…λ‹ˆλ‹€. )

βš’οΈ JavaScript νŒŒμ‹±

이전에 λ§ν•œ HTML을 νŒŒμ‹±ν•˜λŠ” 도쀑에 JavaScriptλ₯Ό μš”μ²­ν•˜κ²Œ λœλ‹€λ©΄ HTMlνŒŒμ‹±μ„ μΌμ‹œ μ€‘μ§€ν•˜κ³  JavaScriptλ₯Ό λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€.
JavaScript νŒŒμΌμ„ μ‘λ‹΅λ°›μœΌλ©΄ 각 λΈŒλΌμš°μ €κ°€ 가진 JavaScript 엔진을 ν†΅ν•΄μ„œ νŒŒμ‹±μ„ 톡해 ASTλ₯Ό λ§Œλ“€κ³  μ‹€ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.

νŒŒμ‹±ν•œ JavaScriptλ₯Ό ν†΅ν•΄μ„œ DOMμ΄λ‚˜ CSSOM이 λ³€κ²½λ˜κ²Œ λœλ‹€λ©΄ λ¦¬ν”Œλ‘œμš°μ™€ λ¦¬νŽ˜μΈνŒ…μ΄ μ‹€ν–‰λ˜κ²Œ λ©λ‹ˆλ‹€.

🧹 λ Œλ” 트리 생성

μ•žμ„œ HTMLκ³Ό CSSλ₯Ό νŒŒμ‹±ν•΄μ„œ DOMκ³Ό CSSOM을 μƒμ„±ν–ˆλ‹€λ©΄ DOMκ³Ό CSSOM을 ν•©μ³μ„œ λ Œλ” 트리λ₯Ό μƒμ„±ν•˜κ²Œ λ©λ‹ˆλ‹€.

λ Œλ” νŠΈλ¦¬λŠ” μ‹€μ§ˆμ μœΌλ‘œ λΈŒλΌμš°μ €κ°€ 화면을 λ Œλ”λ§ν•  λ•Œ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

μ‹€μ§ˆμ μœΌλ‘œ 화면에 λ Œλ”λ§ν•  λ•Œ μ‚¬μš©ν•˜λŠ” νŠΈλ¦¬μ΄λ―€λ‘œ 화면에 λ Œλ”λ§λ˜μ§€ μ•ŠλŠ” λ…Έλ“œλ“€μ€ ν¬ν•¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄ display: none;같은 속성을 가진 λ…Έλ“œλ‚˜ <script>λ…Έλ“œλŠ” μ‹€μ œλ‘œ 화면을 κ·Έλ¦¬λŠ”λ°λŠ” μ „ν˜€ 영ν–₯을 μ£Όμ§€μ•ŠκΈ° λ•Œλ¬Έμ— λ Œλ” νŠΈλ¦¬μ—μ„œλŠ” μ™„μ „νžˆ μ œμ™Έλ©λ‹ˆλ‹€.

🧭 λ ˆμ΄μ•„μ›ƒ

λ Œλ” 트리λ₯Ό μ™„μ„±ν•œ μ΄ν›„μ—λŠ” μ‹€μ œλ‘œ μš”μ†Œλ“€μ΄ 화면에 λ Œλ”λ§ 되기 μœ„ν•œ λ ˆμ΄μ•„μ›ƒμ„ κ²°μ •ν•˜κ²Œ λ©λ‹ˆλ‹€.
λ ˆμ΄μ•„μ›ƒμ΄λž€ 화면에 μ–΄λŠ μœ„μΉ˜μ— μ–΄λ–€ μš”μ†Œκ°€ κ·Έλ €μ§ˆμ§€λ₯Ό κ²°μ •ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€.
λ ˆμ΄μ•„μ›ƒ κ³Όμ •μ—μ„œλŠ” μƒλŒ€μ μΈ λ‹¨μœ„λ₯Ό κ°–λŠ” μš”μ†Œλ“€μ„ λͺ¨λ‘ μ ˆλŒ€μ μΈ λ‹¨μœ„μΈ px둜 λ³€κ²½ν•©λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄ %, em, vw같은 νŠΉμ • 크기λ₯Ό κΈ°μ€€μœΌλ‘œ 값이 κ²°μ •λ˜λŠ” μš”μ†Œλ“€μ— ꡬ체적인 px값이 μ§€μ •λ˜κ²Œ λ©λ‹ˆλ‹€.
그리고 κ·Έ ꡬ체적인 값을 ν†΅ν•΄μ„œ 각 λ…Έλ“œλ“€μ˜ ꡬ체적인 μœ„μΉ˜μ™€ 크기가 κ²°μ •λ©λ‹ˆλ‹€.

πŸ–ŒοΈ νŽ˜μΈνŒ…

νŽ˜μΈνŒ…μ΄λž€ λ ˆμ΄μ•„μ›ƒμ— μ˜ν•΄μ„œ ꡬ체적인 μœ„μΉ˜λ₯Ό 가진 λ…Έλ“œλ“€ 즉, λ Œλ” 트리λ₯Ό μ΄μš©ν•΄μ„œ λΈŒλΌμš°μ €μ˜ 화면에 λ Œλ”λ§ν•˜λŠ” 과정을 μ˜λ―Έν•©λ‹ˆλ‹€.

νŽ˜μΈνŒ…μ΄ λλ‚˜κ²Œ 되면 μ‚¬μš©μžλŠ” μ™„μ„±λœ 결과물을 ν™”λ©΄μœΌλ‘œ λ³Ό 수 있게 λ©λ‹ˆλ‹€.

✏️ λ¦¬ν”Œλ‘œμš°

μ‚¬μš©μžμ˜ μ–΄λ– ν•œ μ•‘μ…˜μ„ ν†΅ν•΄μ„œ JavaScript의 μ΄λ²€νŠΈκ°€ μ‹€ν–‰λ˜μ–΄ DOMμ΄λ‚˜ CSSOM이 λ³€κ²½λ˜μ–΄ λ ˆμ΄μ•„μ›ƒμ„ λ‹€μ‹œ κ³„μ‚°ν•˜λŠ” ν–‰μœ„λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

λ¦¬ν”Œλ‘œμš°κ°€ λ°œμƒν•œλ‹€λ©΄ λ°˜λ“œμ‹œ λ¦¬νŽ˜μΈνŠΈκ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.

✍️ 리페인트

λ¦¬ν”Œλ‘œμš°λ‘œ μΈν•΄μ„œ μž¬κ²°ν•©λœ λ Œλ” 트리λ₯Ό λ‹€μ‹œ νŽ˜μΈνŠΈν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
ν•˜μ§€λ§Œ λ¦¬ν”Œλ‘œμš°μ— μ˜ν•΄μ„œ μ‹€ν–‰λ˜λŠ” κ²ƒλ§Œμ΄ μ•„λ‹ˆκ³  λ ˆμ΄μ•„μ›ƒμ™Έμ— λ‹€λ₯Έ 것이 λ³€κ²½λœλ‹€λ©΄ 리페인트만 λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.

🐲 μš”μ•½

  1. λΈŒλΌμš°μ €λ₯Ό 톡해 νŠΉμ • URL을 κ²€μƒ‰ν•œλ‹€.
  2. DNSλ₯Ό 톡해 URL에 λ§€μΉ­λ˜λŠ” IPμ£Όμ†Œλ₯Ό μ–»κ³  μš”μ²­μ„ 보낸닀
  3. ν•΄λ‹Ή IPμ£Όμ†Œμ— μ˜ν•΄ μ‘λ‹΅λœ λ¦¬μ†ŒμŠ€λ₯Ό λ°›λŠ”λ‹€.
  4. HTML이라면 λΈŒλΌμš°μ €κ°€ μ΄ν•΄ν•˜κ³  λ Œλ”λ§ν•  수 μžˆλŠ” DOM으둜 νŒŒμ‹±ν•œλ‹€.
  5. HTML을 νŒŒμ‹±ν•˜λŠ” 도쀑에 λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•œλ‹€λ©΄ DOM의 νŒŒμ‹±μ„ μΌμ‹œ μ€‘μ§€ν•˜κ³  λ‹€λ₯Έ λ¦¬μ†ŒμŠ€λ₯Ό λ¨Όμ € μš”μ²­ν•œ λ’€ CSSλ‚˜ JavaScript의 응닡이 μ˜¨λ‹€λ©΄ DOM보닀 λ¨Όμ € νŒŒμ‹±ν•œλ‹€.
    5-1. CSSλŠ” λΈŒλΌμš°μ €κ°€ μ΄ν•΄ν•˜κ³  λ Œλ”λ§ν•  수 μžˆλŠ” CSSOM으둜 νŒŒμ‹±ν•œλ‹€.
    5-2. JavaScript라면 λΈŒλΌμš°μ € 자체적으둜 λ‚΄μž₯된 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진을 ν†΅ν•΄μ„œ ASTλ₯Ό μƒμ„±ν•˜κ³  λ°”μ΄νŠΈ μ½”λ“œλ‘œ λ³€ν™”ν•œλ‹€.
  6. HTMLνŒŒμ‹±μ΄ λλ‚˜λ©΄ DOMκ³Ό CSSOM을 κ²°ν•©ν•΄μ„œ λ Œλ” 트리λ₯Ό μƒμ„±ν•œλ‹€.
  7. λ Œλ” 트리λ₯Ό 화면에 λ Œλ”λ§ν•˜κΈ° μœ„ν•΄ μƒλŒ€μ μΈ λ‹¨μœ„λ₯Ό μ ˆλŒ€μ μΈ λ‹¨μœ„λ‘œ λ³€κ²½ν•΄ 각 λ…Έλ“œμ˜ μœ„μΉ˜μ™€ 크기λ₯Ό κ²°μ •ν•˜λŠ” λ ˆμ΄μ•„μ›ƒκ³Όμ •μ„ κ±°μΉœλ‹€.
  8. λ§ˆμ§€λ§‰μœΌλ‘œ νŽ˜μΈνŒ…μ„ ν•΄μ„œ μœ μ €κ°€ 보기 쒋도둝 λ Œλ” 트리λ₯Ό λΈŒλΌμš°μ €μ— λ Œλ”λ§ν•œλ‹€.
  9. μœ μ €μ˜ νŠΉμ • μ•‘μ…˜μ„ ν†΅ν•΄μ„œ DOMμ΄λ‚˜ CSSOM이 λ³€κ²½λœλ‹€λ©΄ λ¦¬ν”Œλ‘œμš°μ™€ 리페인트λ₯Ό κ±°μ³μ„œ λ‹€μ‹œ 화면을 λ Œλ”λ§ν•œλ‹€.

μœ μ €μ˜ νŠΉμ • μ•‘μ…˜μ΄λž€ λΈŒλΌμš°μ €μ˜ 크기λ₯Ό λ³€κ²½ν•˜λŠ” ν–‰μœ„(μƒλŒ€μ μΈ 크기듀이 λ³€κ²½λœλ‹€.)λ‚˜ JavaScript의 이벀트λ₯Ό ν†΅ν•΄μ„œ λ…Έλ“œλ₯Ό μƒμ„±ν•˜κ±°λ‚˜ μŠ€νƒ€μΌμ„ λ³€κ²½ν•˜λŠ” ν–‰μœ„ 등을 λ§ν•©λ‹ˆλ‹€.

0개의 λŒ“κΈ€