일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 개발 회고
- 코딩일기
- 수학
- 회고
- 시뮬레이션
- State
- 자바스크립트
- 기본 문법
- js
- 브루트포스
- HTML5
- react-three/fiber
- three.js
- 자료 구조
- REACT
- 프론트엔드
- JavaScript
- 모던 자바스크립트 튜토리얼
- 티스토리챌린지
- 토이 프로젝트
- 세그먼트 트리
- 자바
- 오블완
- styled-components
- 구현
- 엔트리포인트
- 백준
- poiemaweb
- 해시를 사용한 집합과 맵
- Next.js
- Today
- Total
코딩하는 고릴라
[FE] API 캐싱 본문
🕊 배경
프로젝트 진행 중 동일한 요청에 동일한 응답을 받아오는 API 요청을 계속해서 전송하는 경우가 있었습니다.
따라서, 불필요한 API 요청 횟수를 줄이기 위한 방법을 고민해보고 프로젝트에 적용해 보았습니다.
🦙 내용
1. 기존 로직
- API 요청이 필요할 때 마다 요청을 보내고 그 응답 데이터를 활용
- 매 번 API 요청을 하기 때문에 불필요하게 많은 횟수의 API 요청 가능성
2. 개선 로직
- API 요청이 필요한 상황에 캐시 데이터 체크
- 캐시 데이터에 필요로 하는 요청에 대한 응답값이 저장되어 있다면 캐시 데이터 활용
- 캐시 데이터에 필요로 하는 요청에 대한 응답값이 없다면 API 요청
2-1. 캐시 데이터 체크 로직
// API_CACHE_DATA: API 요청에 대한 응답 값을 저장할 Map
const API_CACHE_DATA = new Map();
- { API_URL : RESPONSE_VALUE } 형태의 Map API_CACHE_DATA 선언
const hasResponse = API_CACHE_DATA.get('http://localhost:8080/api/team');
- 요청이 필요할 때 해당 Map의 URL에 해당하는 키 값에 응답 값이 저장 되어있는지 체크
if (!hasResponse) {
axios.get('http://localhost:8080/api/team')
.then((res) => {
API_CACHE_DATA.set('http://localhost:8080/api/team', res.data); // 응답 데이터 캐싱
console.log(res.data); // 응답 데이터 활용
})
.catch((err) => console.log(err));
} else {
console.log(res.data); // 응답 데이터 활용
}
- 캐시 데이터가 없다면 새로운 API 요청 후 응답 데이터 캐싱 및 활용
- 캐시 데이터가 있다면 캐시 데이터 활용
- 위 로직처럼 구성해도 캐싱을 활용할 수 있으나, 응답 값이 변할 수 있는 데이터의 캐싱의 경우 올바르지 않은 캐시 데이터를 활용할 확률이 있습니다.
- 이를 어느정도 보완하기 위해 캐시 데이터의 만료일자를 설정해 활용했습니다.
const cacheData = API_CACCHE_DATA.get('http://localhost:8080/api/team');
if (!cacheData || cacheData.exp < new Date().getTime()){
axios.get('http://localhost:8080/api/team')
.then((res) => {
// 캐시 데이터 설정 {data, exp}
API_CACHE_DATA.set('http://localhost:8080/api/team', {
data: res.data,
exp: new Date().getTime + 1000 * 60 * 10,
})
// 응답 데이터 활용
console.log(res.data);
}.catch((err) => console.log(err));
} else {
// 캐시 데이터 활용
console.log(cacheData.data);
}
- key로 API URL을, value로 { 응답데이터, 만료 시간 } 형태의 Object를 설정해두어 캐시 데이터가 존재한다고 하더라도 만료 시간에 따라 캐시 데이터를 갱신하는 로직을 구성할 수 있었습니다.
🦍 고찰
- 프로젝트를 진행하며 여러 팀들을 출력하는 페이지네이션에 위 로직을 적용해보았습니다. 팀은 생기거나 없어질 수 있기에 만료시간을 매우 적게 주었고, 이 때문에 효용성을 크게 느끼진 못했습니다.
- 다만, 변하지 않는 유저 고유의 데이터나 서비스에서 제공하는 상품 리스트를 출력하는 부분에서는 이를 적용해봄직 하다 생각했습니다.
- API 요청, 응답을 보낼 때의 비용과 메모리에 API 응답 값을 캐싱하는데 소요되는 비용을 잘 저울질 할 수 있어야 할 것 같았습니다.
- 다음 프로젝트에는 react-query를 적용해 데이터 캐싱을 보다 요긴하게 활용해보려고 합니다.
'Project > Pennypal' 카테고리의 다른 글
[FE] 데코레이터로 API 캐싱 로직 분리하기 (0) | 2024.07.24 |
---|---|
[FE] 스타일이 적용된 CSS 가상 요소 ::after가 GPU 사용률에 미치는 영향 - 원인 파악중,, (0) | 2024.04.08 |
[FE] FSD 아키텍처를 활용한 디렉토리 구조 구성 (0) | 2024.04.05 |