캐시와 참조 지역성으로 웹 성능을 높이는 방법

2025. 1. 22. 01:23·CS

웹사이트를 개발할 때, 빠른 속도와 좋은 사용자 경험을 제공하는 것은 매우 중요합니다. 그중에서도 캐시와 참조 지역성이라는 개념은 속도를 높이는 데 큰 역할을 합니다. 이번 글에서는 이 개념들에 대해 알아보고, 웹 개발에서 어떻게 활용할 수 있는지 살펴보고자 합니다 !


1. 캐시(Cache)란 무엇일까?

캐시 : 자주 사용하는 데이터를 빠르게 불러오기 위해 저장해 두는 장소

 

예를 들자면, 스타벅스 앱에서 자주 주문하는 커피를 **나만의 메뉴(즐겨찾기)**에 추가해 놓으면, 매번 메뉴를 선택하고 세부 옵션을 설정할 필요 없이 저장된 정보를 바로 불러와 빠르게 주문할 수 있다. 캐시는 이와 같은 역할을 한다. 데이터를 미리 저장해 두고, 필요할 때 바로 제공해 시간을 절약해 준다.

  • 왜 캐시가 필요할까?
    • 데이터를 매번 새로 가져오려면 시간이 오래 걸린다. 캐시는 이 시간을 줄여서 프로그램을 더 빠르게 만든다.

캐시를 사용하는 예시

  • 브라우저 캐시
    • 웹사이트를 방문하면, 자주 쓰이는 이미지나 CSS 파일을 브라우저가 저장해 다음 방문 때 더 빨리 로드한다.
  • 서버 캐시
    • 서버가 자주 요청받는 데이터를 저장해, 데이터베이스(DB)를 매번 조회하지 않도록 한다.

2. 참조 지역성(Locality of Reference)이란?

참조 지역성은 데이터를 사용하는 패턴과 관련이 있다.

프로그램이 한 번 접근한 데이터는

1) 가까운 시점에 다시 접근하거나, 2) 근처 데이터도 함께 사용될 가능성이 높다는 것을 의미한다.

  • 시간 지역성(Temporal Locality)
    • 최근에 사용한 데이터는 또 사용될 확률이 높다.
    • ex) 유튜브 앱에서 같은 영상을 여러 번 재생
    • ex) 루프 : 동일한 명령을 계속해서 가져온다.
  • 공간 지역성(Spatial Locality)
    • 접근한 데이터 근처에 있는 데이터도 사용될 확률이 높다.
    • ex) 엑셀 파일에서 한 열의 데이터를 순서대로 읽는 경우
    • ex) 데이터 배열 처리 : 배열 i에 대한 접근은 순차적으로 i + 1에 대한 접근으로 이어질 수도 있다.

이 원리를 이용하면 프로그램이 필요한 데이터를 더 빨리 찾아서 처리할 수 있다.


3. 캐시와 참조 지역성을 웹 개발에 활용하는 방법

3-1. 서버와 데이터베이스에 캐시 사용하기

API나 데이터베이스에서 자주 요청되는 데이터를 Redis나 Memcached와 같은 도구를 사용해 캐시 하면 서버 속도가 빨라진다.

  • 동작 방식
    1. 클라이언트가 데이터를 요청하면 먼저 캐시에 데이터가 있는지 확인
    2. 캐시에 있으면(DB를 거치지 않고) 바로 응답
    3. 캐시에 없으면 데이터를 DB에서 가져오고, 이를 캐시에 저장

코드 예제 : Node.js에서 Redis를 활용한 캐싱

const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient();

app.get('/data', async (req, res) => {
  const cacheKey = 'api:data';

  client.get(cacheKey, (err, data) => {
    if (data) {
      return res.send(JSON.parse(data)); // 캐시된 데이터 반환
    }

    // 캐시에 없으면 데이터베이스에서 가져오기
    const freshData = { name: 'example', value: 42 };

    client.setex(cacheKey, 3600, JSON.stringify(freshData)); // 캐시에 저장
    return res.send(freshData); // 새 데이터 반환
  });
});

app.listen(3000, () => console.log('Server is running on port 3000'));


3-2. 브라우저에서 캐시 활용하기

웹사이트에서 사용하는 이미지, CSS, JS 파일은 브라우저가 캐시에 저장해 두면 다음 방문 시 더 빨리 로드된다.

  • 브라우저 캐싱 방법
    • Cache-Control : 캐시 데이터를 얼마나 오래 저장할지 설정
    • ETag : 파일이 변경되었는지 확인해 불필요한 다운로드를 방지

