πŸ’»
Albert's Til
GitHub
  • 맀일맀일 μ‘°κΈˆμ”© μ„±μž₯ν•˜κΈ°
    • README
    • CS
      • Network
      • HTTP
        • NO-CACHE
      • 였λ₯˜ μ½”λ“œ
      • ORM 도ꡬ
      • Design Pattern
        • CQRS Pattern
          • Event Sourcing and CQRS pattern
        • Builder Pattern
    • DB
      • MySQL
        • Timeline
        • Pagination
        • Index
        • Database Performance Optimization Strategies
        • B+ tree
        • MySQL Connectors VS MySQL Shell(Scripting) VS MySQL Workbench
        • MySQL Storage Engine Architecture
      • Normalization & Denormalization
      • JPA
        • @Transactional
        • Why JPA?
        • About JPA
        • N+1 Issue
        • Index
        • ElementCollection&CollectionTable
        • orphanRemoval
        • CascadeType
        • Use Subselect
        • Dynamic Instance Creation
        • Paging
        • Order
        • Spefication
        • mappedBy
      • MongoDB
        • ObjectId
      • Why MySQL?
      • ACID properties of transactions
      • Between JPA and JDBC
      • Identifiers in Hibernate/JPA
    • Java
      • Jackson de/serialize
      • Collections.singletonList() vs List.of()
      • Manage dependencies in Gradle
      • Logging Level
      • Bean Validation
      • JVM Internals
        • Threads
          • Frame
        • Shared Between Threads
          • Classloader
            • Class Loader Hierarchy
            • Loading Linking Initialization
      • Java Collection Framework
      • Annotation
      • Generic
      • λ””λ―Έν„° 법칙
    • Spring
      • Caching
      • Spring Integration Overview
        • ThreadPollTaskExecutor
        • Messaging Bridge
        • Channel Adapter
        • Poller
        • Configuration and @EnableIntegration
        • Message Endpoints
        • Message Channels
      • HATEOAS
      • @Autowired vs Constructor Dependency Injection
      • Spring Security
        • JWT 토큰 μ‚¬μš©ν•œ 인가
        • OAuth 2 Login
        • OAuth 2 인증
        • 인가
        • 인증
        • PasswordEncoder
      • IoC Container
      • Filter,Interceptor,AOP,Argument Resolver
      • Spring Annotation
      • About Spring
    • Kafka
      • Error Channel
    • Infra
      • Scale Up || Scale Out
      • Docker
        • Dockerfile
        • Docker Hub Deploy
        • Command
      • Cloud μœ ν˜•
        • Infrastructure as a Service
        • Platform as a Service
        • Software as a Service
      • 무쀑단 배포
        • μ—”μ§„μ—‘μŠ€(Nginx)
      • μ½”λ“œ μžλ™ 배포
        • Technical
      • AWS EC2
        • PEM(Privacy Enhanced Mail) ν‚€
      • AWS RDS
      • AWS S3
    • CodeSquad
      • Spring Boot Project 1μ£Όμ°¨ 회고
      • Spring Boot Project 2μ£Όμ°¨ 회고
      • Spirng Boot Project 3μ£Όμ°¨ 회고
      • Spring Boot Project 4μ£Όμ°¨ 회고
    • Foody Moody ν”„λ‘œμ νŠΈ
      • Query Performance Comparison
      • HeartCount Asynchronous Issue
      • DeferredResult
      • ResponseBodyEmitter
      • SseEmitter (Spring)
      • Server-Sent Events (SSE)
      • 기술 μŠ€νƒ 적용 이유
      • NO-CACHE(HTTP)
      • Transactional
    • DDD
      • AggregateId
    • Test
      • RestAssured
    • Coding and Algorithmic Problems
      • 819. Most Common Word
      • 344. Reverse String
      • 125. Valid Palindrome
      • 937. Reorder Data in Log Files
    • Node
      • Async... Await...
      • Custom Transactional Decorator Challenger
    • Python
      • Python Basic Grammar
        • Comments and Input/Output
        • Variable
        • Data type
        • Operations and syntax
        • List,Tuple,Dictionary,Set
        • Function
        • Conditional statement
        • Loop
    • HTML
      • HTML Basic
      • HTML Basic Tags
      • HTML Form Tags
      • HTML Table Tags
    • CSS
      • CSS Basic
      • CSS Practice
