๐Ÿง  18. ์›น ์บ์‹ฑ ์ „๋žต ์™„์ „ ์ •๋ฆฌ โ€” Cache-Control๋ถ€ํ„ฐ ETag, Service Worker๊นŒ์ง€

JM_Devยท2025๋…„ 4์›” 30์ผ
1
post-thumbnail

์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ณ , ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๋ฉฐ, ๋กœ๋”ฉ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ์บ์‹ฑ(Caching)์ด๋‹ค.
ํ•˜์ง€๋งŒ ์บ์‹œ๋Š” ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค, ์„ค์ •๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ณ ,
"์™œ ์ด๊ฒŒ ๊ฐฑ์‹  ์•ˆ ๋์ง€?", "์™œ API๊ฐ€ ์˜ˆ์ „ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค์ง€?" ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์ข…์ข… ๋งˆ์ฃผํ•˜๊ฒŒ ๋œ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ผญ ์•Œ์•„์•ผ ํ•  ์บ์‹ฑ ์ „๋žต๋“ค์„ ์ •๋ฆฌํ•ด๋ดค๋‹ค.


โœ… 1. ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ์˜ ๊ธฐ๋ณธ: Cache-Control

HTTP ์‘๋‹ต ํ—ค๋”์—์„œ ์บ์‹ฑ ๋™์ž‘์„ ์ง€์ •ํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•

Cache-Control: public, max-age=3600

์ฃผ์š” ์˜ต์…˜ ์ •๋ฆฌ

์˜ต์…˜์„ค๋ช…
public๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ์บ์‹œ ํ—ˆ์šฉ (CDN ํฌํ•จ)
private์‚ฌ์šฉ์ž ๊ฐœ๋ณ„ ๋ธŒ๋ผ์šฐ์ €์—๋งŒ ์บ์‹œ ํ—ˆ์šฉ
no-cache์บ์‹ฑ์€ ๋˜์ง€๋งŒ ๋งค๋ฒˆ ์„œ๋ฒ„์— ํ™•์ธ
no-store์•„์˜ˆ ์บ์‹œํ•˜์ง€ ์•Š์Œ (๋ณด์•ˆ ์ •๋ณด์— ์‚ฌ์šฉ)
max-age=์ดˆ๋‹จ์œ„์ง€์ • ์‹œ๊ฐ„ ๋™์•ˆ ์บ์‹œ ์œ ์ง€ (์ดˆ ๋‹จ์œ„)
s-maxage๊ณต์œ  ์บ์‹œ์—๋งŒ ์ ์šฉ (์˜ˆ: CDN)

์‹ค์ „ ์˜ˆ์‹œ

Cache-Control: public, max-age=86400
  • ํ•˜๋ฃจ(86400์ดˆ) ๋™์•ˆ ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์— ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ์บ์‹œ๋œ ์ž์›์„ ์‚ฌ์šฉ
Cache-Control: no-cache
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ๋งค๋ฒˆ ์„œ๋ฒ„์— ํ™•์ธ (Etag, Last-Modified์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ)

โœ… 2. ๋ณ€๊ฒฝ ๊ฐ์ง€ ๊ธฐ๋ฐ˜ ์บ์‹œ: ETag, Last-Modified

๐Ÿท๏ธ ETag (Entity Tag)

๋ฆฌ์†Œ์Šค์˜ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž(ํ•ด์‹œ)๋ฅผ ์„ค์ • โ†’ ์š”์ฒญ ์‹œ ์„œ๋ฒ„๊ฐ€ ๋น„๊ต

ETag: "abc123"

ํด๋ผ์ด์–ธํŠธ โ†’ ์„œ๋ฒ„ ์š”์ฒญ ์‹œ:

If-None-Match: "abc123"
  • ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค์™€ ๋™์ผํ•˜๋ฉด โ†’ 304 Not Modified ์‘๋‹ต (์บ์‹œ ์‚ฌ์šฉ)
  • ๋‹ค๋ฅด๋ฉด โ†’ 200 OK + ์ƒˆ ๋ฆฌ์†Œ์Šค ์‘๋‹ต

๐Ÿท๏ธ Last-Modified

Last-Modified: Wed, 24 Apr 2024 10:00:00 GMT

ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ:

If-Modified-Since: Wed, 24 Apr 2024 10:00:00 GMT
  • ๋ณ€๊ฒฝ์ด ์—†์œผ๋ฉด 304 ๋ฐ˜ํ™˜
  • ๋ณ€๊ฒฝ์ด ์žˆ์œผ๋ฉด 200 + ์ƒˆ ๋ฆฌ์†Œ์Šค

๐Ÿ“Œ ETag๊ฐ€ ๋” ์ •ํ™•ํ•œ ๋น„๊ต ๋ฐฉ์‹
(๋‹จ, ์„œ๋ฒ„ CPU ์—ฐ์‚ฐ์„ ๋” ๋งŽ์ด ์“ฐ๋ฏ€๋กœ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์„ ํƒ)


