Codeκ°œλ°œμΌμ§€

Optimization μ΅œμ ν™”

Minhhk 2023. 2. 1. 16:33
πŸ₯Ά μ΅œμ ν™”, optimization
  • 주어진 μƒν™©μ—μ„œ μ›ν•˜λŠ” κ°€μž₯ μ•Œλ§žμ€ κ²°κ³Όλ₯Ό 얻을 수 μžˆλ„λ‘ μ²˜λ¦¬ν•˜λŠ” κ³Όμ •.
  • μ΅œμ ν™”λŠ” ν—ˆμš©λœ μžμ›μ˜ ν•œκ³„ λ‚΄μ—μ„œ 주어진 μš”ꡬ사항을 λ§Œμ‘±μ‹œν‚€λ©΄μ„œ μ΅œμ„ μ˜ κ²°κ³Όλ₯Ό μ–»λŠ” 과정이닀.

     

컴퓨터 κ³΅ν•™μ—μ„œμ˜ μ΅œμ ν™” :

μ΅œμ†Œν•œμ˜ λ¦¬μ†ŒμŠ€λ₯Ό μ†Œλͺ¨ν•˜λ©΄μ„œ κ°€λŠ₯ν•œ ν•œ λΉ λ₯΄κ²Œ μ›ν•˜λŠ” κ²°κ³Όλ₯Ό 얻을 수 μžˆλ„λ‘ ν•˜λŠ” 것을 의미!

 

μ΅œμ ν™”μ˜ ν•„μš”μ„± 및 효과

 

1. μ΄νƒˆλ₯  κ°μ†Œ

2. μ „ν™˜μœ¨ 증가

3. 수읡 μ¦λŒ€

4. μ‚¬μš©μž κ²½ν—˜(UX) ν–₯상

 

πŸ“ŒHTML, CSS μ½”λ“œ μ΅œμ ν™”ν•˜κΈ°

1. HTML μ΅œμ ν™” 방법

(1) DOM 트리 κ°€λ³κ²Œ λ§Œλ“€κΈ°

(2) 인라인 μŠ€νƒ€μΌ μ‚¬μš©ν•˜μ§€ μ•ŠκΈ°

2. CSS μ΅œμ ν™” 방법

(1) μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” CSS μ œκ±°ν•˜κΈ°

(2) κ°„κ²°ν•œ μ…€λ ‰ν„° μ‚¬μš©ν•˜κΈ°

 

 

 

πŸ“Œλ¦¬μ†ŒμŠ€ λ‘œλ”© μ΅œμ ν™”ν•˜κΈ°

 

1. CSS 파일 뢈러였기 → CSSOM 트리λ₯Ό κ°€λŠ₯ν•œ λΉ λ₯΄κ²Œ ꡬ성할 수 μžˆλ„λ‘ HTML λ¬Έμ„œ μ΅œμƒλ‹¨μ— 배치

2. JavaScript 파일 뢈러였기 → 슀크립트 생성이 λλ‚ λ•ŒκΉŒμ§€ DOM트리 생성이 μ€‘λ‹¨λ˜μ–΄ λ Œλ”λ§μ΄ λŠλ €μ Έμ„œ DOM트리 μ™„μ„± 후에 슀크립트λ₯Ό 뢈러올 수 μžˆλ„λ‘ μ΅œν•˜λ‹¨μ— μœ„μΉ˜ν•˜λ„λ‘ ν•œλ‹€.

 

 

 

πŸ“ŒλΈŒλΌμš°μ € 이미지 μ΅œμ ν™”ν•˜κΈ°

 

1. 이미지 μŠ€ν”„λΌμ΄νŠΈ

  • 이미지 μŠ€ν”„λΌμ΄νŠΈ 기법은 μ—¬λŸ¬ 개의 이미지λ₯Ό λͺ¨μ•„ ν•˜λ‚˜μ˜ μŠ€ν”„λΌμ΄νŠΈ μ΄λ―Έμ§€λ‘œ λ§Œλ“€κ³  CSS의 background-position속성을 μ‚¬μš©ν•΄ μ΄λ―Έμ§€μ˜ 일정 λΆ€λΆ„λ§Œ 클래슀 λ“±μœΌλ‘œ κ΅¬λΆ„ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 방법
  • ν•˜λ‚˜μ˜ 이미지λ₯Ό λ°°κ²½ μ΄λ―Έμ§€λ‘œ μ‚¬μš©ν•˜λ˜, ν‘œμ‹œν•˜κ³  싢은 뢀뢄에 맞좰 width, height, background-position 속성을 μ£Όμ–΄ μ•„μ΄μ½˜μ„ λ§Œλ“­λ‹ˆλ‹€