Powered by GitBook
On this page
  • Cache-Control μ§€μ‹œμ–΄
  • NO-CACHE ❗❗
  • 처리 μˆœμ„œ(μ˜ˆμ‹œ)
  • **ETag**λ‚˜ Last-Modified 헀더λ₯Ό ν¬ν•¨ν•˜μ—¬ λ¦¬μ†ŒμŠ€μ˜ λ§ˆμ§€λ§‰ μƒνƒœλ₯Ό μ„œλ²„μ— μ–΄λ–»κ²Œ 전달 ν• κΉŒ ❓
  • HTTP(μ˜ˆμ‹œ)
  • μž₯단점 ❓
  • μž₯점:
  • 단점:
  • 그럼 μ–Έμ œ μ‚¬μš©ν•΄μ•Ό ν•˜λ‚˜μš” ❓
  • ETag
  • Last-Modified
  • Cache-Control: no-cache
  • React (ν”„λ‘ νŠΈμ—”λ“œ)와 Java Spring (λ°±μ—”λ“œ)이면 μ–΄λ–»κ²Œ κ΅¬ν˜„ν•΄μ•Ό ν• κΉŒβ“
  • 1. 첫 번째 μš”μ²­ (React ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ Java Spring μ„œλ²„λ‘œ):
  • 2. 첫 번째 응닡 (Java Spring μ„œλ²„μ—μ„œ React ν΄λΌμ΄μ–ΈνŠΈλ‘œ):
  • 3. μž¬μš”μ²­ (React ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ Java Spring μ„œλ²„λ‘œ):
  • 4. 두 번째 응닡 (Java Spring μ„œλ²„μ—μ„œ React ν΄λΌμ΄μ–ΈνŠΈλ‘œ):
  • μ—¬κΈ° κΉŒμ§€ λ‚˜μ˜ ꢁ금증 ν•΄κ²°λμ–΄μš”. λ‹€μŒμ— ν•œλ²ˆ μ μš©ν•˜κ³  μ‚¬μš©ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 😊

Was this helpful?

  1. 맀일맀일 μ‘°κΈˆμ”© μ„±μž₯ν•˜κΈ°
  2. Foody Moody ν”„λ‘œμ νŠΈ

NO-CACHE(HTTP)

Cache-Control μ§€μ‹œμ–΄

  • max-age=<seconds>:

    • λ¦¬μ†ŒμŠ€κ°€ μΊμ‹œλ  수 μžˆλŠ” μ΅œλŒ€ μ‹œκ°„μ„ 초 λ‹¨μœ„λ‘œ μ§€μ •ν•©λ‹ˆλ‹€.

  • no-cache:

    • 맀번 원본 μ„œλ²„λ‘œλΆ€ν„° λ¦¬μ†ŒμŠ€μ˜ μœ νš¨μ„±μ„ 검증해야 ν•©λ‹ˆλ‹€.

  • no-store:

    • λ¦¬μ†ŒμŠ€λ₯Ό μΊμ‹œμ— μ €μž₯ν•˜λ©΄ μ•ˆ λ©λ‹ˆλ‹€.

  • private:

    • 응닡은 νŠΉμ • μ‚¬μš©μžλ₯Ό μœ„ν•œ κ²ƒμ΄λ―€λ‘œ 쀑간 μΊμ‹œμ— μ €μž₯ν•˜λ©΄ μ•ˆ λ©λ‹ˆλ‹€.

  • public:

    • 응닡은 μ–΄λ– ν•œ μΊμ‹œμ—μ„œλ„ μ €μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€.

  • must-revalidate:

    • μΊμ‹œμ˜ λ¦¬μ†ŒμŠ€κ°€ 만료된 ν›„μ—λŠ” 원본 μ„œλ²„λ‘œλΆ€ν„° μœ νš¨μ„± 검증을 λ°›μ§€ μ•Šκ³ λŠ” μ‚¬μš©λ˜μ–΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.