โœ… 3. Service Worker๋ฅผ ํ™œ์šฉํ•œ ์บ์‹œ ์ „๋žต

์˜คํ”„๋ผ์ธ์—์„œ๋„ ์ž‘๋™ํ•˜๋Š” ์•ฑ์„ ์œ„ํ•œ ํ•ต์‹ฌ ๊ธฐ์ˆ  (PWA)

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request).then((cachedResponse) => {
      if (cachedResponse) {
        return cachedResponse;
      }
      return fetch(event.request);
    })
  );
});

์‚ฌ์šฉ ์ „๋žต ์˜ˆ์‹œ

์ „๋žต์„ค๋ช…
Cache First์บ์‹œ๋œ ์‘๋‹ต ์šฐ์„ , ์—†์œผ๋ฉด ๋„คํŠธ์›Œํฌ
Network First๋„คํŠธ์›Œํฌ ์šฐ์„ , ์‹คํŒจ ์‹œ ์บ์‹œ
Stale-While-Revalidate์บ์‹œ ์‘๋‹ต ํ›„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๊ฐฑ์‹ 
Cache Onlyํ•ญ์ƒ ์บ์‹œ๋งŒ ์‚ฌ์šฉ
Network Onlyํ•ญ์ƒ ๋„คํŠธ์›Œํฌ๋งŒ ์‚ฌ์šฉ

โœ… ์‹ค์ „์—์„œ ํ”ํ•œ ๋ฌธ์ œ & ํ•ด๊ฒฐ ์ „๋žต

๐Ÿ”„ ๋ณ€๊ฒฝ๋œ JS/CSS๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Œ

  • ์›์ธ: Cache-Control: max-age๊ฐ€ ๋„ˆ๋ฌด ๊น€
  • ํ•ด๊ฒฐ: ๋นŒ๋“œ ์‹œ ํ•ด์‹œ(main.abc123.js)๋ฅผ ํŒŒ์ผ๋ช…์— ํฌํ•จ

๐Ÿ” API ์‘๋‹ต์ด ์ตœ์‹ ์ด ์•„๋‹˜

  • ์›์ธ: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด์ „ ์‘๋‹ต์„ ์บ์‹ฑํ•จ
  • ํ•ด๊ฒฐ: Cache-Control: no-cache, ๋˜๋Š” ETag ๋น„๊ต

๐Ÿ”Œ ์ด๋ฏธ์ง€๊ฐ€ ์˜ค๋ž˜๋œ ๋ฒ„์ „์œผ๋กœ ๋ณด์ž„

  • ํ•ด๊ฒฐ: ?v=1.2.3 ๋“ฑ์˜ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ์ถ”๊ฐ€๋กœ ์บ์‹œ ๋ฌดํšจํ™”

โœ… ์ •๋ฆฌ ์š”์•ฝ

๊ธฐ์ˆ ์บ์‹œ ๋ฐฉ์‹๊ฐฑ์‹  ๋ฐฉ์‹
Cache-Control์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ (max-age)์ผ์ • ์‹œ๊ฐ„ ํ›„ ์ƒˆ ์š”์ฒญ
ETag / Last-Modified๋ฆฌ์†Œ์Šค ๋น„๊ต ๊ธฐ๋ฐ˜๋ณ€๊ฒฝ ์—ฌ๋ถ€์— ๋”ฐ๋ผ 304 or 200
Service Worker์ง์ ‘ ์ฝ”๋“œ๋กœ ์ œ์–ดfetch ์š”์ฒญ ์ธํ„ฐ์…‰ํŠธ ๊ฐ€๋Šฅ

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

SWR, React Query, CDN ์ตœ์ ํ™” ๋“ฑ์„ ํ•  ๋•Œ ์บ์‹œ ์ „๋žต์„ ๋ชจ๋ฅด๋ฉด ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ๊ฑธ ์ฒด๊ฐํ–ˆ๋‹ค.
ํŠนํžˆ HTTP ์บ์‹œ๊ฐ€ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ๋•Œ ๋””๋ฒ„๊น…์ด ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—
๊ธฐ๋ณธ์ ์ธ ์บ์‹œ ์ „๋žต์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋ฉด ์‹ค๋ฌด์—์„œ ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง€๊ธˆ์€ ๋ฐฐํฌ ์‹œ JS/CSS์— hash๋ฅผ ๋ถ™์ด๊ณ ,
API๋Š” ETag + Cache-Control: no-cache ์กฐํ•ฉ์œผ๋กœ
์ •ํ™•ํ•œ ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋งŒ ํŒ๋‹จํ•˜๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์žˆ๋‹ค.


๐Ÿงฉ โ€œ์บ์‹œ๋Š” ์†๋„์˜ ๋ฌธ์ œ์ด์ž ์ •ํ™•์„ฑ์˜ ๋ฌธ์ œ๋‹ค.
๊ทธ ๋‘˜์„ ๋™์‹œ์— ๋งŒ์กฑ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ง„์งœ ์ตœ์ ํ™”๋‹ค.โ€

profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€