2. μ•„μ΄μ½˜ 폰트 μ‚¬μš©ν•˜κΈ°

(1) CDN으둜 μ‚¬μš©ν•˜κΈ°

(2) Font Awesome λͺ¨λ“ˆ μ„€μΉ˜ν•˜κΈ°

(3) WebP λ˜λŠ” AVIF 이미지 포맷 μ‚¬μš©ν•˜κΈ° → μš©λŸ‰κ°μ†Œ, 단 ν˜Έν™˜λ¬Έμ œ λ°œμƒ

이미지 μ΅œμ ν™”λ₯Ό μœ„ν•΄ μ „ν†΅μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” JPEG λ˜λŠ” PNG ν˜•μ‹μ΄ μ•„λ‹Œ μƒˆλ‘­κ²Œ λ“±μž₯ν•œ 이미지 포맷인 WebP λ˜λŠ” AVIFλ₯Ό μ‚¬μš©ν•˜μ—¬ μš©λŸ‰μ„ λ”μš± κ°μ†Œμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. WebPλŠ” PNG와 비ꡐ해 26% μš©λŸ‰μ΄ κ°μ†Œλ˜λ©° JPEG와 λΉ„κ΅ν–ˆμ„ 땐 25-35% 더 κ°μ†Œλ©λ‹ˆλ‹€. AVIFλŠ” JPEG와 λΉ„κ΅ν–ˆμ„ λ•Œ 무렀 μš©λŸ‰μ˜ 50%κ°€ κ°μ†Œλ˜λ©° WebP와 λΉ„κ΅ν–ˆμ„ 땐 20% κ°μ†Œλ©λ‹ˆλ‹€.

 

 

πŸ“ŒCDN μ‚¬μš©ν•˜κΈ°
  • CDN은 μœ μ €κ°€ κ°€κΉŒμš΄ 곳에 μœ„μΉ˜ν•œ 데이터 μ„Όν„°(μ„œλ²„)의 데이터λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ 데이터가 μ „λ‹¬λ˜κΈ° μœ„ν•΄ κ±°μ³μ•Όν•˜λŠ” μ„œλ²„μ˜ κ°―μˆ˜κ°€ 크게 쀄기 λ•Œλ¬Έμ— λ‘œλ”© 속도가 λΉ¨λΌμ§‘λ‹ˆλ‹€.

 

 

μΊμ‹œ μ‚¬μš©ν•˜κΈ°

μΊμ‹œ(Cache)λŠ” λ‹€μš΄λ‘œλ“œ 받은 λ°μ΄ν„°λ‚˜ 값을 미리 볡사해 λ†“λŠ” μž„μ‹œ μž₯μ†Œλ₯Ό λœ»ν•¨

  1. μ„œλ²„μ—μ„œ 응닡을 보내쀄 λ•Œ 이미지 파일과 ν•¨κ»˜ 헀더에 Cache-Control을 μž‘μ„±ν•΄μ„œ 보낸닀.
  2. λ‘λ²ˆμ§Έ μš”μ²­λΆ€ν„°λŠ” μΊμ‹œλ₯Ό μš°μ„ μ‘°νšŒν•œλ‹€. μ΄λ•Œ μΊμ‹œκ°€ μœ νš¨ν•˜λ‹€λ©΄ μΊμ‹œμ—μ„œ ν•΄λ‹Ήν•˜λŠ” 데이터λ₯Ό κ°€μ Έμ™€μ„œ μ‚¬μš©ν•œλ‹€.
  3. μΊμ‹œκ°€ μœ νš¨ν•˜μ§€ μ•Šλ‹€λ©΄ μ„œλ²„μ—μ„œ λ‹€μ‹œ 이미지λ₯Ό λ°›μ•„μ˜€κ²Œ λœλ‹€.
  • μ΄λ•Œ 유효 μ‹œκ°„μ€ μ§€λ‚¬μ§€λ§Œ μΊμ‹œμ— μ €μž₯λ˜μ–΄μžˆλŠ” 이미지와 받아와야 ν•˜λŠ” 이미지가 κ°™λ‹€λ©΄ μΊμ‹œ 검증 헀더와 μ‘°κ±΄λΆ€ μš”μ²­ 헀더λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