NO-CACHE ❗❗

  • no-cacheλŠ” λ¦¬μ†ŒμŠ€λ₯Ό μΊμ‹œν•˜μ§€ μ•ŠμœΌλΌλŠ” μ˜λ―Έκ°€ μ•„λ‹ˆλ‹€. ❗❗❗

  • λŒ€μ‹  이 μ§€μ‹œμ–΄λŠ” ν΄λΌμ΄μ–ΈνŠΈλ‚˜ 쀑간 μΊμ‹œ(예: ν”„λ‘μ‹œ μ„œλ²„)κ°€ μΊμ‹œλœ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜κΈ° 전에 항상 원본 μ„œλ²„μ—μ„œ λ¦¬μ†ŒμŠ€μ˜ μœ νš¨μ„±μ„ κ²€μ¦ν•œλ‹€. ❓ ❓ ❓

  • no-cache μ§€μ‹œμ–΄κ°€ μ„€μ •λ˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈλ‚˜ 쀑간 μΊμ‹œλŠ” 원본 μ„œλ²„μ— μš”μ²­μ„ 보내고 **ETag**λ‚˜ Last-Modified κ°’κ³Ό 같은 μœ νš¨μ„± 검사 헀더λ₯Ό μ‚¬μš©ν•˜μ—¬ ν˜„μž¬ μΊμ‹œλœ λ¦¬μ†ŒμŠ€κ°€ μ—¬μ „νžˆ μœ νš¨ν•œμ§€ ν™•μΈν•©λ‹ˆλ‹€. ❓ ❓ ❓

<aside> πŸ˜“ ν•œλ²ˆλ„ μ‚¬μš©ν•΄λ³Έμ  μ—†λŠ”λ°β“β“ μ–΄λ–»κ²Œ μ‚¬μš©ν•˜μ§€β“β“

</aside>