NGINX를 활용한 캐싱 설정 예시

location /assets/ {
    expires 1y; # 1년 동안 캐싱
    add_header Cache-Control "public";
}

3-3. 프론트엔드에서 데이터 접근 최적화하기

참조 지역성을 활용하면 브라우저에서도 더 빠른 데이터를 처리할 수 있다.

  • 배열 대신 객체(Map) 사용
    • 데이터를 빠르게 찾기 위해 배열보다는 키-값 형태의 객체를 사용하는 것이 효율적
  • Virtual DOM 최적화
    • React나 Vue.js에서는 변경된 부분만 다시 그리도록 설계해 불필요한 연산 감소
// React에서 Virtual DOM 최적화 예제
function MyComponent({ items }) {
  const renderedItems = useMemo(() => {
    return items.map(item => <Item key={item.id} data={item} />);
  }, [items]); // items가 변경될 때만 다시 계산
  return <div>{renderedItems}</div>;
}

4. 캐시와 참조 지역성의 한계

캐싱과 참조 지역성은 강력하지만, 제대로 관리하지 않으면 문제가 생길 수 있다.

  • 캐시가 오래된 데이터를 제공할 위험
    • 데이터가 변경되었는데도 캐시가 이를 반영하지 못하면 문제가 된다.
  • 캐시 미스(Cache Miss)
    • 캐시에 데이터가 없으면 오히려 성능이 느려질 수 있다.
  • 캐시 관리 전략
    • 오래된 데이터는 삭제(LRU: Least Recently Used)
    • 캐시 데이터에 유효 기간 설정(TTL: Time to Live)

5. 웹 개발에서 캐시와 참조 지역성을 활용하는 팁

  1. 정적 파일 캐싱
    • 이미지, CSS, JS 파일은 브라우저 캐시를 적극적으로 활용하기
  2. 동적 데이터 캐싱
    • 자주 요청되는 데이터를 서버에서 Redis로 캐싱하기
  3. 효율적인 데이터 접근
    • 배열 대신 객체를 활용하거나, 필요한 데이터만 로드하도록 설계하기
  4. 캐싱 전략 테스트
    • 실제 데이터를 분석해 캐싱 정책을 최적화하기

결론

캐시와 참조 지역성 원리를 잘 활용하면 웹 애플리케이션의 속도를 크게 높일 수 있다.

브라우저 캐싱, 서버 캐싱, 그리고 효율적인 데이터 구조 설계는 모두 더 빠르고 더 나은 사용자 경험을 제공하기 위한 핵심 전략임을 배울 수 있었다.

'CS' 카테고리의 다른 글

[컴퓨터 구조] 프로그램이 실행된다는 것의 의미  (0) 2026.01.03
[컴퓨터 구조] 컴퓨터를 구성하는 요소  (0) 2025.12.23
개발자가 컴퓨터 구조를 알아야 하는 이유  (0) 2025.01.13
웹 개발 시 꼭 챙겨야 할 보안 체크 리스트  (0) 2025.01.07
혼자 공부하는 네트워크 CH5. 응용 계층  (2) 2024.12.19
'CS' 카테고리의 다른 글
  • [컴퓨터 구조] 프로그램이 실행된다는 것의 의미
  • [컴퓨터 구조] 컴퓨터를 구성하는 요소
  • 개발자가 컴퓨터 구조를 알아야 하는 이유
  • 웹 개발 시 꼭 챙겨야 할 보안 체크 리스트
uoaheu
uoaheu
uoaheu 님의 블로그 입니다.
  • uoaheu
    uoaheu 님의 블로그
    uoaheu
  • 전체
    오늘
    어제
    • 분류 전체보기 (50)
      • 알고리즘 (7)
      • CS (9)
      • FRONTEND (9)
        • React (12)
        • Kotlin (1)
        • JS (5)
        • HTML (2)
      • SQL (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    토스 앱 분석
    mysql로 피벗테이블만들기
    멀티캠퍼스it부트캠프
    BFS
    toss 분석
    알고리즘
    백준1926번
    유레카3기
    부트캠프후기
    mysql
    리액트usestate
    이더넷프레임
    엘지유플러스유레카프론트엔드
    토스 uiux
    토스분석
    useactionstate
    toss uiux
    mysql 피벗테이블
    boj25418
    혼자서 공부하는 네트워크
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
uoaheu
캐시와 참조 지역성으로 웹 성능을 높이는 방법
상단으로

티스토리툴바