[์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ FE 19๊ธฐ] ์Šคํ”„๋ฆฐํŠธ ๋ฏธ์…˜ 4 ํ›„๊ธฐ

2025. 8. 30. 22:36ยท๐Ÿ‘€ ํ”„๋กœ์ ํŠธ ๋ฐ ํ™œ๋™/์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ 19๊ธฐ

๐Ÿ“ ์Šคํ”„๋ฆฐํŠธ ๋ฏธ์…˜ ์ฃผ์ œ

๋ฏธ์…˜ 4๋Š” ๊ธฐ์กด ๋ฏธ์…˜์—์„œ ์ž‘์—…ํ•œ ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€์—

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ฃผ์ œ์˜€๋‹ค.

 

๐Ÿ” ์Šคํ”„๋ฆฐํŠธ ๋ฏธ์…˜ ์ง„ํ–‰ ๊ณผ์ •

๐Ÿ–ฅ๏ธ ์ด์ „ ์ž‘์—… ์ˆ˜์ •

1. name ์†์„ฑ ์ถ”๊ฐ€

๋ฏธ์…˜ 4๋ฅผ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ๋ณด๋‹ˆ input์ด๋‚˜ from ํƒœ๊ทธ์—

name ์†์„ฑ์ด ๋น ์ ธ ์žˆ์–ด์„œ ๊ทธ ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ๋‹ค.

name ์†์„ฑ์€ ํผ ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ key ์—ญํ• ์„ ํ•œ๋‹ค.
form์ด ์ œ์ถœ๋  ๋•Œ, ๊ฐ input์˜ name=value ํ˜•ํƒœ๋กœ ์„œ๋ฒ„์— ์ „๋‹ฌ๋จ

 

2. autocomplete ์†์„ฑ ์ถ”๊ฐ€

๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์„ ํ™•์ธํ•ด๋ณด๋‹ˆ autocomplete ์†์„ฑ๊ณผ ๊ด€๋ จ๋œ ๊ฒฝ๊ณ ๊ฐ€ ๋– ์„œ

์ ‘๊ทผ์„ฑ์„ ์œ„ํ•ด ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

 

autocomplete ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด

์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ค€๋‹ค.

 

๐Ÿ—‚๏ธ ํด๋” ๊ตฌ์กฐ

๐Ÿ“ฆ sprintMission
 โ”ฃ ๐Ÿ“‚constant
 โ”ƒ โ”— ๐Ÿ“œregex.js
 โ”ฃ ๐Ÿ“‚css
 โ”ƒ โ”ฃ ๐Ÿ“œauth-style.css
 โ”ƒ โ”ฃ ๐Ÿ“œcommon.css
 โ”ƒ โ”ฃ ๐Ÿ“œindex-style.css
 โ”ƒ โ”— ๐Ÿ“œvariables.css
 โ”ฃ ๐Ÿ“‚images
 โ”ฃ ๐Ÿ“‚js
 โ”ƒ โ”ฃ ๐Ÿ“œauth.js
 โ”ƒ โ”— ๐Ÿ“œauth-handlers.js
 โ”ฃ ๐Ÿ“œindex.html
 โ”ฃ ๐Ÿ“œlogin.html
 โ”ฃ ๐Ÿ“œsignup.html
 โ”— ๐Ÿ“œitem.html

์ด๋ฒˆ ๋ฏธ์…˜๋ถ€ํ„ฐ JSํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ด์„œ js ํด๋”๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ ,

์ •๊ทœ์‹์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด constant ํด๋”๋ฅผ ๋ณ„๋„๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

 

โš™๏ธ ๊ตฌํ˜„๊ณผ์ •

๐Ÿ“‚ ํŒŒ์ผ ๋‚˜๋ˆ„๊ธฐ

JS ํŒŒ์ผ์€ ํฌ๊ฒŒ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค.

  • auth.js → ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ฝ”๋“œ
  • auth-handler.js → ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์—ฐ๊ฒฐ ์ฝ”๋“œ

๊ฐ HTML ํŒŒ์ผ์—๋Š” auth-handler.js๋งŒ ์—ฐ๊ฒฐํ–ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ„๋ฉด DOM ์ œ์–ด์™€ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ๊ด€๋ฆฌํ•˜๊ธฐ๋„ ํŽธ๋ฆฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

 