처리 μˆœμ„œ(μ˜ˆμ‹œ)

  1. ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­:

    • ν΄λΌμ΄μ–ΈνŠΈκ°€ νŠΉμ • λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€.

  2. μΊμ‹œ 확인:

    • ν΄λΌμ΄μ–ΈνŠΈμ˜ λΈŒλΌμš°μ €λ‚˜ 쀑간 μΊμ‹œ(ν”„λ‘μ‹œ μ„œλ²„ λ“±)λŠ” ν•΄λ‹Ή λ¦¬μ†ŒμŠ€κ°€ 이미 μΊμ‹œλ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

  3. μΊμ‹œλœ λ¦¬μ†ŒμŠ€μ˜ μœ νš¨μ„± 검사:

    • λ¦¬μ†ŒμŠ€κ°€ μΊμ‹œλ˜μ–΄ μžˆλ‹€λ©΄, ν΄λΌμ΄μ–ΈνŠΈλ‚˜ 쀑간 μΊμ‹œλŠ” 원본 μ„œλ²„μ—κ²Œ ν•΄λ‹Ή λ¦¬μ†ŒμŠ€μ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜λΌλŠ” μš”μ²­μ„ λ³΄λƒ…λ‹ˆλ‹€.

    • 이 μš”μ²­μ€ **ETag**λ‚˜ Last-Modified 헀더λ₯Ό ν¬ν•¨ν•˜μ—¬ λ¦¬μ†ŒμŠ€μ˜ λ§ˆμ§€λ§‰ μƒνƒœλ₯Ό μ„œλ²„μ— μ „λ‹¬ν•©λ‹ˆλ‹€.

  4. μ„œλ²„μ˜ 응닡:

    • 원본 μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° 받은 **ETag**λ‚˜ Last-Modified 값을 μžμ‹ μ΄ κ°€μ§„ μ΅œμ‹  λ¦¬μ†ŒμŠ€μ˜ κ°’κ³Ό λΉ„κ΅ν•©λ‹ˆλ‹€.

      • λ³€κ²½λ˜μ§€ μ•Šμ€ 경우: μ„œλ²„λŠ” 304 Not Modified 응닡을 μ „μ†‘ν•©λ‹ˆλ‹€. 이 경우, ν΄λΌμ΄μ–ΈνŠΈλ‚˜ 쀑간 μΊμ‹œλŠ” μžμ‹ μ΄ κ°€μ§„ μΊμ‹œλœ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

      • λ³€κ²½λœ 경우: μ„œλ²„λŠ” λ³€κ²½λœ λ¦¬μ†ŒμŠ€μ™€ ν•¨κ»˜ 200 OK 응닡을 μ „μ†‘ν•©λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλ‚˜ 쀑간 μΊμ‹œλŠ” 이 λ¦¬μ†ŒμŠ€λ₯Ό μΊμ‹œμ— μ €μž₯ν•˜κ³  μ‚¬μš©μžμ—κ²Œ μ œκ³΅ν•©λ‹ˆλ‹€.

  5. λ¦¬μ†ŒμŠ€μ˜ 전달:

    • ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ˜ 응닡을 λ°”νƒ•μœΌλ‘œ μΊμ‹œλœ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ μƒˆλ‘œ 받은 λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ²­ν•œ νŽ˜μ΄μ§€λ‚˜ 컨텐츠λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.

    <aside> 🧐 ETag (Entity Tag)λŠ” HTTP 응닡 ν—€λ”μ˜ μΌμ’…μœΌλ‘œ, μ›Ή μ„œλ²„κ°€ λ¦¬μ†ŒμŠ€μ˜ νŠΉμ • 버전 λ˜λŠ” μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ μ œκ³΅ν•˜λŠ” κ³ μœ ν•œ μ‹λ³„μžμž…λ‹ˆλ‹€. **ETag**의 μ£Όμš” λͺ©μ μ€ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ 간에 νŠΉμ • λ¦¬μ†ŒμŠ€μ˜ λ³€κ²½ μ—¬λΆ€λ₯Ό 효율적으둜 ν™•μΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

    </aside>

**ETag**λ‚˜ Last-Modified 헀더λ₯Ό ν¬ν•¨ν•˜μ—¬ λ¦¬μ†ŒμŠ€μ˜ λ§ˆμ§€λ§‰ μƒνƒœλ₯Ό μ„œλ²„μ— μ–΄λ–»κ²Œ 전달 ν• κΉŒ ❓

HTTP(μ˜ˆμ‹œ)

  1. 첫 번째 μš”μ²­ (ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„λ‘œ):

    GET /resource.jpg HTTP/1.1
    Host: example.com
  2. 첫 번째 응닡 (μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ):

    HTTP/1.1 200 OK
    Content-Type: image/jpeg
    Cache-Control: no-cache
    ETag: "abcdef12345"
    Last-Modified: Wed, 15 Oct 2020 07:26:05 GMT
    ...
    
    [λ¦¬μ†ŒμŠ€ 데이터]
  3. μž¬μš”μ²­ (ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„λ‘œ, 이전 μ‘λ‹΅μ—μ„œ 받은 **ETag**와 Last-Modified 값을 ν™œμš©):

    GET /resource.jpg HTTP/1.1
    Host: example.com
    If-None-Match: "abcdef12345"
    If-Modified-Since: Wed, 15 Oct 2020 07:26:05 GMT
  4. 두 번째 응닡 (두 κ°€μ§€ μ‹œλ‚˜λ¦¬μ˜€κ°€ μžˆμŠ΅λ‹ˆλ‹€):

    • λ¦¬μ†ŒμŠ€κ°€ λ³€κ²½λ˜μ§€ μ•Šμ•˜μ„ λ•Œ (μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ):

    HTTP/1.1 304 Not Modified
    Cache-Control: no-cache
    ETag: "abcdef12345"
    Last-Modified: Wed, 15 Oct 2020 07:26:05 GMT
    • λ¦¬μ†ŒμŠ€κ°€ λ³€κ²½λ˜μ—ˆμ„ λ•Œ (μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ):

    HTTP/1.1 200 OK
    Content-Type: image/jpeg
    Cache-Control: no-cache
    ETag: "newEtagValue67890"
    Last-Modified: Fri, 17 Oct 2020 10:15:30 GMT
    ...
    
    [μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€ 데이터]

