πŸ“ƒ ν”„λ‘ νŠΈμ—”λ“œ 인터뷰 문제 닡해보기 #9 `<script>` νƒœκ·Έμ— λŒ€ν•΄ μ–Όλ§ˆλ‚˜ μ•Œκ³  μžˆλ‚˜μš”?

Jake SeoΒ·2020λ…„ 6μ›” 15일
1

πŸ“ƒ ν”„λ‘ νŠΈμ—”λ“œ 인터뷰 문제 닡해보기 #9 <script> νƒœκ·Έμ— λŒ€ν•΄ μ–Όλ§ˆλ‚˜ μ•Œκ³  μžˆλ‚˜μš”?

Prologue

κΉƒν—ˆλΈŒλ₯Ό λŒμ•„λ‹€λ‹ˆλ‹€κ°€ μ˜ˆμ „μ— ν”„λ‘ νŠΈμ—”λ“œ 개발자 인터뷰 μ§ˆλ¬Έμ΄λΌλŠ” λ ˆν¬μ§€ν† λ¦¬λ₯Ό 본적이 μžˆλ‹€. 사싀 κ·Έ λ‹Ήμ‹œμ—λŠ” κ·Έλƒ₯ μŠ€νƒ€λ§Œ λˆŒλŸ¬λ†“κ³  큰 관심이 μ—†μ—ˆμ§€λ§Œ μ§€κΈˆλΆ€ν„° ν•˜λ‚˜μ”© 풀어보렀 ν•©λ‹ˆλ‹€.

λ¬Όλ‘  λ§Žμ€ 닡듀이 이미 이 λ ˆν¬μ§€ν† λ¦¬μ— μž‘μ„±λ˜μ–΄ 있긴 ν•œλ°, μž‘μ„±λ˜μ§€ μ•Šμ€ 것듀도 있고 λ‚΄ λ‹΅μ΄λž‘ λͺ¨λ²”λ‹΅μ•ˆμ„ λΉ„κ΅ν•˜λŠ” 것도 쒋을 것 κ°™μ•„μ„œ ν•œλ²ˆ 풀어보렀 ν•©λ‹ˆλ‹€.

문제 μ„ μ •

κΈ°μ‘΄ λ ˆν¬μ§€ν† λ¦¬μ—λŠ” 문제의 λΆ„λ₯˜κ°€ μ•„λž˜μ™€ 같이 λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

  1. General Questions
  2. HTML Questions
  3. CSS Questions
  4. JS Questions
  5. Accessibility Questions (external link)
  6. Testing Questions
  7. Performance Questions
  8. Network Questions
  9. Coding Questions
  10. Fun Questions

맀일 1가지씩 λŒμ•„κ°€λ©° ν’€ 건데, General Questions ν•­λͺ©μ—μ„œ λ„ˆλ¬΄ 일반적인 λ¬Έμ œλŠ” 풀지 μ•Šμ„ 것이닀. λ„ˆλ¬΄ 일반적인 문제의 μ •μ˜λŠ” μ‚¬λžŒλ§ˆλ‹€ 닡이 λ‹€λ₯Ό 수 μžˆλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

이λ₯Όν…Œλ©΄...

What did you learn yesterday/this week? (μ–΄μ œ/μ΄λ²ˆμ£Όμ— 무엇을 λ°°μ› λ‚˜μš”)
What excites or interests you about coding? (무엇이 당신을 μ½”λ”©ν•˜κ³  μ‹Άκ²Œ λ§Œλ“œλ‚˜μš”?)
What is a recent technical challenge you experienced and how did you solve it?(μ΅œκ·Όμ— κ²ͺ은 기술적인 어렀움과 그것을 μ–΄λ–»κ²Œ ν•΄κ²°ν–ˆλŠ”μ§€ μ•Œλ €μ£Όμ„Έμš”)

μ΄λŸ¬ν•œ 것듀은 λ‹΅λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이런 λ¬Έμ œλŠ” κ·Έλ•Œκ·Έλ•Œ 닡이 λ‹¬λΌμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³ 

λ‚˜μ˜ 닡변은 높은 ν™•λ₯ λ‘œ 틀릴 μˆ˜λ„ 있으며, μ•„λ‹ˆλ©΄ 맞게 κ°€λ‹€κ°€ 쀑간에 μ΄μƒν•œ 길둜 빠질 μˆ˜λ„ μžˆλ‹€. λŒ“κΈ€μ— μžμ‹ λ§Œμ˜ 닡을 올렀주면 맀우 고마울 것 κ°™μŠ΅λ‹ˆλ‹€.