์ฒ˜์Œ์—๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์—ฐ๊ฒฐ ์ฝ”๋“œ๋ฅผ login.js, signup.js๋กœ ๋‚˜๋ˆ  ์ž‘์„ฑํ–ˆ๋Š”๋ฐ,

๊ฒฐ๊ตญ ๋กœ๊ทธ์ธ๊ณผ ํšŒ์›๊ฐ€์ž… ๋ชจ๋‘ ํผ ๊ฒ€์ฆ + ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณด์ด๊ธฐ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์ด ๊ฐ™์•„์„œ

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ auth-handler.js์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ๋ฐ”๊พธ์—ˆ๋‹ค.

 

โš ๏ธ ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ

ํผ ์—๋Ÿฌ ๋ฉ”์„ธ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด span ํƒœ๊ทธ๋ฅผ htmlํŒŒ์ผ์— ๋ฏธ๋ฆฌ ์ถ”๊ฐ€ํ•ด๋‘์—ˆ๋‹ค.

<span class="auth-input-errorMsg none"></span>

์ด๋ฉ”์ผ์ด๋‚˜ ๋‹‰๋„ค์ž„ input์€ ๋‹ค์Œ ํ˜•์ œ ์š”์†Œ๋กœ ํ•ด๋‹น ์—๋Ÿฌ spanํƒœ๊ทธ๊ฐ€ ์žˆ์–ด์„œ

nextElementSibling์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ

const errorSpan = input.nextElementSibling

๋น„๋ฐ€๋ฒˆํ˜ธ input์€ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณด์ด๊ธฐ ๋ฒ„ํŠผ ๋•Œ๋ฌธ์—

divํƒœ๊ทธ๋กœ ํ•œ ๋ฒˆ ๋” ๊ฐ์‹ธ์ ธ ์žˆ์–ด์„œ ์œ„์ฒ˜๋Ÿผ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค.

 

์–ด๋–ป๊ฒŒ ํ• ์ง€ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ closest() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๊ณ ,

closest()๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€๋‹ค.

const errorSpan = input.closest('.auth-input-area').querySelector('.auth-input-errorMsg')

closest()๋Š” ์ง€์ •ํ•œ ์„ ํƒ์ž์™€ ์ผ์น˜ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์กฐ์ƒ ์š”์†Œ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

๋ชจ๋“  input์ด .auth-input-area์— ๊ฐ์‹ธ์ ธ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—

์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ span ํƒœ๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์œ„ ๋ฐฉ์‹์œผ๋กœ span ํƒœ๊ทธ ์ ‘๊ทผ์„ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋”๋‹ˆ

์—๋Ÿฌ๋ฉ”์„ธ์ง€๊ฐ€ ์›ํ•˜๋Š” ์œ„์น˜์— ์ž˜ ๋‚˜ํƒ€๋‚œ๋‹ค.

 

โœ… ํผ ์œ ํšจ์„ฑ ๊ฒ€์ฆ

const handleFormValidation = (e) => {
  const { name, value } = e.target
  let errorMsg = ''

  if (name === 'email') {
    errorMsg = isRequired(value, '์ด๋ฉ”์ผ์„') || validateEmail(value)
  } else if (name === 'password') {
    errorMsg = isRequired(value, '๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ') || validatePassword(value)
  } else if (name === 'confirmPassword') {
    errorMsg = isRequired(value, '๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ') || validateConfirmPassword(value)
  } else if (name === 'nickname') {
    errorMsg = isRequired(value, '๋‹‰๋„ค์ž„์„') || validateNickname(value)
  }

  errorMsg ? showErrorMsg(e.target, errorMsg) : clearErrorMsg(e.target)
}

์ฒ˜์Œ์—๋Š” if ~ else if๋ฌธ์œผ๋กœ ์กฐ๊ฑด๋ณ„ ๊ฒ€์ฆ์„ ์ฒ˜๋ฆฌํ–ˆ์ง€๋งŒ,

์ค‘๋ณต์ด ๋งŽ์•„ ๋ณด์—ฌ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

const validators = {
  email: (value) => isRequired(value, '์ด๋ฉ”์ผ์„') || validateEmail(value),
  password: (value) => isRequired(value, '๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ') || validatePassword(value),
  confirmPassword: (value) => isRequired(value, '๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ') || validateConfirmPassword(value),
  nickname: (value) => isRequired(value, '๋‹‰๋„ค์ž„์„') || validateNickname(value),
}