μž₯단점 ❓

μž₯점:

1. νš¨μœ¨μ„±κ³Ό μ„±λŠ₯ ν–₯상:

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” λ³€κ²½λ˜μ§€ μ•Šμ€ λ¦¬μ†ŒμŠ€λ₯Ό λ‹€μ‹œ λ‹€μš΄λ‘œλ“œν•  ν•„μš” 없이 둜컬 μΊμ‹œμ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό 읽을 수 μžˆμŠ΅λ‹ˆλ‹€. 이둜 인해 λŒ€μ—­ν­ μ‚¬μš©μ΄ 쀄어듀고 μ›Ή νŽ˜μ΄μ§€μ˜ λ‘œλ”© μ‹œκ°„μ΄ λ‹¨μΆ•λ©λ‹ˆλ‹€.

2. μœ μ—°μ„±:

  • **ETag**와 **Last-Modified**λ₯Ό μ‚¬μš©ν•˜λ©΄, λ¦¬μ†ŒμŠ€μ˜ μ‹€μ œ λ³€κ²½ μ—¬λΆ€λ₯Ό 기반으둜 캐싱 결정을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ¦¬μ†ŒμŠ€μ˜ λ‚΄μš©μ΄ λ³€κ²½λ˜μ§€ μ•Šμ•˜λ‹€λ©΄, μ„œλ²„λŠ” 304 Not Modified 응닡을 λ°˜ν™˜ν•˜μ—¬ λ¦¬μ†ŒμŠ€ λ‹€μš΄λ‘œλ“œλ₯Ό λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. μ΅œμ‹  μƒνƒœ μœ μ§€:

  • no-cache λ””λ ‰ν‹°λΈŒλ₯Ό μ‚¬μš©ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈλŠ” λ¦¬μ†ŒμŠ€μ˜ μƒνƒœλ₯Ό 항상 μ΅œμ‹ μœΌλ‘œ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 특히 λΉˆλ²ˆν•˜κ²Œ λ³€κ²½λ˜λŠ” λ¦¬μ†ŒμŠ€μ—μ„œ μ€‘μš”ν•©λ‹ˆλ‹€.

단점:

1. μΆ”κ°€ μš”μ²­ μ˜€λ²„ν—€λ“œ:

  • no-cache λ””λ ‰ν‹°λΈŒλ₯Ό μ‚¬μš©ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈλŠ” λ¦¬μ†ŒμŠ€μ˜ μƒνƒœλ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ 맀번 μ„œλ²„μ— μš”μ²­μ„ 보내야 ν•©λ‹ˆλ‹€. 이둜 인해 좔가적인 μš”μ²­ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. μ„œλ²„ λΆ€ν•˜ 증가:

  • 맀번 λ¦¬μ†ŒμŠ€μ˜ μœ νš¨μ„±μ„ κ²€μ¦ν•˜κΈ° μœ„ν•œ μš”μ²­μ΄ μ„œλ²„μ— λ„λ‹¬ν•˜λ©΄, μ„œλ²„μ˜ λΆ€ν•˜κ°€ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€.

