๐Ÿ’พ 20์žฅ ํด๋ผ์ด์–ธํŠธ ์Šคํ† ๋ฆฌ์ง€

๐Ÿ“– ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

๐Ÿ’พ 20์žฅ ํด๋ผ์ด์–ธํŠธ ์Šคํ† ๋ฆฌ์ง€

๐ŸŒ ์›น ์Šคํ† ๋ฆฌ์ง€

๋ฌธ์ž์—ด ํ‚ค์™€ ๊ฐ’์„ ๋Œ€์‘์‹œํ‚จ ์—ฐ๊ด€ ๋ฐฐ์—ด์ธ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์™€ ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ๋„ˆ๋ฌด ํฌ์ง€์•Š์€ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ์— ์ ํ•ฉํ•˜๋‹ค.

๐Ÿช ์ฟ ํ‚ค

์„œ๋ฒ„์ธก์—์„œ ์Šคํฌ๋ฆฝํŒ… ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋œ ์˜ค๋ž˜๋œ ํด๋ผ์ด์–ธํŠธ ์Šคํ† ๋ฆฌ์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ์ ์€์–‘์˜ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅด ์ €์žฅํ•  ๊ฒฝ์šฐ์—๋งŒ ์ ์ ˆํ•˜๋‹ค. ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ HTTP ์š”์ฒญ ์‹œ ํ•ญ์ƒ ์„œ๋ฒ„๋กœ ์ „์†ก๋œ๋‹ค.

###๐ŸŒ IE User Data

IE 5 ์ดํ›„ ๋ฒ„์ „๋ถ€ํ„ฐ ๊ตฌํ˜„๋œ ์ „์šฉ ํด๋ผ์ด์–ธํŠธ ์Šคํ† ๋ฆฌ์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜

###๐Ÿ“ด ์˜คํ”„๋ผ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

HTML5์—์„œ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š”๊ฒƒ ์ŠคํŠธ๋กœ์ง€์˜ ๊ฐœ๋…๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ ๊ทธ ์ž์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๐Ÿ’ป ์›น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

์‚ฌํŒŒ๋ฆฌ, ํฌ๋กฌ, ์˜คํŽ˜๋ผ์—์„œ SQL๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์œ„ํ•œ ํด๋ผ๋ฆฌ์–ธํŠธ API (ํ‘œ์ค€ํ™”๋Š” ์‹คํŒจํ–ˆ๋‹ค.)

๐Ÿ“ ํŒŒ์ผ์‹œ์Šคํ…œ API

XMLHttpRequest๋ฅผ ํ†ตํ•ด ์„ ํƒํ•  ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” File๊ฐ์ฒด๋ฅผ ์ง€์›ํ•˜๊ฒŒ๋˜์–ด ๋งŒ๋“ ๊ฒƒ.

๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์™€ ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€

๋‘ ๊ฐ์ฒด ๋ชจ๋‘ Window๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ •์˜๋˜์–ด์žˆ๋‹ค. ๋‘ ๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ๋ณด๊ด€ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์ ‘๊ทผ ๊ฐ€๋Šฅ ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋Š” ๋ฒ”์œ„์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

localStorage.x = 10;
var x = parseInt(localStorage.x); // ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ๋Š” ํ˜•๋ณ€ํ™˜ํ›„ ํ•ด์„ํ•ด์•ผํ•œ๋‹ค.

localStorage.lastRead = (new Date()).toUTCString();

localStorage.data = JSON.stringify(data); //์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ €์žฅํ›„
var data = JSON.parse(localStorage.data); //๋””์ฝ”๋”ฉํ•ด์„œ ๊ฐ€์ ธ์˜จ๋‹ค.

์Šคํ† ๋ฆฌ์ง€ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ฒ”์œ„

๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์˜ ๋ฐ์ดํ„ฐ๋Š” ๋งŒ๋ฃŒ ๊ธฐํ•œ์ด ์—†๊ณ  ๋ฒ”์œ„๋Š” ๋ฌธ์„œ์˜ ์ถœ์ฒ˜(URL)์— ํ•œ์ •๋œ๋‹ค. ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€์˜ ๋ฐ์ดํ„ฐ๋Š” ์ตœ์ƒ์œ„ ์ฐฝ์ด๋‚˜ ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ํƒญ๊ณผ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๊ฐ™๋‹ค. ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€์˜ ๋ฒ”์œ„๋Š” ๊ฐœ๋ณ„ ์ฐฝ์— ๊ธฐ๋ฐ˜์„ ๋‘” ๋ฒ”์œ„๋ฅผ ๊ฐ–๋Š”๋‹ค.