export const handleInputValidation = (e) => {
  const { name, value } = e.target
  const errorMsg = validators[name] ? validators[name](value) : ''
  errorMsg ? showErrorMsg(e.target, errorMsg) : clearErrorMsg(e.target)
}

||์—ฐ์‚ฐ์ž์˜ ํŠน์ง•(a || b → a๊ฐ€ true๋ฉด a๋ฅผ ๋ฆฌํ„ด)์„ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

์•ž์˜ ๊ฒ€์ฆ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ ,

ํ†ต๊ณผํ•˜๋ฉด ๋นˆ ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋˜์–ด ๋‹ค์Œ ๊ฒ€์ฆ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์ด ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์ด ๋ฐฉ์‹์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ผ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ

if ~ else if๋ฌธ ๋Œ€์‹  ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•จ์ถ•์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ ๊ฐ™์•„

์•„์ง์€ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค.

 

๐ŸŽจ ์—‰๋šฑํ•œ ์š”์†Œ์— css๊ฐ€ ์ ์šฉ๋˜๋Š” ๋ฌธ์ œ

input ๊ฐ’์ด ์œ ํšจํ•˜๋ฉด auth-input-complete ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ–ˆ๋Š”๋ฐ,

๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณด์ด๊ธฐ ๋ฒ„ํŠผ(.show-password-button)์—๋„ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์ ์šฉ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

์›์ธ์€ clearErrorMsg ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ

input ํƒœ๊ทธ๋งŒ ์ „๋‹ฌ๋ ๊ฑฐ๋ผ๋Š” ์˜ˆ์ƒ๊ณผ ๋‹ฌ๋ฆฌ ๋ฒ„ํŠผ ์š”์†Œ๋„ ํ•จ๊ป˜ ๋“ค์–ด์˜ค๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ handleInputValidation์—์„œ input ํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฐ”๋กœ ๋ฆฌํ„ดํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.

export const handleInputValidation = (e) => {
  if (e.target.tagName !== 'INPUT') return

  const { name, value } = e.target
  const errorMsg = validators[name] ? validators[name](value) : ''
  errorMsg ? showErrorMsg(e.target, errorMsg) : clearErrorMsg(e.target)
}

์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ–ˆ๋”๋‹ˆ ๋ฌธ์ œ ์—†์ด ์ž˜ ๋™์ž‘ํ–ˆ๋‹ค.

 

๐Ÿ”€ ํŽ˜์ด์ง€ ์ด๋™ ์ฒ˜๋ฆฌ

๋ฏธ์…˜ ์š”๊ตฌ์‚ฌํ•ญ์—์„œ API ์—ฐ๋™์€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์—

๊ฒ€์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด ๋‹จ์ˆœํžˆ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

location.replace('/item.html')

์ด๋•Œ location.replace() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™์‹œ์ผฐ๋‹ค.

replace()๋Š” ํžˆ์Šคํ† ๋ฆฌ์— ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—

์‚ฌ์šฉ์ž๊ฐ€ ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋”๋ผ๋„ ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์—†๋‹ค.

 

๋กœ๊ทธ์ธ์ด๋‚˜ ํšŒ์›๊ฐ€์ž…์— ์„ฑ๊ณตํ•œ ํ›„ ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ

๋‹ค์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋‚˜ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๊ฐ€ ๋ณด์ด๋Š” ๊ฒƒ์€

์–ด์ƒ‰ํ•œ ๋™์ž‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ replace()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

โœ๏ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ

๐Ÿงน ํด๋ฆฐ ์ฝ”๋“œ ๊ด€๋ จ ํ”ผ๋“œ๋ฐฑ

์ด๋ฒˆ ๋ฏธ์…˜์—์„œ๋Š” ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ณ 

ํ•œ ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜์˜ ์—ญํ• ๋งŒ ํ•˜๋„๋ก ์ž‘์„ฑํ•˜๋ ค๊ณ  ์‹ ๊ฒฝ์„ ์ผ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฝ”๋“œ ๋ถ„๋ฆฌ๋ฅผ ์ž˜ ํ–ˆ๋Š”์ง€ ํ™•์‹ ์ด ์„œ์ง€ ์•Š์•„ ์งˆ๋ฌธ์„ ๋“œ๋ ธ๊ณ ,