3. μΊμ‹œ 계산 μ˜€λ²„ν—€λ“œ:

  • ETag κ°’μ˜ μƒμ„±μ—λŠ” μ•½κ°„μ˜ μ˜€λ²„ν—€λ“œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€, 특히 λ‚΄μš© 기반의 ETag 값을 μƒμ„±ν•˜λŠ” κ²½μš°μ— κ·Έλ ‡μŠ΅λ‹ˆλ‹€.

4. 타이밍 이슈:

  • **Last-Modified**λŠ” 초 λ‹¨μœ„λ‘œλ§Œ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ—, 같은 초 내에 μ—¬λŸ¬ 번 μˆ˜μ •λœ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ μ •ν™•ν•œ λ³€κ²½ 감지가 μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

그럼 μ–Έμ œ μ‚¬μš©ν•΄μ•Ό ν•˜λ‚˜μš” ❓

ETag

1. λΉˆλ²ˆν•˜κ²Œ λ³€κ²½λ˜λŠ” λ¦¬μ†ŒμŠ€:

  • λ¦¬μ†ŒμŠ€κ°€ 자주 λ³€κ²½λ˜κ±°λ‚˜ κ·Έ λ³€κ²½ νŒ¨ν„΄μ΄ 예츑 λΆˆκ°€λŠ₯ν•  λ•Œ, **ETag**λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •ν™•ν•œ 버전을 좔적할 수 μžˆμŠ΅λ‹ˆλ‹€.

2. μ •λ°€ν•œ μœ νš¨μ„± 검사가 ν•„μš”ν•  λ•Œ:

  • **ETag**λŠ” λ¦¬μ†ŒμŠ€μ˜ λ‚΄μš© 기반으둜 μƒμ„±λ˜λ―€λ‘œ λ¦¬μ†ŒμŠ€μ˜ μ‹€μ œ λ‚΄μš© 변경을 κ°μ§€ν•˜λŠ” 데 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

3. λ°€λ¦¬μ΄ˆ λ‹¨μœ„μ˜ 정확성이 ν•„μš”ν•  λ•Œ:

  • **Last-Modified**λŠ” 초 λ‹¨μœ„λ‘œλ§Œ μž‘λ™ν•˜μ§€λ§Œ, **ETag**λŠ” λ‚΄μš©μ˜ λ―Έμ„Έν•œ 변경을 감지할 수 μžˆμŠ΅λ‹ˆλ‹€.

Last-Modified

1. μ •κΈ°μ μœΌλ‘œ μ—…λ°μ΄νŠΈλ˜λŠ” λ¦¬μ†ŒμŠ€:

  • λ¦¬μ†ŒμŠ€μ˜ λ³€κ²½ νŒ¨ν„΄μ΄ 예츑 κ°€λŠ₯ν•˜κ³  초 λ‹¨μœ„μ˜ 정밀성이 μΆ©λΆ„ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

2. μ„œλ²„ μ˜€λ²„ν—€λ“œ κ°μ†Œ:

  • **ETag**보닀 **Last-Modified**의 생성 및 검증 μ˜€λ²„ν—€λ“œκ°€ 일반적으둜 더 μ μŠ΅λ‹ˆλ‹€.

Cache-Control: no-cache

1. 항상 μ΅œμ‹  μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό ν•˜λŠ” λ¦¬μ†ŒμŠ€:

  • 예λ₯Ό λ“€μ–΄, 주식 가격, λ‰΄μŠ€ ν”Όλ“œ, μ‹€μ‹œκ°„ 슀포츠 μ μˆ˜μ™€ 같이 계속 μ—…λ°μ΄νŠΈλ˜λŠ” 정보λ₯Ό ν¬ν•¨ν•˜λŠ” λ¦¬μ†ŒμŠ€μ— μ ν•©ν•©λ‹ˆλ‹€.

2. μΊμ‹œλŠ” μ›ν•˜μ§€λ§Œ μœ νš¨μ„± 검사도 ν•„μš”ν•œ 경우:

  • λ¦¬μ†ŒμŠ€λ₯Ό μΊμ‹œν•˜λ˜, μ‚¬μš©ν•˜κΈ° 전에 항상 μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜λ €λŠ” κ²½μš°μ— μ ν•©ν•©λ‹ˆλ‹€.

