[μ΅μ ν] Optimization κΈ°λ²

π HTML, CSS μ½λ μ΅μ ννκΈ°
νλ©΄μ λ λλ§ν λλ HTML νμΌκ³Ό CSS νμΌμ΄ νμνλ€. HTML νμΌμ DOM νΈλ¦¬λ₯Ό, CSS νμΌμ CSSOM νΈλ¦¬λ₯Ό λ§λ€κ³ λ νΈλ¦¬λ₯Ό κ²°ν©νμ¬ λ λλ§ν λ μ¬μ©νκ² λλ€. μ΄ λ νΈλ¦¬ μ€μμ νλλΌλ λ³κ²½λλ©΄ 리λ λλ§μ μ λ°νλλ°, μ΄λ νΈλ¦¬μ ν¬κΈ°κ° ν¬κ³ 볡μ‘ν μλ‘ λ λ§μ κ³μ°μ΄ νμνκΈ° λλ¬Έμ 리λ λλ§μ μλͺ¨λλ μκ°λ κΈΈμ΄μ§λ€. λ°λΌμ HTML, CSS μ½λλ₯Ό μ΅μ νν¨μΌλ‘μ¨ λ λλ§ μ±λ₯μ ν₯μμν¬ μ μλ€.
π₯ HTML μ΅μ ν λ°©λ²
(1) DOM νΈλ¦¬ κ°λ³κ² λ§λ€κΈ°
DOM νΈλ¦¬κ° κΉμμλ‘, μμ μμκ° λ§μμλ‘ DOM νΈλ¦¬μ 볡μ‘λλ 컀μ§λ€. 볡μ‘λκ° ν΄ μλ‘ DOM νΈλ¦¬κ° λ³κ²½λμμ λ κ³μ°ν΄μΌ νλ κ²λ λ§μμ§λ€. HTML μμλ€μ κ΄κ³λ₯Ό μ μ΄ν΄λ³΄κ³ , λΆνμνκ² κΉμ΄λ₯Ό μ¦κ°μν€λ μμκ° μλ€λ©΄ μμ νμ.
// μμ μ
<div>
<ol>
<li> 첫 λ²μ§Έ </li>
<li> λ λ²μ§Έ </li>
<li> μΈ λ²μ§Έ </li>
</ol>
</div>
// μμ ν : λΆνμν div μμ μ κ±°
<ol>
<li> 첫 λ²μ§Έ </li>
<li> λ λ²μ§Έ </li>
<li> μΈ λ²μ§Έ </li>
</ol>
(2) μΈλΌμΈ μ€νμΌ μ¬μ©νμ§ μκΈ°
μΈλΌμΈ μ€νμΌμ κ°λ³ μμμ μ€νμΌ μμ±μ μμ±ν΄μ£Όλ κ²μ΄κΈ° λλ¬Έμ, ν΄λμ€λ‘ λ¬Άμ΄μ ν λ²μ μμ±ν΄λ λ μ€νμΌ μμ±μ μ€λ³΅μΌλ‘ μμ±νκ² λλ κ²½μ°κ° μκΈ΄λ€. μ΄μ²λΌ λΆνμν μ½λ μ€λ³΅μ κ°λ μ±μ λ¨μ΄λ¨λ¦΄ λΏ μλλΌ νμΌ ν¬κΈ°λ₯Ό μ¦κ°μν¨λ€. λν CSS νμΌμ λ°λ‘ μμ±νλ©΄ λ¨ ν λ²μ 리νλ‘μ°λ§ λ°μνλ κ²κ³Ό λ¬λ¦¬, μΈλΌμΈ μ€νμΌμ 리νλ‘μ°λ₯Ό κ³μν΄μ λ°μμμΌ λ λλ§ μλ£ μμ μ λ¦μΆλ€. μ μ΄μ μΈλΌμΈ μ€νμΌμ μΉ νμ€μ λ§μ§ μμΌλ―λ‘ μ§μν΄μΌ νλ€.
//μμ μ
<div style="margin: 10px;"> λ§μ§ 10px </div>
<div style="margin: 10px;"> μ΄κ²λ λ§μ§ 10px </div>
//μμ ν : classμ CSSλ‘ λ체
<div class="margin10"> λ§μ§ 10px </div>
<div class="margin10"> μ΄κ²λ λ§μ§ 10px </div>
.margin10 {
margin: 10px;
}
π₯ CSS μ΅μ ν λ°©λ²
(1) μ¬μ©νμ§ μλ CSS μ κ±°νκΈ°
CSS νμΌμ λͺ¨λ μ½λμ λΆμμ΄ λλ νμ CSSOM νΈλ¦¬κ° μμ±λλ€. κ·Έλ§νΌ λΆνμν CSS μ½λκ° μλ€λ©΄ CSSOM νΈλ¦¬μ μμ±μ΄ λ¦μ΄μ§λ€. λ°λΌμ μ¬μ©νμ§ μλ CSS μ½λκ° μλ€λ©΄ μ κ±°νλ κ²μ΄ μ’λ€. λ³΄ν΅ ν΄λΉ CSS μ½λλ₯Ό μ¬μ©νλ μμλ₯Ό μμ νλ©΄μ CSS μ½λλ§ λ¨κ² λλ κ²½μ°κ° λ§λ€. μμλ₯Ό μμ ν μΌμ΄ μκΈ°λ©΄, CSS μ½λλ§ λ¨μ§λ μλμ§ νμΈνκ³ ν¨κ» μμ νλ©΄ μ΄λ° μν©μ λ°©μ§ν μ μλ€.
(2) κ°κ²°ν μ λ ν° μ¬μ©νκΈ°
μ λ ν°κ° 볡μ‘ν μλ‘ μ€νμΌ κ³μ°κ³Ό λ μ΄μμμ μκ°μ λ λ§μ΄ μλͺ¨νκ² λλ€. λ°λΌμ μ΅λν κ°κ²°ν CSS μ λ ν°λ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€.
// 볡μ‘ν CSS μ
λ ν° μμ
.cart_page .cart_item #firstItem { ... }
// νμν κ²½μ°μλ μ΄μ© μ μμ§λ§, κ°λ₯ν ν κ°κ²°νκ² μμ±ν΄μ€λ€.
.cart_item { ... }
π 리μμ€ λ‘λ© μ΅μ ννκΈ°
HTML νμΌμμ JavaScript νμΌμ λΆλ¬μ¬ λ <script> μμλ₯Ό, CSS νμΌμ λΆλ¬μ¬ λ <link> μμλ₯Ό μ¬μ©νκ² λλ€. μ΄λ νμΌμ λΆλ¬μ€λ μμΉκ° μ΄λμΈκ°μ λ°λΌμ λ λλ§ μλ£ μμ μ΄ λ¬λΌμ§ μ μλ€.
1. CSS νμΌ λΆλ¬μ€κΈ°
νλ©΄μ λ λλ§ν λλ DOM νΈλ¦¬μ CSSOM νΈλ¦¬κ° νμνλ€. DOM νΈλ¦¬λ HTML μ½λλ₯Ό ν μ€ ν μ€ μ½μΌλ©΄μ μμ°¨μ μΌλ‘ ꡬμ±ν μ μμ§λ§, CSSOM νΈλ¦¬λ CSS μ½λλ₯Ό λͺ¨λ ν΄μν΄μΌ ꡬμ±ν μ μλ€. λ°λΌμ CSSOM νΈλ¦¬λ₯Ό κ°λ₯ν λΉ λ₯΄κ² ꡬμ±ν μ μλλ‘ HTML λ¬Έμ μ΅μλ¨μ λ°°μΉνλ κ²μ΄ μ’λ€.
// CSS νμΌμ HTML νμΌ μλ¨μ head μμ μμμ λΆλ¬μ€λ κ²μ΄ μ’μ΅λλ€.
<head>
<link href="style.css" rel="stylesheet" />
</head>
2. JavaScript νμΌ λΆλ¬μ€κΈ°
JavaScriptλ DOM νΈλ¦¬μ CSSOM νΈλ¦¬λ₯Ό λμ μΌλ‘ λ³κ²½ν μ μλ€. HTML μ½λ νμ± μ€μ <script> μμλ₯Ό λ§λλ μκ° ν΄λΉ μ€ν¬λ¦½νΈκ° μ€νλλ©°, <script> μμ μ΄μ κΉμ§ μμ±λ DOMκΉμ§λ§ μ κ·Όν μ μλ€. <script> μμλ₯Ό HTML μ½λ μ€κ°μ λ£λλ€λ©΄, ν΄λΉ μμ μ΄νμ μμ±λ DOMμ μμ νλ μ½λκ° μλ κ²½μ°μλ νλ©΄μ΄ μλν λλ‘ νμλμ§ μκ² λλ€.
λν μ€ν¬λ¦½νΈ μ€νμ΄ μλ£λκΈ° μ κΉμ§ DOM νΈλ¦¬ μμ±μ΄ μ€λ¨λλ€. JavaScript νμΌμ λ€μ΄λ°μμμ μ¬μ©νλ κ²½μ°μλ λ€μ΄λ‘λ λ° μ€ν¬λ¦½νΈ μ€νμ΄ μλ£λ λκΉμ§ DOM νΈλ¦¬ μμ±μ΄ μ€λ¨λλ€. DOM νΈλ¦¬ μμ±μ΄ μ€λ¨λ μκ°λ§νΌ λ λλ§ μλ£ μκ°μ λ¦μΆ°μ§κ² λλ€. μ΄λ¬ν μ΄μ λ‘ JavaScript νμΌμ DOM νΈλ¦¬ μμ±μ΄ μλ£λλ μμ μΈ HTML λ¬Έμ μ΅νλ¨μ λ°°μΉνλ κ²μ΄ μ’λ€.
<body>
<div>...</div>
...
// JavsScript νμΌμ body μμκ° λ«νκΈ° μ§μ μ μμ±νλ κ²μ΄ κ°μ₯ μ’λ€.
<script src="script.js" type="text/javascript"></script>
</body>
πλΈλΌμ°μ μ΄λ―Έμ§ μ΅μ ννκΈ°
νμ΄μ§μ λλΆλΆμ μ©λμ HTML/CSS/JSμ κ°μ μ½λ λ°μ΄ν°κ° μλ μ΄λ―Έμ§ νμΌκ³Ό κ°μ λ―Έλμ΄ νμΌμ΄ μ°¨μ§νλ€. (μ 체 νμ΄μ§ μ©λμ μ½ 51% μ°¨μ§)κ·Έλμ μ΄λ―Έμ§μ μ©λμ μ€μ΄κ±°λ μμ²μ μλ₯Ό μ€μ΄λ κ²μ μ°μ μ μΌλ‘ κ³ λ €ν μ, μ¬μ©μ κ²½νμ λΉ λ₯΄κ² κ°μ ν μ μλ€.
1. μ΄λ―Έμ§ μ€νλΌμ΄νΈ
ν΄λΌμ΄μΈνΈμμ μλ² μμ²μ΄ μ¦κ°ν μλ‘ λ‘λ© μκ°μ μ μ λμ΄λλ€. λ°λΌμ μΉ νμ΄μ§λ₯Ό λ‘λνλ λ° νμν μλ² μμ² μλ₯Ό μ€μ΄κΈ° μν΄ μ΄λ―Έμ§ μ€νλΌμ΄νΈ κΈ°λ²μ μ¬μ©ν μ μλ€.

