πŸ’» Development/기둝

[μ΅œμ ν™”] Optimization 기법

ahyeon7 2023. 3. 9. 17:36

πŸ“Œ 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은 μœ μ €κ°€ κ°€κΉŒμš΄ 곳에 μœ„μΉ˜ν•œ 데이터 μ„Όν„°(μ„œλ²„)의 데이터λ₯Ό κ°€μ Έμ˜¨λ‹€. κ·ΈλŸ¬λ―€λ‘œ 데이터가 μ „λ‹¬λ˜κΈ° μœ„ν•΄ κ±°μ³μ•Όν•˜λŠ” μ„œλ²„μ˜ κ°―μˆ˜κ°€ 크게 쀄기 λ•Œλ¬Έμ— λ‘œλ”© 속도가 빨라진닀.