์Šคํ† ๋ฆฌ์ง€ API

method description
getItem() ๊ฐ’ ์ €์žฅ
setItem() ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
removeItem() ๊ฐ’ ์‚ญ์ œ
clear() ์ €์žฅ๋œ ๋ชจ๋“ ๊ฐ’ ์ œ๊ฑฐ

โœ”๏ธ length๋Š” ํ”„๋กœํผํ‹ฐ๋กœ ์กด์žฌํ•œ๋‹ค.

โšก ์Šคํ† ๋ฆฌ์ง€ ์ด๋ฒคํŠธ

์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ Window๊ฐ์ฒด์— ์Šคํ† ๋ฆฌ์ง€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

  • key : ์„ค์ •๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ์˜ ์ด๋ฆ„ ๋˜๋Š” ํ‚ค์ด๋‹ค.
  • newValue : ํŠน์ • ์Šคํ† ๋ฆฌ์ง€ ๋ฐ์ดํ„ฐ์˜ ์ƒˆ๋กœ์šด ๊ฐ’ ๋˜๋Š” remoteIte()์ด ํ˜ธ์ถœ๋ฌ์„๋•Œ null์„ ์ €์žฅํ•œ๋‹ค.
  • oldValue : ๋ณ€๊ฒฝ๋˜์—ˆ๊ฑฐ๋‚˜ ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๋ณธ๋ž˜ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
  • url : ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์„œ์˜ URL

๐Ÿช ์ฟ ํ‚ค

์ฟ ํ‚ค ๋ฐ์ดํ„ฐ๋Š” ์›น๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ์ž๋™์œผ๋กœ ์ „์†ก๋˜๋ฏ€๋กœ, ์„œ๋ฒ„ ์ธก ์Šคํฌ๋ฆฝํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ €์žฅํ•œ ์ฟ ํ‚ค์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

โ— ์ฟ ํ‚ค๋Š” ์–ด๋–ค ์ข…๋ฅ˜์˜ ์•”ํ˜ธํ™” ๊ธฐ๋ฒ•๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ณด ์ „๋‹ฌ์‹œ ๋ณดํ˜ธ๋ฐ›์ง€ ๋ชปํ•œ๋‹ค.

  • ์ฟ ํ‚ค๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ Document๊ฐ์ฒด์˜ cookie ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ์กฐ์ž‘ํ•œ๋‹ค.

  • ๊ฐ ์ฟ ํ‚ค๋ณ„๋กœ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ฒ”์œ„๋Š” ๊ฐœ๋ณ„ ์ง€์ • ํ•  ์ˆ˜ ์žˆ๋‹ค. max-age ( ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์ผ์‹œ์ ์ด๋‹ค. )

  • ๋„๋ฉ”์ธ์˜ depth๋ฅผ ์ง€์ •( ๊ฒฝ๋กœ๋ฅผ ์ง€์ • ) ํ•จ์œผ๋กœ์จ ์ฟ ํ‚ค๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฟ ํ‚ค ์ €์žฅํ•˜๊ธฐ

์ผ์‹œ์ ์ธ ์ฟ ํ‚ค๋ฅผ ๋งŒ๋“œ๋ ค๋ฉด cookieํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฌธ์ž์—ด ํ˜•์‹์œผ๋กœ ์„ค์ •ํ•˜์ž.

document.cookie = "version=" + encodeURIComponent(document.lastModified);
  • name
  • max-age
  • path
  • domain
  • secure

์ฟ ํ‚ค๊ฐ’ ์ฝ๊ธฐ

๋ณดํ†ต ๊ฐœ๋ณ„ ์ด๋ฆ„=๊ฐ’ ์Œ์„ ๋ถ„๋ฆฌํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋„๋ก split() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊ฒƒ์ด๋‹ค. ๊ฐ’์„ ์ถ”์ถœํ•œ ํ›„ ํ•ด๋‹น ๊ฐ’์„ ํ•ด์„ํ•˜๊ธฐ ์œ„ํ•ด decodeURIComponent()์— ์ „๋‹ฌํ›„ JSON.parse()๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํ† ๋ฆฌ์ง€์™€ ์˜คํ”„๋ผ์ธ ์›น์•ฑ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์บ์‹œ ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€๋กœ HTML๊ณผ CSS JS IMG ๋“ฑ์˜ ํŒŒ์ผ ์ž์ฒด๋ฅผ ์ €์žฅํ•˜๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ค์น˜๋˜๋ฉด ์ž์ฒด์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ง€์šฐ๊ธฐ ์ „๊นŒ์ง€ ๋‚จ์•„์žˆ๊ฒŒ ๋œ๋‹ค.