λ€μμ λ€μ΄λ²μ λ©μΈ νλ©΄μ μΌλΆμ΄λ€. λ°μ€μ νμν μμ΄μ½ μ΄λ―Έμ§μ κ²½μ° κ°κ°μ μ΄λ―Έμ§λ₯Ό μλ²μ μμ²ν κ²½μ° μΉμ¬μ΄νΈμ λ‘λ© μκ°μ΄ λμ΄λκ² λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ μ¬μ©νλ κΈ°λ²μ΄ μ΄λ―Έμ§ μ€νλΌμ΄νΈμ΄λ€.
μ΄λ―Έμ§ μ€νλΌμ΄νΈ κΈ°λ²μ μ¬λ¬ κ°μ μ΄λ―Έμ§λ₯Ό λͺ¨μ νλμ μ€νλΌμ΄νΈ μ΄λ―Έμ§λ‘ λ§λ€κ³ CSSμ background-position μμ±μ μ¬μ©ν΄ μ΄λ―Έμ§μ μΌμ λΆλΆλ§ ν΄λμ€ λ±μΌλ‘ ꡬλΆνμ¬ μ¬μ©νλ λ°©λ²μ΄λ€.

μ€μ λ‘ λ€μ΄λ²μ μ μν ν κ°λ°μ λꡬλ₯Ό μ΄μ©ν΄ μμ΄μ½ μ»΄ν¬λνΈλ₯Ό μ΄ν΄λ³΄λ©΄ λ€μκ³Ό κ°μ΄ μ€νλΌμ΄νΈ μ΄λ―Έμ§κ° μ μ©λμ΄ μλ κ²μ μ§μ νμΈν μ μλ€.

