Post

2024-08-12-TIL

2024-08-12-TIL

Today I Learned

Caching Best Practices

캐싱을 적용할 대상은 어떻게 정하는 것이 좋을까?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
캐시(Cache)는 자주 접근하는 데이터를 임시로 저장해두어 시스템 성능을 개선하는 데 사용됩니다. 캐시를 적용하기에 적절한 부분은 다음과 같습니다:

### 1. **데이터베이스 조회 결과**
   - **빈번한 조회:** 특정 데이터베이스 쿼리가 반복적으로 실행되고, 그 결과가 자주 동일한 경우 캐시를 통해 조회 속도를 크게 향상시킬 수 있습니다.
   - **비교적 변경이 적은 데이터:** 자주 변경되지 않는 정적인 데이터에 캐시를 적용하면 효율적입니다. 예를 들어, 제품 카탈로그나 사용자 프로필 정보 등이 이에 해당할 수 있습니다.

### 2. **복잡한 계산 결과**
   - **고비용 연산:** 계산이 복잡하고 시간이 많이 걸리는 작업의 결과를 캐시에 저장해두면, 이후 동일한 요청에 대해 캐시된 결과를 사용하여 성능을 개선할 수 있습니다. 예를 들어, 통계 정보, 그래프 데이터, 머신 러닝 모델의 예측 결과 등이 있습니다.

### 3. **외부 API 호출**
   - **빈번한 외부 서비스 요청:** 외부 API를 반복적으로 호출해야 하는 경우, 응답 데이터를 캐시해두면 네트워크 비용을 줄이고 성능을 향상시킬 수 있습니다.
   - **외부 시스템의 레이트 리밋 제한 회피:** 외부 API가 호출 빈도에 제한을 두는 경우, 캐시를 통해 호출 수를 줄여 레이트 리밋에 걸리는 것을 방지할 수 있습니다.

### 4. **정적 자원**
   - **이미지, CSS, JavaScript 파일:** 웹 애플리케이션에서 정적 자원(이미지, 스타일시트, 자바스크립트 파일 등)을 캐싱하면 페이지 로드 속도를 크게 개선할 수 있습니다.

### 5. **세션 데이터**
   - **사용자 세션 관리:** 사용자 세션 정보를 캐시하면, 세션 데이터를 저장하고 조회하는 작업이 신속하게 처리될 수 있습니다. 

### 6. **템플릿 엔진의 렌더링 결과**
   - **동적 페이지의 캐싱:** 동적으로 생성되는 페이지나 템플릿의 렌더링 결과를 캐시하면, 동일한 페이지 요청에 대해 캐시된 결과를 반환하여 성능을 개선할 수 있습니다.

### 7. **DNS 조회 결과**
   - **DNS 캐싱:** 도메인 이름을 IP 주소로 변환하는 DNS 조회 결과를 캐시하면, 같은 도메인에 대한 반복적인 요청 시 조회 시간을 절약할 수 있습니다.

캐시를 적용할 때는 캐시 갱신 주기, 캐시된 데이터의 유효성, 캐시 오버헤드 등도 고려해야 합니다. 잘못된 캐시 적용은 오히려 성능을 저하시킬 수 있으므로, 캐시의 장점과 단점을 모두 고려한 전략이 필요합니다.

도메인과 기능으로 따지면 어떤 부분에서 유용하고 적절한가? 그리고 적절하지 않은 사용은 어떤 경우가 있을까?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
캐시의 유용성과 적절성은 도메인과 기능에 따라 다릅니다. 다음은 각 도메인과 기능별로 캐시의 유용성과 적절한 사용 사례, 그리고 적절하지 않은 사용 사례를 설명합니다.

### 1. **웹 애플리케이션**
   - **유용한 부분:**
     - **정적 콘텐츠 (CSS, JS, 이미지):** 웹 페이지 로딩 속도를 개선하기 위해 캐시를 사용하면 사용자가 동일한 리소스를 반복적으로 다운로드하지 않아도 됩니다.
     - **페이지 레벨 캐시:** 뉴스 사이트나 블로그와 같이 자주 변경되지 않는 페이지의 HTML을 캐시하여 서버 부하를 줄이고 응답 속도를 높일 수 있습니다.
     - **API 응답 캐시:** 자주 호출되는 API 엔드포인트의 응답을 캐시하면 네트워크 요청을 줄이고 성능을 높일 수 있습니다.
   - **적절하지 않은 사용:**
     - **사용자 맞춤형 데이터:** 개인화된 정보(예: 사용자 대시보드, 개인화된 추천)는 사용자마다 다르기 때문에 캐시 사용 시 비정상적인 데이터 노출 위험이 있습니다.
     - **자주 변경되는 콘텐츠:** 실시간으로 변경되는 데이터(예: 소셜 미디어 피드, 주식 가격)는 캐시의 유효성을 유지하기 어렵기 때문에 부적절합니다.