๋ฉ˜ํ† ๋‹˜๊ป˜์„œ ํ† ์Šค์—์„œ ์ง„ํ–‰ํ•œ ํด๋ฆฐ์ฝ”๋“œ ์˜์ƒ์„ ์ถ”์ฒœํ•ด์ฃผ์…จ๋‹ค.

 

์˜์ƒ์—์„œ๋Š” ์‹ค๋ฌด์—์„œ ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ํด๋ฆฐ์ฝ”๋“œ๋ผ๊ณ  ํ•˜๋Š”์ง€

์‘์ง‘๋„ ๋†’์€ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ฌ๋ก€์™€ ํ•จ๊ป˜ ๋‹ค๋ฃจ๊ณ  ์žˆ์—ˆ๋‹ค.

ํŠนํžˆ ์ฝ”๋“œ ์‘์ง‘์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์˜์ƒ์ด ๋„์›€์ด ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

 

์‚ฌ์‹ค ์•„์ง ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€๋Š” ๋ชปํ–ˆ์ง€๋งŒ,

์‹œ๊ฐ„์ด ๋‚  ๋•Œ ๋‹ค์‹œ ์˜์ƒ์„ ๋ณด๋ฉด์„œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ธฐ์ค€์„ ์ƒ๊ฐํ•ด ๋ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

โฉ script ํƒœ๊ทธ์˜ async/defer ๊ด€๋ จ ํ”ผ๋“œ๋ฐฑ

์ด๋ฒˆ ๊ตฌํ˜„์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด body ๋‹ซ๋Š” ํƒœ๊ทธ ๋ฐ”๋กœ ์œ„์— script ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์—ˆ๋‹ค.

<body>
    ...
    <script type="module" src="./js/auth-handlers.js"></script>
</body>

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•œ ์ด์œ ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ DOM์„ ํŒŒ์‹ฑํ•  ๋•Œ

script ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด ํŒŒ์‹ฑ์„ ๋ฉˆ์ถ˜๋‹ค๋Š” ์ ์ด ์ƒ๊ฐ๋‚˜์„œ

DOM์ด ๋ชจ๋‘ ๊ทธ๋ ค์ง„ ํ›„์— ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก body ํƒœ๊ทธ ํ•˜๋‹จ์— ์ถ”๊ฐ€ํ–ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ ๋‹น์‹œ ์ด ๋ฐฉ์‹์ด ์˜ˆ์ „ ๋ Œ๋”๋ง ์ฐจ๋‹จ ๋ฌธ์ œ๋ฅผ ์œ„ํ•ด ์ž์ฃผ ์“ฐ๋˜ ๋ฐฉ์‹์ด๊ณ ,

ํ˜„์žฌ๋Š” head์— ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ๋‘๊ณ  defer ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํ˜„๋Œ€์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์•Œ๋ ค์ฃผ์…จ๋‹ค.

 

defer ์†์„ฑ

  • ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค์šด๋กœ๋“œ๋œ๋‹ค.
  • DOM ํŒŒ์‹ฑ์€ ๋ฉˆ์ถ”์ง€ ์•Š๋Š”๋‹ค.
  • ์‹คํ–‰์€ DOM ํŒŒ์‹ฑ์ด ๋๋‚œ ๋’ค์— ์ผ์–ด๋‚œ๋‹ค.

defer๋ฅผ ์“ฐ๋ฉด ๋ Œ๋”๋ง ์ฐจ๋‹จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ๋„ DOM์ด ์ค€๋น„๋œ ๋’ค์— ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋˜ํ•œ, ์ด๋ฒˆ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•œ type="module" ์†์„ฑ์€

๊ธฐ๋ณธ์ ์œผ๋กœ defer์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๋„ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ตณ์ด body ํ•˜๋‹จ์— ๋‘˜ ํ•„์š” ์—†๊ณ , head ํ•˜๋‹จ์— ์œ„์น˜์‹œ์ผœ๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

 

์ด์™€ ํ•จ๊ป˜ ์ž์ฃผ ๋น„๊ต๋˜๋Š” ์†์„ฑ์ธ async๋„ ์งš์–ด์ฃผ์…จ๋‹ค.

async ์†์„ฑ

  • ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค์šด๋กœ๋“œ๋œ๋‹ค.
  • ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๋๋‚˜๋Š” ์ฆ‰์‹œ ์‹คํ–‰๋˜๋ฏ€๋กœ DOM ํŒŒ์‹ฑ์ด ๋ฉˆ์ถœ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌธ์„œ ๋‚ด ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ , ๊ฐ€์žฅ ๋จผ์ € ๋‹ค์šด๋กœ๋“œ๋œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.