νλμ μ΄λ―Έμ§λ₯Ό λ°°κ²½ μ΄λ―Έμ§λ‘ μ¬μ©νλ, νμνκ³ μΆμ λΆλΆμ λ§μΆ° width, height, background-position μμ±μ μ£Όμ΄ μμ΄μ½μ λ§λ λ€.
ν΄λΉ κΈ°λ²μ μ΄μ©νλ©΄ νλ²μ μ΄λ―Έμ§ μμ²μΌλ‘ λλΆλΆμ κ°λ³ μ΄λ―Έμ§λ₯Ό μ¬μ©ν μ μκΈ° λλ¬Έμ λ€νΈμν¬ λ‘λ© μκ°μ μ€μΌ μ μλ€. λν, λ§μ μ΄λ―Έμ§ νμΌμ κ°λ³λ‘ κ΄λ¦¬ν νμμμ΄ νΉμ μ€νλΌμ΄νΈ μ΄λ―Έμ§ νμΌλ§μ κ΄λ¦¬νλ©΄ λλ―λ‘ κ΄λ¦¬κ° μ©μ΄νλ€λ μ₯μ μ΄ μλ€. λ€μ΄λ² μμλ§ ν΄λ μ΄λ―Έμ§ μ€νλΌμ΄νΈλ₯Ό ν΅ν΄ 120μ¬κ°μ μμ΄μ½μ νλμ μ΄λ―Έμ§λ‘ λͺ¨λ μ¬μ©ν μ μκ² λμλ€.
2. μμ΄μ½ ν°νΈ μ¬μ©νκΈ°