์˜คํ”„๋ผ์ธ ์›น์•ฑ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์บ์‹œ์— ์„ค์น˜๋œ ๊ฒƒ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ ๋‹ค์Œ, ์˜จ๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜์—ฌ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์บ์‹œ MANIFEST

์š”์ฒญํ•  URL๋“ค์˜ ๋ชฉ๋ก์„ ๋‹ด๊ณ  ์žˆ๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ํ›„ ํƒœ๊ทธ์— manifest์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ HTMLํŽ˜์ด์ง€์™€ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

  • MANIFEST์˜ ๊ตฌ์„ฑ
CACHE MANIFEST

myapp.HTML
myapp.js
myapp.css
images/background.png
// resource๋“ค

์บ์‹œ ์—…๋ฐ์ดํŠธ

์บ์‹œ๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ชจ๋“  ํŒŒ์ผ์„ ์บ์‹œ์—์„œ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์ผ๋–„๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•  ๊ฒƒ์ด๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” ์บ์‹œ ์ˆ˜์ • ๊ณผ์ •์—์„œ ๋‹ค์ˆ˜์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

applicationCache.onupdateready = function(){
		var reload = confirm("์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒˆ๋กœ๊ณ ์นจ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ƒˆ๋กœ๊ณ ์นจ ํ•˜๊ฒ ์Šต๋‹ˆ๊นŒ?");
		if (reload)
			location.reload();
}
  • ์—…๋ฐ์ดํŠธํ• ๊ฒƒ์ด ์—†๋Š” ์ƒํƒœ

    • noupdate
  • ์—…๋ฐ์ดํŠธํ• ๊ฒƒ์ด ์žˆ๋Š” ๊ฒฝ์šฐ

    • downloading ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ ๋ชจ๋“  ํŒŒ์ผ๋“ค์„ ์บ์‹œ
  • ์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฒ˜์Œ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ

    • downloading๊ณผ progress ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋˜๋ฉฐ ๋‹ค์šด๋กœ๋“œ ์™„๋ฃŒ์‹œ updateready๊ฐ€ ์•„๋‹Œ cached์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์ธ ๊ฒฝ์šฐ

    • ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ error
  • ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

    • obsolete ๋ฐœ์ƒ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์บ์‹œ์—์„œ ์‚ญ์ œ

์บ์‹œ ์ƒํƒœ

  • UNCACHED
    • manifest์†์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ.
  • IDLE
    • ์ตœ์‹ ๋ฒ„์ „์œผ๋กœ ์บ์‹œ๋œ ์ƒํƒœ
  • CHECKING
    • ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์„ ํ™•์ธ์ค‘์ธ ์ƒํƒœ
  • DOWNLOADING
    • ํŒŒ์ผ๋“ค์„ ๋‹ค์šด๋กœ๋“œํ•œ ๋‹ค์Œ ์บ์‹œ์— ์ ์šฉํ•˜๋Š” ์ค‘์ธ ์ƒํƒœ
  • UPDATEREADY
    • ์ƒˆ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์บ์‹œํ•œ ์ƒํƒœ
  • OBSOLETE
    • ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ์—†์–ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์บ์‹œ๋Š” ์‚ญ์ œ๋  ์˜ˆ์ •์ธ ์ƒํƒœ

์บ์‹œ ๋ฉ”์„œ๋“œ

  • update()

    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒˆ ๋ฒ„์ „์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์บ์‹œ ์—…๋ฐ์ดํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค.
  • swapCache()

    • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด์ „ ๋ฒ„์ „์˜ ์บ์‹œ๋ฅผ ํ๊ธฐํ•˜๊ณ  ์•ž์œผ๋กœ์˜ ์š”์ฒญ๋“ค์ด ์ƒˆ ์บ์‹œ๋ฅผ ๊ฐ€์ ธ์˜ฌ๊ฒŒ ํ•ด์ค€๋‹ค.

โœ”๏ธ ์ƒํƒœ๊ฐ’์ด UPDATEREADY ์ด๊ฑฐ๋‚˜ OBSOLETE ์ผ๋•Œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.