μ΄λ ‡κ²Œ λΈŒλΌμš°μ € μΊμ‹œλ₯Ό ν™œμš©ν–ˆμ„ λ•Œμ˜ 효과

  • μΊμ‹œκ°€ μœ νš¨ν•œ μ‹œκ°„ λ™μ•ˆ λ„€νŠΈμ›Œν¬ λ¦¬μ†ŒμŠ€λ₯Ό μ•„λ‚„ 수 있음
  • νŒŒμΌμ„ λ‹€μ‹œ λ°›μ•„μ˜¬ ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ— λΈŒλΌμš°μ € λ‘œλ”©μ΄ 빨라짐
  • λ‘œλ”©μ΄ 빨라진 만큼 λΉ λ₯Έ μ‚¬μš©μž κ²½ν—˜ 제곡 κ°€λŠ₯

 

 

μΊμ‹œ 검증 헀더

μΊμ‹œμ— μ €μž₯된 데이터와 μ„œλ²„μ˜ 데이터가 λ™μΌν•œμ§€ ν™•μΈν•˜κΈ° μœ„ν•œ 정보λ₯Ό 담은 응닡 헀더

  • Last-Modified : 데이터가 λ§ˆμ§€λ§‰μœΌλ‘œ μˆ˜μ •λœ μ‹œμ μ„ μ˜λ―Έν•˜λŠ” 응닡 ν—€λ”λ‘œ, 쑰건뢀 μš”μ²­ 헀더인 If-Modified-Since 와 λ¬Άμ–΄μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.
  • Etag : λ°μ΄ν„°μ˜ 버전을 μ˜λ―Έν•˜λŠ” 응닡 ν—€λ”λ‘œ, 쑰건뢀 μš”μ²­ 헀더인 If-None-Match 와 λ¬Άμ–΄μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

쑰건뢀 μš”μ²­ 헀더

μΊμ‹œμ˜ 데이터와 μ„œλ²„μ˜ 데이터가 λ™μΌν•˜λ‹€λ©΄ μž¬μ‚¬μš©ν•˜κ²Œ ν•΄λ‹¬λΌλŠ” 의미의 μš”μ²­ 헀더

  • If-Modified-Since : μΊμ‹œλœ λ¦¬μ†ŒμŠ€μ˜ Last-Modified κ°’ 이후에 μ„œλ²„ λ¦¬μ†ŒμŠ€κ°€ μˆ˜μ •λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κ³ , μˆ˜μ •λ˜μ§€ μ•Šμ•˜λ‹€λ©΄ μΊμ‹œλœ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • If-None-Match : μΊμ‹œλœ λ¦¬μ†ŒμŠ€μ˜ ETag κ°’κ³Ό ν˜„μž¬ μ„œλ²„ λ¦¬μ†ŒμŠ€μ˜ ETag 값이 같은지 ν™•μΈν•˜κ³ , κ°™μœΌλ©΄ μΊμ‹œλœ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

 

1. 첫번째 μš”μ²­μ—μ„œ μΊμ‹œ μœ νš¨μ‹œκ°„μ΄ 60초인 이미지 νŒŒμΌμ„ 같이 λ°›μ•„μ˜΄. μ΄λ•Œ Last-Modified 헀더에 λ‹΄κΈ΄ λ‚΄μš©λ„ μΊμ‹œμ— ν•¨κ»˜ μ €μž₯ (μ„œλ²„μ˜ 파일 버전을 μ˜λ―Έν•˜λŠ” Etag헀더에 λ‹΄κΈ΄ λ‚΄μš©λ„ μΊμ‹œμ— ν•¨κ»˜ μ €μž₯)