μμ΄μ½ μ¬μ©μ΄ λ§μ λμλ, λͺ¨λ μμ΄μ½μ μ΄λ―Έμ§λ‘ μ¬μ©νλ κ²μ΄ μλλΌ μμ΄μ½ ν°νΈλ₯Ό μ¬μ©νμ¬ μ©λμ μ€μΌ μ μλ€. λνμ μΈ μμ΄μ½ κΈκΌ΄ μλΉμ€λ‘λ Font Awesomeμ΄ μλ€. Font Awesomeμ μ¬μ© λ°©λ²μλ λ κ°μ§κ° μλ€.
(1) CDNμΌλ‘ μ¬μ©νκΈ°
Font Awesomeμ κ°μ νλ©΄ ν€νΈλ₯Ό λ°κΈν΄μ£Όλλ°, μ΄ ν€νΈλ₯Ό HTML νμΌμμ <head> μμμ λ£μ΄μ£ΌκΈ°λ§ νλ©΄ CDNμΌλ‘ Font Awesomeμ μ¬μ©ν μ€λΉκ° μλ£λλ€.

Font Awesome μ¬μ΄νΈμμ μ¬μ©νκ³ μΆμ μμ΄μ½μ μ°Ύμμ μ¬μ©ν νκ²½(HTML, React, Vue)μ λ§λ μ½λλ₯Ό 볡μ¬νκ³ λΆμ¬λ£κΈ°λ§ νλ©΄ μ¬μ©ν μ μλ€.