3. 쀑간 ν”„λ‘μ‹œμ—μ„œ 캐싱 λ°©μ§€:

  • no-cache λ””λ ‰ν‹°λΈŒλŠ” 쀑간 ν”„λ‘μ‹œμ—μ„œμ˜ 캐싱을 λ°©μ§€ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈκ°€ 항상 μ›λž˜μ˜ μ„œλ²„μ™€μ˜ 톡신을 μœ μ§€ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

React (ν”„λ‘ νŠΈμ—”λ“œ)와 Java Spring (λ°±μ—”λ“œ)이면 μ–΄λ–»κ²Œ κ΅¬ν˜„ν•΄μ•Ό ν• κΉŒβ“

1. 첫 번째 μš”μ²­ (React ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ Java Spring μ„œλ²„λ‘œ):

fetch("<https://example.com/api/data>", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
})
.then(response => response.json())
.then(data => {
  // ... data 처리 ...
});

2. 첫 번째 응닡 (Java Spring μ„œλ²„μ—μ„œ React ν΄λΌμ΄μ–ΈνŠΈλ‘œ):

@RestController
@RequestMapping("/api")
public class DataController {
  
  @GetMapping("/data")
  public ResponseEntity<Data> getData() {
    Data data = ...; // 데이터 둜직
    String eTagValue = ...; // ETagλ₯Ό 계산 (예: MD5, SHA-1)

    return ResponseEntity.ok()
      .cacheControl(CacheControl.noCache())
      .eTag(eTagValue)
      .body(data);
  }
}

응닡 헀더:

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache
ETag: "abcdef12345"
...

{ ... 데이터 ... }

3. μž¬μš”μ²­ (React ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ Java Spring μ„œλ²„λ‘œ):

fetch("<https://example.com/api/data>", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "If-None-Match": "abcdef12345"  // 이전 μ‘λ‹΅μ—μ„œ 받은 ETag κ°’
  }
})
.then(response => {
  if (response.status === 304) {
    // ... μΊμ‹œλœ 데이터 μ‚¬μš© ...
  } else {
    return response.json();
  }
})
.then(data => {
  // ... μƒˆλ‘œμš΄ 데이터 처리 (if applicable) ...
});

4. 두 번째 응닡 (Java Spring μ„œλ²„μ—μ„œ React ν΄λΌμ΄μ–ΈνŠΈλ‘œ):

@GetMapping("/data")
public ResponseEntity<Data> getData(@RequestHeader(value = "If-None-Match", required = false) String eTag) {
  String currentETagValue = ...; // ν˜„μž¬ ETag 계산

  if (currentETagValue.equals(eTag)) {
    return ResponseEntity.status(HttpStatus.NOT_MODIFIED).build();
  }

  Data newData = ...; // 데이터 둜직

  return ResponseEntity.ok()
    .cacheControl(CacheControl.noCache())
    .eTag(currentETagValue)
    .body(newData);
}

응닡 헀더 (λ¦¬μ†ŒμŠ€κ°€ λ³€κ²½λ˜μ§€ μ•Šμ•˜μ„ 경우):

HTTP/1.1 304 Not Modified
Cache-Control: no-cache
ETag: "abcdef12345"

응닡 헀더 (λ¦¬μ†ŒμŠ€κ°€ λ³€κ²½λ˜μ—ˆμ„ 경우):

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache
ETag: "newEtagValue67890"
...

{ ... μƒˆλ‘œμš΄ 데이터 ... }

μ—¬κΈ° κΉŒμ§€ λ‚˜μ˜ ꢁ금증 ν•΄κ²°λμ–΄μš”. λ‹€μŒμ— ν•œλ²ˆ μ μš©ν•˜κ³  μ‚¬μš©ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 😊

Last updated 1 year ago

Was this helpful?