### 2. **이커머스**
   - **유용한 부분:**
     - **제품 정보:** 자주 변경되지 않는 제품 상세 정보나 카테고리 데이터를 캐시하여 검색 및 조회 성능을 개선할 수 있습니다.
     - **카트 및 주문 과정:** 주문 확인 페이지나 장바구니 상태를 캐시하면 성능을 개선할 수 있습니다. 그러나 이 경우 캐시 무효화 전략이 중요합니다.
   - **적절하지 않은 사용:**
     - **재고 상태:** 실시간으로 변동하는 재고 정보를 캐시하는 것은 사용자에게 잘못된 정보를 제공할 위험이 있습니다.
     - **가격 정보:** 가격이 자주 변경되는 상품에 대한 정보를 캐시하면, 구식 데이터를 사용자에게 제공할 수 있어 문제가 발생할 수 있습니다.

### 3. **게임**
   - **유용한 부분:**
     - **레벨 데이터, 지도 정보:** 자주 사용되는 게임 레벨 정보나 맵 데이터를 캐시하여 로딩 속도를 빠르게 할 수 있습니다.
     - **게임 상태 저장:** 게임 진행 상태를 캐시하여, 사용자가 게임을 중단하고 다시 시작할 때 빠르게 복구할 수 있습니다.
   - **적절하지 않은 사용:**
     - **실시간 점수 및 랭킹:** 실시간으로 변동하는 점수나 랭킹은 캐시하면 안 됩니다. 실시간 업데이트가 중요하기 때문입니다.
     - **멀티플레이어 상태:** 멀티플레이어 게임에서 실시간 동기화가 필요한 정보는 캐시로 인해 지연되면 안 됩니다.

### 4. **금융 서비스**
   - **유용한 부분:**
     - **환율, 주가 히스토리:** 과거 데이터나 환율 히스토리 등 변동이 적은 금융 데이터를 캐시하여 조회 성능을 높일 수 있습니다.
     - **사용자 프로필:** 사용자 프로필 정보는 자주 변경되지 않으므로 캐시를 사용하여 접근 속도를 개선할 수 있습니다.
   - **적절하지 않은 사용:**
     - **실시간 거래 데이터:** 실시간 거래 정보는 절대 캐시해서는 안 됩니다. 정확성과 신뢰성이 중요하기 때문입니다.
     - **보안 관련 데이터:** 금융 거래와 관련된 보안 정보는 캐시하지 않아야 합니다. 보안 위험이 크기 때문입니다.

### 5. **검색 엔진**
   - **유용한 부분:**
     - **검색 쿼리 결과:** 자주 요청되는 검색 쿼리의 결과를 캐시하면 검색 속도를 크게 개선할 수 있습니다.
     - **인덱스 데이터:** 검색 인덱스의 일부를 캐시하여 검색 요청에 빠르게 응답할 수 있습니다.
   - **적절하지 않은 사용:**
     - **실시간으로 업데이트되는 인덱스:** 실시간으로 크롤링되어 업데이트되는 인덱스 데이터를 캐시하면, 최신 정보를 제공하지 못할 수 있습니다.

### 적절하지 않은 사용 예시 요약:
- **실시간 업데이트가 중요한 데이터:** 금융 거래 정보, 주식 가격, 실시간 게임 상태 등은 캐시하지 않는 것이 좋습니다.
- **개인화된 사용자 데이터:** 사용자 맞춤형 데이터는 캐시 사용 시 데이터 누출이나 혼선의 위험이 있습니다.
- **보안이 중요한 정보:** 보안 정보를 캐시하면 민감한 정보가 노출될 수 있어 위험합니다.

캐시를 사용할 때는 캐시의 유효성 관리와 무효화 전략을 명확히 설정하는 것이 중요합니다. 잘못된 캐시 설정은 오히려 시스템의 신뢰성을 저하시킬 수 있습니다.

Reverse Proxy

  • https://www.strongdm.com/what-is/reverse-proxy-vs-load-balancer
  • https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/
  • https://losskatsu.github.io/it-infra/reverse-proxy/
  • https://en.wikipedia.org/wiki/Reverse_proxy
  • https://aday7.tistory.com/entry/%EB%A6%AC%EB%B2%84%EC%8A%A4-%ED%94%84%EB%A1%9D%EC%8B%9CReverse-Proxy-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EA%B0%9C%EB%85%90%EB%B6%80%ED%84%B0-%ED%95%84%EC%9A%94%EC%84%B1-%EC%98%A4%ED%94%88-%EC%86%8C%EC%8A%A4-%EC%86%94%EB%A3%A8%EC%85%98%EA%B9%8C%EC%A7%80

JMeter

  • https://jmeter.apache.org/download_jmeter.cgi
  • https://github.com/apache/jmeter
  • https://leeggmin.tistory.com/10

The Frugal Architect

  • https://thefrugalarchitect.com/laws/make-cost-a-non-functional-requirement.html
  • https://channy.creation.net/blog/1828

FQCN

  • https://www.tutorialspoint.com/get-the-fully-qualified-name-of-a-class-in-java
  • https://www.quora.com/What-is-a-fully-qualified-class-name-in-Java
  • https://dydwnsekd.tistory.com/85

Java Serialization

  • https://docs.oracle.com/en/java/javase/11/docs/specs/serialization/serial-arch.html
  • https://www.baeldung.com/java-serialization
  • https://www.geeksforgeeks.org/serialization-in-java/

Redis Serialization

  • https://redis.io/docs/latest/develop/reference/protocol-spec/
This post is licensed under CC BY 4.0 by the author.