(2) Font Awesome λͺ¨λ μ€μΉνκΈ°
Font Awesomeμ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬μ²λΌ μ€μΉν΄μ μ¬μ©νλ λ°©λ²λ μλ€. React νκ²½μμ μ¬μ©ν κ²½μ°μλ λ€μκ³Ό κ°μ ν¨ν€μ§λ€μ μ€μΉνλ©΄ λλ€.
// ν΅μ¬ ν¨ν€μ§ μ€μΉ
npm i --save @fortawesome/fontawesome-svg-core
// μμ΄μ½ ν¨ν€μ§ μ€μΉ (ν΄λΉ μ½λλ λ¬΄λ£ μμ΄μ½λ€μ
λλ€. μ λ£ μμ΄μ½μ μ¬μ©ν κ²½μ° μΆκ°λ‘ μ€μΉκ° νμ)
npm i --save @fortawesome/free-solid-svg-icons
npm i --save @fortawesome/free-regular-svg-icons
npm i --save @fortawesome/free-brands-svg-icons
// Font Awesome React κ΅¬μ± μμ μ€μΉ
npm i --save @fortawesome/react-fontawesome@latest
μ€μΉ νμλ Font Awesome μ¬μ΄νΈμμ μ¬μ©νκ³ μΆμ μμ΄μ½μ μ 보λ₯Ό νμΈν νμ, μλ§κ² λΆλ¬μμ μ¬μ©νλ©΄ λλ€. μ΄λ μμ΄μ½ μ΄λ¦μ camelCaseλ‘ μμ±ν΄μΌ νλ€.

