개념잡기

캐시

gucoding 2025. 5. 28. 19:25

부끄럽지만 컴퓨터공학 관련 용어 베이스가 제대로 잡혀있지 않은 상태입니다…

반성하고자 지금부터라도 [개념잡기] 시리즈에서 틈틈이 정리하고자합니다.

기본 개념들에 대한 간략한 설명이 좀 많은 점 양해 부탁드립니다.

개념

캐시란 데이터나 값을 미리 복사해 놓는 임시 장소 개념입니다.

주 저장소에서 접근하는 시간을 줄이거나, 값을 다시 계산하지 않고 싶을 때 사용합니다.

이 개념은 다양한 컴퓨터 분야에서 사용됩니다. 캐시는 제가 이해하기 쉽도록, 편의상 크게 하드웨어 수준과, 애플리케이션 수준으로 구분하겠습니다.

하드웨어 캐시

  • CPU 캐시 : CPU에서 주기억장치(RAM)에 접근을 빨리하고자 칩 내부에 별도로 탑재하는 작은 메모리
  • 디스크 캐시 : 디스크 제어와 외부와의 인터페이스를 위해 작은 컴퓨터를 내장하고 있다. 이 작은 컴퓨터는 대개 디스크에 입출력되는 데이터를 저장하는 작은 메모리를 갖고 있는데, 이를 디스크 캐시

참고) 자바언어 관점에서 보면 cpu 캐시와 메인메모리 간에 데이터 일관성을 유지하기 위해 CAS 연산, volatile 키워드를 사용합니다.

애플리케이션 캐시

  • 웹 캐시 : 웹 브라우저는 최근 방문한 사이트를 캐시에 저장해 놓는다. 많은 인터넷 제공업체들과 대규모 네트워크의 운영자들은 인기 있는 웹 페이지의 캐시를 프록시 서버에 저장하여 웹 페이지 요청에 응답하게 함으로써 네트워크 대역폭을 아낀다.

웹 캐시는 여러 계층 레벨이 섞인 캐싱 개념입니다. 웹 브라우저라는 애플리케이션이 자제적으로 저장하는 애플리케이션 캐시로 볼 수 있겠지만, 브라우저 캐시는 일반적으로 자주 접근하는 작은 파일(CSS, JS, 이미지 등)은 메모리에, 큰 파일이나 덜 자주 접근하는 파일은 디스크에 저장하는 하드웨어 캐시로 볼 수 있겠죠.

후자는 네트워크 수준 캐시로 보여지구요.

로컬(인-메모리)캐시 vs 리모트(글로벌)캐시

애플리케이션 수준에서 캐시를 위 두가지로 나눠볼 수 있겠습니다.

로컬 캐시는 프로세스와 동일한 메모리에 캐시 저장소로 사용하는 것이고

리모트 캐시는 별도 프로세스 메모리에 캐시 저장소로 사용하는 것입니다.

로컬 캐시 - 자바

앞서 말했듯이 캐시는 일종의 개념입니다. 자바로도 구현해볼 수 있죠.

public class SimpleCache {

    private static final Map<Integer, Integer> cache = new HashMap<>();

    public int multiplyByTwo(int number) {
        if (cache.containsKey(number)) {
            return cache.get(number); 
        }
        int result = number * 2; 
        cache.put(number, result);
        return result;
    }

단순히 2를 곱한값을 리턴해주는 예시입니다..

로컬 캐시 - 스프링

스프링 애플리케이션에서 내장된 캐시를 사용할 수 있습니다.

implementation "org.springframework.boot:spring-boot-starter-cache"

다음 의존성을 추가하고 Cache 인터페이스를 직접 구현해서 사용할 수 있습니다. 물론 대부분은 이미 검증된 라이브러리를 사용합니다.

implementation 'com.github.ben-manes.caffeine:caffeine'

로컬 캐시로는 caffeine 을 많이 쓰는 모습입니다.

CacheManager로 캐시들을 관리할 수 있습니다. 추가로 리모트 캐시와 함께 추상적으로 관리할 수 있게 CompositeCacheManager(@Cacheable)를 사용합니다.

https://mangkyu.tistory.com/370

사용처

로컬 캐시는 해당 프로세스와 메모리 공간을 공유하다 보니, 속도 측면에서 강점이 있으나 저장할 수 있는 데이터 한계가 빨리오고 애플리케이션을 재시작하면 캐시도 같이 날라갑니다.

리모트 캐시는 정반대의 성격을 지니므로 상황에 맞게 선택해야합니다.

게시판을 생각해보면 공지글은 거의 바뀌지 않으면서 개수도 보통 10개 미만입니다. 이 때는 로컬 캐시를 사용하는게 좋아보입니다.

캐시 적재 (Warm up Cache, Pre loading Cache)

이런 경우에도 좋을 것 같습니다. 예를 들어 어떤 초 인기 상품이 특정 시간에 나온다고 할 때 순간적으로 트래픽이 몰릴 수 있다는게 예상되는 상황에서, 몇 시간 전부터 캐시에 저장함으로써 빠른 응답을 제공할 수 있겠네요.

주의할 점

당연하게도 변경이 자주 일어나는 데이터에는 캐시를 적용하면 안됩니다. 일반적인 게시글은 수정이 빈번할 텐데 이를 캐싱하면 수정은했지만 조회하면 수정되지 않는 혼란을 겪게합니다.

만약 서버를 여러개로 스케일아웃했거나 할 예정이라면, 캐싱을 적용한 데이터도 비교적 변경가능성이 높다면 리모트 캐시에 적재해야합니다. 앞서 말했듯이 로컬 캐시는 애플리케이션 종속적이라서 사용자마다 응답받는 서버마다 결과가 다를 수 있기 때문입니다.

마지막으로 데이터를 캐싱할 때 마다 적정 live 시간을 생각해서 잘못된 정보를 줄 상황을 줄이는게 서비스의 신뢰도를 높이는 방법일 것입니다.

'개념잡기' 카테고리의 다른 글

가비지 컬렉션  (1) 2025.07.16
웹 공격으로 생각해보는 JWT  (0) 2025.06.02