2. μΊμ‹œ μœ νš¨μ‹œκ°„μ„ μ§€λ‚œ ν›„ λ‘λ²ˆμ§Έ μš”μ²­μ—μ„œ

  • If-Modified-Sinceλ₯Ό μž‘μ„±ν•΄ μ €μž₯ν•΄λ‘” Last-Modified κ°’κ³Ό ν•¨κ»˜ μš”μ²­μ„ 보낸닀. 이 값을 μ΄μš©ν•΄ μ„œλ²„λ°μ΄ν„°μ˜ μ΅œμ’… μˆ˜μ •μΌκ³Ό μΊμ‹œμ— μ €μž₯된 λ°μ΄ν„°μ˜ μˆ˜μ •μΌμ΄ 같은지 ν™•μΈν•œλ‹€. (If-None-Matchλ₯Ό μž‘μ„±ν•˜κ³  μΊμ‹œμ— ν•¨κ»˜ μ €μž₯ν•΄λ†“μ•˜λ˜ Etag 값을 λ‹΄μ•„ μš”μ²­μ„ 보내어 이 값을 μ΄μš©ν•΄ μ„œλ²„ λ°μ΄ν„°μ˜ Etag와 μΊμ‹œμ— μ €μž₯된 λ°μ΄ν„°μ˜ Etagλ₯Ό λΉ„κ΅ν•©λ‹ˆλ‹€. 두 데이터가 λ™μΌν•œ 데이터라면 두 Etag값이 κ°™μ•„μ•Ό ν•©λ‹ˆλ‹€.)

 

3. 데이터가 μˆ˜μ •λ˜μ§€ μ•Šμ•˜μ„ 경우 304 Not Modified 응닡.μΊμ‹œ λ°μ΄ν„°μ˜ μœ νš¨μ‹œκ°„μ΄ κ°±μ‹ λ˜μ–΄ μž¬μ‚¬μš©ν•  수 있게 λœλ‹€.

 

 

 

νŠΈλ¦¬μ‰μ΄ν‚Ή(Tree Shaking)μ΄λž€?

말 κ·ΈλŒ€λ‘œ λ‚˜λ¬΄λ₯Ό 흔듀어 μž”κ°€μ§€λ₯Ό ν„Έμ–΄λ‚΄λ“― λΆˆν•„μš”ν•œ μ½”λ“œλ₯Ό μ œκ±°ν•˜λŠ” 것

1. JavaScript 파일의 크기 증가

  • HTTP μš”μ²­ 수 λ˜ν•œ λ°μŠ€ν¬νƒ‘μ—μ„œ 155.6%, λͺ¨λ°”μΌμ—μ„œ 425.0% 증가함. 크기가 훨씬 컀진 JavaScript 파일이 λŠ˜μ–΄λ‚œ μš”μ²­ 횟수만큼 더 μ˜€κ°€λŠ” κ²ƒμ΄λ‹ˆ, λ„€νŠΈμ›Œν¬ λ¦¬μ†ŒμŠ€ μ†Œλͺ¨κ°€ 그만큼 μ»€μ‘Œλ‹€.

2. JavaScript 파일의 μ‹€ν–‰ μ‹œκ°„ 증가

 

 

JavaScript νŠΈλ¦¬μ‰μ΄ν‚Ή

1. ν•„μš”ν•œ λͺ¨λ“ˆλ§Œ import ν•˜κΈ°

import { useState, useEffect } from 'react'

λΆˆλŸ¬μ˜€μ§€ μ•Šμ€ μ½”λ“œλŠ” λΉŒλ“œν•  λ•Œ μ œμ™Έλ˜λ―€λ‘œ μ½”λ“œμ˜ 크기λ₯Ό 쀄일 수 있게 λ©λ‹ˆλ‹€.

 

 

2. Babelrc 파일 μ„€μ •ν•˜κΈ°

{
  “presets”: [
    [
      “@babel/preset-env”,
      {
	    "modules": false
      }
    ]
 ]
}

Babel : μžλ°”μŠ€ν¬λ¦½νŠΈ 문법이 κ΅¬ν˜• λΈŒλΌμš°μ €μ—λ„ ν˜Έν™˜ κ°€λŠ₯ν•˜λ„λ‘ ES5 λ¬Έλ²•μœΌλ‘œ λ³€ν™˜.

es5λŠ” importλ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ•„ commonJSλ¬Έλ²•μ˜ require둜 λ³€κ²½μ‹œν‚¨λ‹€.

require은 exportλ˜λŠ” λͺ¨λ“  λͺ¨λ“ˆμ„ 뢈러였기 λ•Œλ¬Έμ— ν•„μš”ν•˜μ§€ μ•Šμ€ λͺ¨λ“ˆκΉŒμ§€ λͺ¨λ‘ 뢈러였게 λœλ‹€.

이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•œ μ½”λ“œ!!

modules값을 true둜 μ„€μ •ν•˜λ©΄ 항상 ES5 λ¬Έλ²•μœΌλ‘œ λ³€ν™˜

 

3. sideEffects μ„€μ •ν•˜κΈ°