μ΄λ κ² λΆλ¬μ¨ μμ΄μ½μ ν΄λμ€λͺ μ μ§μ λΆμ΄κ±°λ Font Awesomeμ΄ μ ν΄μ€ λ°©λ²μ μ¬μ©νμ¬ μ€νμΌλ§ν΄μ€ μ μλ€.
3. WebP λλ AVIF μ΄λ―Έμ§ ν¬λ§· μ¬μ©νκΈ°
μ΄λ―Έμ§ μ΅μ νλ₯Ό μν΄ μ ν΅μ μΌλ‘ μ¬μ©νλ JPEG λλ PNG νμμ΄ μλ μλ‘κ² λ±μ₯ν μ΄λ―Έμ§ ν¬λ§·μΈ WebP λλ AVIFλ₯Ό μ¬μ©νμ¬ μ©λμ λμ± κ°μμν¬ μ μλ€. WebPλ PNGμ λΉκ΅ν΄ 26% μ©λμ΄ κ°μλλ©° JPEGμ λΉκ΅νμ λ 25-35% λ κ°μλλ€. AVIFλ JPEGμ λΉκ΅νμ λ λ¬΄λ € μ©λμ 50%κ° κ°μλλ©° WebPμ λΉκ΅νμ λ 20% κ°μλλ€.
νμ§λ§ WebPμ AVIF λͺ¨λ λΉκ΅μ μ΅κ·Όμ λ±μ₯ν μ΄λ―Έμ§ ν¬λ§·μ΄κΈ° λλ¬Έμ JPEG ν¬λ§·μ²λΌ λͺ¨λ λΈλΌμ°μ μμ νΈνλμ§ μλλ€λ λ¨μ μ΄ μλ€. WebPμ κ²½μ° λΉκ΅μ μ΅κ·Όμ λΈλΌμ°μ μ§μμ΄ λμμΌλ―λ‘ κ΅¬λ²μ μ λΈλΌμ°μ μμλ μ§μμ΄ μλ μ μμΌλ©° Safari λΈλΌμ°μ μμλ μ§μνμ§ μλλ€. AVIFμ κ²½μ°μλ Chrome, Opera λ± μμμ λΈλΌμ°μ λ§ μ§μνκ³ μλ€. (μ°Έκ³ - Can I use WebP?, Can I use AVIF?)
κ·ΈλΌ κ°λ°μκ° κ° λΈλΌμ°μ μ μ΄λ―Έμ§ νΈνμ±μ νμ ν΄μ μ΄λ―Έμ§ νμΌμ λΆκΈ°ν΄μΌ ν κΉ? λ€ννλ HTMLμ <picture> νκ·Έλ₯Ό μ΄μ©νλ©΄ κ° λΈλΌμ°μ μ νΈνμ λ§λλ‘ λΆκΈ°λ₯Ό λ체ν μ μλ€.
<picture> : img μμμ λ€μ€ μ΄λ―Έμ§ 리μμ€(multiple image resources)λ₯Ό μν 컨ν μ΄λλ₯Ό μ μν λ μ¬μ©νλ€.
λ€μκ³Ό κ°μ΄ HTML νκ·Έλ₯Ό μμ±ν μ, λ§μ½ μ μν λΈλΌμ°μ μμ <source> νκ·Έ λ΄μ srcsetμ μ μν WebP ν¬λ§·μ μ§μνμ§ μλλ€λ©΄ ν΄λΉ <source> νκ·Έλ 무μλλ€. μ΄μ κ°μ μμ±μ μ΄μ©νμ¬ κ° λΈλΌμ°μ μ λ°λΌ μ΄λ―Έμ§ ν¬λ§·μ μ΅μ νν μ μλ€.
<picture>
<source srcset="logo.webp" type="image/webp">
<img src="logo.png" alt="logo">
</picture>
πCDN μ¬μ©νκΈ°

CDNμ μ½ν μΈ λ₯Ό μ’ λ λΉ λ₯΄κ³ ν¨μ¨μ μΌλ‘ μ 곡νκΈ° μν΄ μ€κ³λμλ€. λ€νΈμν¬ μ§μ°(latency)μ μ μ μ νΈμ€ν μλ²κ°μ 물리μ 거리μ νκ³κ° μ‘΄μ¬νκΈ° λλ¬Έμ λ°μν μ λ°μ μλ€. μ μ μ μλ²μ κ±°λ¦¬κ° λ©λ€λ©΄ μ§μ°(latency) λν λμ΄λλ€. CDNμ μ΄λ₯Ό ν΄κ²°νκ³ μ μΈκ³ κ³³κ³³μ λΆν¬ν λΆμ°λ μλ²μ μ½ν μΈ λ₯Ό μ μ₯νλ€.
κ°λ¨ν λ§ν΄, CDNμ μ μ κ° κ°κΉμ΄ κ³³μ μμΉν λ°μ΄ν° μΌν°(μλ²)μ λ°μ΄ν°λ₯Ό κ°μ Έμ¨λ€. κ·Έλ¬λ―λ‘ λ°μ΄ν°κ° μ λ¬λκΈ° μν΄ κ±°μ³μΌνλ μλ²μ κ°―μκ° ν¬κ² μ€κΈ° λλ¬Έμ λ‘λ© μλκ° λΉ¨λΌμ§λ€.