์ด ํŠน์„ฑ ๋•Œ๋ฌธ์— async๋Š” ์ฃผ๋กœ ๊ตฌ๊ธ€ ์• ๋„๋ฆฌํ‹ฑ์Šค(GA)๋‚˜ ๊ด‘๊ณ ์ฒ˜๋Ÿผ
DOM๊ณผ ๋ณ„๊ฐœ๋กœ ์‹คํ–‰๋˜๋Š” ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

๐Ÿ‘ ์Šคํ”„๋ฆฐํŠธ ๋ฏธ์…˜ 4 ํ›„๊ธฐ

์ด๋ฒˆ ๋ฏธ์…˜์€ ์ด์ „ ๋ฏธ์…˜๋ณด๋‹ค ํ™•์‹คํžˆ ๋‚œ์ด๋„๊ฐ€ ๋†’๊ฒŒ ๋А๊ปด์กŒ๋‹ค.

ํŠนํžˆ ํ•จ์ˆ˜ ๋ถ„๋ฆฌ๋‚˜ ์ค‘๋ณต ์ œ๊ฑฐ, ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์–ผ๋งˆ๋‚˜ ์ž˜ ์ง€ํ‚ค๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ๊ณ ๋ฏผ์ด ๋งŽ์•˜๋‹ค.

 

์•„์ง์€ ๊ธฐ์ค€์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์•„ ๊ณ„์† ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉฐ ์ž‘์„ฑํ–ˆ์ง€๋งŒ,

๊ทธ๋ž˜๋„ ์ด๋Ÿฐ ๊ณ ๋ฏผ ๊ณผ์ • ์ž์ฒด๊ฐ€ ์˜๋ฏธ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๐Ÿฅน

 

๋‹ค์Œ ๋ฏธ์…˜๋ถ€ํ„ฐ๋Š” ๋ฆฌ์•กํŠธ๋ฅผ ํ™œ์šฉํ•ด ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฑธ๋กœ ์•Œ๊ณ  ์žˆ๋‹ค.

๋ฆฌ์•กํŠธ๋„ ๋‹ค์‹œ ์ž˜ ๊ณต๋ถ€ํ•ด์„œ ์•ž์œผ๋กœ์˜ ๋ฏธ์…˜๋„ ์ž˜ ์™„์ˆ˜ํ•˜๊ณ  ์‹ถ๋‹ค. ๐Ÿ‘

 

 

 

728x90
'๐Ÿ‘€ ํ”„๋กœ์ ํŠธ ๋ฐ ํ™œ๋™/์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ 19๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ FE 19๊ธฐ] 7์ฃผ์ฐจ ํšŒ๊ณ ๋ก
  • [์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ FE 19๊ธฐ] 6์ฃผ์ฐจ ํšŒ๊ณ ๋ก
  • [์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ FE 19๊ธฐ] 5์ฃผ์ฐจ ํšŒ๊ณ ๋ก
  • [์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ FE 19๊ธฐ] ์Šคํ”„๋ฆฐํŠธ ๋ฏธ์…˜ 3 ํ›„๊ธฐ
_์ด์•Ž
_์ด์•Ž
๊ณต๋ถ€ ๊ธฐ๋ก ๋ธ”๋กœ๊ทธ
  • _์ด์•Ž
    ๊ณต๋ถ€
    _์ด์•Ž
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • โœ๏ธ ๋ชจ๋“  ๊ธ€ (51) N
      • ๐Ÿ“š ํ”„๋ก ํŠธ์—”๋“œ (36) N
        • React (9) N
        • HTML_CSS (9)
        • Javascript (13)
        • git_github (4)
        • Web (1)
      • ๐Ÿ‘€ ํ”„๋กœ์ ํŠธ ๋ฐ ํ™œ๋™ (11) N
        • ์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ 19๊ธฐ (11) N
      • โš™๏ธ etc. (4)
  • ๋งํฌ

    • ๐Ÿ‘‹ GitHub
    • ๐Ÿง ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ธฐ๋ก
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.4
_์ด์•Ž
[์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ FE 19๊ธฐ] ์Šคํ”„๋ฆฐํŠธ ๋ฏธ์…˜ 4 ํ›„๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”