const crews = ['kimcoding', 'parkhacker']

const addCrew = function (name) {
	crews.push(name)
}

addCrewν•¨μˆ˜λŠ” ν•¨μˆ˜ 외뢀에 μžˆλŠ” 배열인 crewsλ₯Ό λ³€κ²½μ‹œν‚€λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

 

ν•΄λ‹Ή ν•¨μˆ˜λŠ” 외뢀에 영ν–₯을 주지도 받지도 μ•ŠλŠ” ν•¨μˆ˜, 순수 ν•¨μˆ˜κ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— νŠΈλ¦¬μ‰μ΄ν‚Ήμ„ 톡해 μ œμ™Έν•˜λŠ” 경우 λ¬Έμ œκ°€ 생길 μˆ˜λ„ μžˆλ‹€κ³  νŒλ‹¨ν•΄ μ›ΉνŒ©μ€ 이 μ½”λ“œλ₯Ό μ œμ™Έμ‹œν‚€μ§€ μ•ŠλŠ”λ‹€.

 

이럴 λ•Œ package.json νŒŒμΌμ—μ„œ sideEffectsλ₯Ό μ„€μ •ν•˜μ—¬ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈκ°€ 생기지 μ•Šμ„ κ²ƒμ΄λ―€λ‘œ μ½”λ“œλ₯Ό μ œμ™Έμ‹œμΌœλ„ 됨을 μ›ΉνŒ©μ—κ²Œ μ•Œλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ‹€μŒκ³Ό 같이 μž‘μ„±ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ²΄μ—μ„œ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ 것이닀.

{
  "name": "tree-shaking",
  "version": "1.0.0",
  "sideEffects": false
}

ν˜Ήμ€ μ•„λž˜μ™€ 같이 μž‘μ„±ν•˜μ—¬ νŠΉμ • νŒŒμΌμ—μ„œλŠ” λ°œμƒν•˜μ§€ μ•Šμ„ 것이닀.

{
  "name": "tree-shaking",
  "version": "1.0.0",
  "sideEffects": ["./src/components/NoSideEffect.js"]
}

 

4. ES6 문법을 μ‚¬μš©ν•˜λŠ” λͺ¨λ“ˆ μ‚¬μš©ν•˜κΈ°

ES5 문법을 μ‚¬μš©ν•˜λŠ” λͺ¨λ“ˆμ„ ν†΅μ§Έλ‘œ μ‚¬μš©ν•˜λŠ” 상황이라면 상관X

ES5 μΌλΆ€λ§Œ μ‚¬μš©ν•˜λŠ” 경우, ν•΄λ‹Ή λͺ¨λ“ˆμ„ λŒ€μ²΄ν•  수 μžˆμœΌλ©΄μ„œ ES6λ₯Ό μ§€μ›ν•˜λŠ” λ‹€λ₯Έ λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

ES6 문법을 μ‚¬μš©ν•˜λŠ” λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή λͺ¨λ“ˆμ—μ„œλ„ ν•„μš”ν•œ λΆ€λΆ„λ§Œ import ν•΄μ„œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œλŠ” λΉŒλ“œν•  λ•Œ μ œμ™Έλ˜κΈ° λ•Œλ¬Έ!

 

 

Lighthouse

μ‚¬μ΄νŠΈλ₯Ό 검사해 μ„±λŠ₯ 츑정을 ν•  수 μžˆλŠ” 도ꡬ성λŠ₯검사 + κ°œμ„ μ±…λ„ 제곡

 

  1. ν¬λ‘¬μ—μ„œ κ²€μ‚¬ν•˜κ³  싢은 νŽ˜μ΄μ§€μ˜ url을 μž…λ ₯
  2. 개발자 도ꡬ > Lighthouse 
  3. Generate reportλ₯Ό ν΄λ¦­ν•©λ‹ˆλ‹€. Categoriesμ—μ„œ νŠΉμ •ν•œ μ§€ν‘œλ§Œ μ„ νƒν•˜μ—¬ 검사할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
  4. λŒ€λž΅ 30-60μ΄ˆκ°„ 검사가 μ‹€ν–‰λ©λ‹ˆλ‹€. κ·Έ ν›„ μ•„λž˜μ™€ 같이 λ¦¬ν¬νŠΈκ°€ ν•΄λ‹Ή νŽ˜μ΄μ§€μ˜ 개발자 도ꡬ내에 μƒμ„±λ©λ‹ˆλ‹€.