Q: <script>, <script async>, <script defer>의 차이λ₯Ό μ„€λͺ…ν•΄λ³΄μ„Έμš”.

Describe the difference between <script>, <script async> and <script defer>

A:

  • <script>λŠ” HTML νŒŒμ‹±μ„ λΈ”λ‘μ‹œν‚΅λ‹ˆλ‹€. μŠ€ν¬λ¦½νŠΈλŠ” fetch 이후에 μ¦‰κ°μ μœΌλ‘œ μ‹€ν–‰λ˜λ©° μŠ€ν¬λ¦½νŠΈκ°€ μ „λΆ€ λλ‚œ 이후에 HTML νŒŒμ‹±μ΄ μž¬κ°œλ©λ‹ˆλ‹€.
  • <script async>λŠ” HTML νŒŒμ‹±κ³Ό ν•¨κ»˜ λ³‘λ ¬μ μœΌλ‘œ μ½”λ“œκ°€ μˆ˜ν–‰λ©λ‹ˆλ‹€. (μΌλ°˜μ μœΌλ‘œλŠ” HTML νŒŒμ‹±μ΄ λλ‚˜κΈ° 전에 <script async>λŠ” μ‚¬μš©ν•  μ€€λΉ„κ°€ μ™„λ£Œλ©λ‹ˆλ‹€. analytics와 같은 μ½”λ“œλŠ” <script async>와 잘 λ§žμŠ΅λ‹ˆλ‹€.
  • <script defer>λŠ” HTML νŒŒμ‹± 쀑에 λ³‘λ ¬μ μœΌλ‘œ fetch 되고, HTML νŒŒμ‹±μ΄ λλ‚œ 이후에 μ‹€ν–‰λ©λ‹ˆλ‹€. 만일, <script defer> μš”μ†Œκ°€ μ—¬λŸ¬κ°œ μ‘΄μž¬ν•œλ‹€λ©΄, λͺ¨λ“  <script defer>λŠ” μˆœμ„œλŒ€λ‘œ μˆ˜ν–‰λ  κ²ƒμž…λ‹ˆλ‹€. 만일 μŠ€ν¬λ¦½νŠΈκ°€ μ™„μ „νžˆ νŒŒμ‹±λœ DOM μš”μ†Œμ— μ˜μ‘΄ν•œλ‹€λ©΄ <script defer>λ₯Ό μ‚¬μš©ν•˜κΈ° μ ν•©ν•©λ‹ˆλ‹€. 사싀 <body>의 끝 뢀뢄에 <script>λ₯Ό μœ„μΉ˜μ‹œν‚€λŠ” 것과 <script defer>λ₯Ό μ‚¬μš©ν•˜λŠ” 것에 큰 μ°¨μ΄λŠ” μ—†μŠ΅λ‹ˆλ‹€.

src 속성이 μ—†λŠ” 경우 async와 defer μ˜΅μ…˜μ€ λ¬΄μ‹œλ‹Ήν•©λ‹ˆλ‹€.

Q: 일반적으둜 CSS λ§ν¬λŠ” <head></head> 사이에 두고, JS λ§ν¬λŠ” </body> λ°”λ‘œ 전에 μž…λ ₯ν•˜λŠ”κ²Œ 쒋은지 μ„€λͺ…ν•  수 μžˆλ‚˜μš”?

Why is it generally a good idea to position CSS <link>s between <head>``</head> and JS <script>s just before </body>? Do you know any exceptions?

A1: CSS 링크λ₯Ό <head></head> 사이에 두어야 ν•˜λŠ” 이유

링크λ₯Ό <head></head> μ˜μ—­μ— λ‘λŠ” 것은 μ΅œμ ν™”λœ μ›Ήμ‚¬μ΄νŠΈλ₯Ό λ§Œλ“œλŠ”λ° μ μ ˆν•©λ‹ˆλ‹€. μ›Ή νŽ˜μ΄μ§€κ°€ 처음으둜 λ‘œλ“œλ  λ•Œ, HTMLκ³Ό CSSλŠ” λ™μ‹œμ— νŒŒμ‹±λ˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€. HTML은 DOM을 λ§Œλ“€κ³ , CSSλŠ” CSSOM(CSS Object Model)을 λ§Œλ“€κ²Œ λ©λ‹ˆλ‹€.

μ›Ήμ‚¬μ΄νŠΈμ˜ μ‹œκ°μ  μš”μ†Œλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” 두 가지가 λͺ¨λ‘ ν•„μš”ν•©λ‹ˆλ‹€. 두 가지 μš”μ†Œκ°€ νŒŒμ‹±λ˜λ©° "첫 μ˜λ―ΈμžˆλŠ” νŽ˜μΈνŒ…(first meaningful paint)" 타이밍이 λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€. 이 ν”„λ‘œκ·Έλ ˆμ‹œλΈŒ λ Œλ”λ§μ€ μΉ΄ν…Œκ³ λ¦¬ μ΅œμ ν™” μ‚¬μ΄νŠΈλ“€μ˜ 퍼포먼슀 츑정에 μ μš©λ©λ‹ˆλ‹€.

CSSλ₯Ό λ¬Έμ„œμ˜ μ•„λž˜μͺ½μ— λ‘λŠ” 것은 νŽ˜μ΄μ§€κ°€ ν”„λ‘œκ·Έλ ˆμ‹œλΈŒ λ Œλ”λ§μ„ μ§„ν–‰ν•˜λŠ” 것을 λ°©ν•΄ν•©λ‹ˆλ‹€. λͺ‡λͺ‡ λΈŒλΌμš°μ €λ“€μ€ 만일 μŠ€νƒ€μΌμ΄ λ³€κ²½λ˜λ©΄, μ—˜λ¦¬λ¨ΌνŠΈλ“€μ„ λ‹€μ‹œ 페인트 ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 그것을 막기 μœ„ν•΄ λ Œλ”λ§μ„ λΈ”λ‘ν•˜λŠ” κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€. κ·Έ λ•Œ μ‚¬μš©μžλŠ” ν•˜μ–€μƒ‰ 빈 νŽ˜μ΄μ§€λ₯Ό 보고 있게 λ©λ‹ˆλ‹€. μ•„λ‹ˆλ©΄ μŠ€νƒ€μΌλ§λ˜μ§€ μ•Šμ€ μ›ΉνŽ˜μ΄μ§€κ°€ μž μ‹œ λ³΄μ—¬μ§ˆ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

A2: <script>λ₯Ό </body> 전에 두어야 ν•˜λŠ” 이유

<script>λŠ” λ‹€μš΄λ‘œλ“œλ˜κ³  μ‹€ν–‰λ˜λŠ” λ™μ•ˆ HTML νŒŒμ‹±μ„ λΈ”λ‘ν•©λ‹ˆλ‹€. HTML μ•„λž˜μ— <script>νƒœκ·Έλ₯Ό μž…λ ₯ν•˜λ©΄ λ‹Ήμž₯ μ‚¬μš©μžμ—κ²Œ 보여져야 ν•˜λŠ” HTML이 λ¨Όμ € νŒŒμ‹±λ˜μ–΄ 쒋은 μ‚¬μš©μž κ²½ν—˜μ„ μ΄λŒμ–΄λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€λ§Œ, document.write()κ°€ ν¬ν•¨λœ μŠ€ν¬λ¦½νŠΈκ°€ μžˆμ„ λ•ŒλŠ” </body>의 λ°”λ‘œ μ•žμ— μž‘μ„±ν•˜λŠ” 것이 쒋지 μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. ν˜„λŒ€ μ›Ήμ—μ„œλŠ” 사싀 document.write()λ₯Ό μ‚¬μš©ν•˜λŠ” 것 μžμ²΄κ°€ ꢌμž₯λ˜λŠ” 방법은 μ•„λ‹™λ‹ˆλ‹€. λ˜ν•œ <script>λ₯Ό μ•„λž˜μ— λ°°μΉ˜ν•œλ‹€λŠ” 것은 λΈŒλΌμš°μ €κ°€ λͺ¨λ“  documentλ₯Ό νŒŒμ‹±ν•˜κΈ° μ „κΉŒμ§€λŠ” scriptλ₯Ό λ‹€μš΄λ°›μ„ 수 μ—†λ‹€λŠ” 이야기가 λ©λ‹ˆλ‹€. 이 말은 DOM을 μž‘μ„±ν•˜λŠ” μ½”λ“œκ°€ errorλ‚˜ throwλ₯Ό ν•˜μ§€ μ•ŠλŠ” 것을 보μž₯ν•©λ‹ˆλ‹€. <head> 내뢀에 <script>λ₯Ό μœ„μΉ˜μ‹œν‚€κ³  μ‹Άλ‹€λ©΄ defer 속성을 μ΄μš©ν•˜λ©΄ 될 κ²ƒμž…λ‹ˆλ‹€.

Q: ν”„λ‘œκ·Έλ ˆμ‹œλΈŒ λžœλ”λ§μ΄λž€ λ¬΄μ—‡μΈκ°€μš”?

what is progressive rendering?

A:

ν”„λ‘œκ·Έλ ˆμ‹œλΈŒ λžœλ”λ§μ΄λž€ λ””μŠ€ν”Œλ ˆμ΄μ— 컨텐츠λ₯Ό μ΅œλŒ€ν•œ λΉ λ₯΄κ²Œ λžœλ”λ§ν•˜κΈ° μœ„ν•΄ μ›ΉνŽ˜μ΄μ§€μ˜ 퍼포먼슀λ₯Ό 올리기 μœ„ν•œ κΈ°μˆ μ— 뢙여진 μ΄λ¦„μž…λ‹ˆλ‹€.

κ΄‘λŒ€μ—­ 인터넷이 있기 전에 훨씬 더 μœ ν–‰ν–ˆλ˜ κΈ°μˆ μ΄μ§€λ§Œ, μ—¬μ „νžˆ λͺ¨λ°”일 데이터 컀λ„₯μ…˜κ³Ό 같은 ν˜„λŒ€ κ°œλ°œμ—μ„œλ„ 많이 μ‚¬μš©λ©λ‹ˆλ‹€.

기술의 μ˜ˆμ œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • μ΄λ―Έμ§€μ˜ Lazy loading 기법 - νŽ˜μ΄μ§€μ˜ 이미지λ₯Ό ν•œ λ²ˆμ— λ‘œλ“œν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ‚¬μš©μžμ˜ μŠ€ν¬λ‘€μ— μ‘λ‹΅ν•˜μ—¬ ν•„μš”ν•œ 뢀뢄을 λ‘œλ“œν•˜λŠ” κΈ°μˆ μž…λ‹ˆλ‹€.
  • μ»¨ν…μΈ μ˜ μš°μ„ μˆœμœ„ μ •ν•˜κΈ° 기법 - νŽ˜μ΄μ§€κ°€ ν•„μš”λ‘œ ν•˜λŠ” μ΅œμ†Œν•œμ˜ CSS, λ‚΄μš©, 슀크립트λ₯Ό λ‘œλ“œν•˜μ—¬ ν•„μš”ν•œ 뢀뢄을 λΉ λ₯΄κ²Œ λ‘œλ“œν•œ 뒀에 λ‚˜λ¨Έμ§€ λ¦¬μ†ŒμŠ€λ“€μ„ λ‘œλ“œν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€.
  • 비동기적 HTML λ‘œλ”© - λ°±μ—”λ“œμ—μ„œ νŽ˜μ΄μ§€μ— ν•„μš”ν•œ 정보듀이 처리되고 μžˆμ„ λ•Œ, μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ§€λŠ” HTML을 λ¨Όμ € λ‘œλ“œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

레퍼런슀

https://github.com/yangshun/front-end-interview-handbook/blob/master/contents/en/html-questions.md#describe-the-difference-between-script-script-async-and-script-defer
https://developer.yahoo.com/performance/rules.html#css_top
https://www.techrepublic.com/blog/web-designer/how-to-prevent-flash-of-unstyled-content-on-your-websites/
https://developers.google.com/web/fundamentals/performance/critical-rendering-path/

profile
ν’€μŠ€νƒ μ›Ήκ°œλ°œμžλ‘œ μΌν•˜κ³  μžˆλŠ” Jake Seoμž…λ‹ˆλ‹€. 주둜 Jake SeoλΌλŠ” λ‹‰λ„€μž„μ„ 많이 μ”λ‹ˆλ‹€. ν”„λ‘ νŠΈμ—”λ“œ: Javascript, React λ°±μ—”λ“œ: Spring Framework에 관심이 μžˆμŠ΅λ‹ˆλ‹€.

0개의 λŒ“κΈ€