바쁜 시간들을 보내다가 오랜만에 새로운 내용으로 돌아왔습니다.
취준은 바쁘고 힘들지만, 큰 성장의 기회라고 생각하고 열심히 공부해 나가겠습니다😎
이번 포스트에서는 시스템을 만들 때 한 번쯤 떠올리고, 고려해보는 캐시에 대해서 다룰예정입니다!
캐시는 무엇이고, 어떤 방법들이 있는지와 실제 스프링에서 어떤식으로 사용되는지 예제까지 한번 살펴보도록 하겠습니다
그럼 시작하겠습니다💨💨💨
캐시 메모리는 메인 메모리와 CPU간의 속도 향상을 위한 작은 메모리 공간입니다.
CPU 안에 존재하거나 외에 존재하며, 자주 사용하는 데이터 혹은 값을 미리 복사해 놓는 임시 장소입니다.
즉, 자주 사용되는 데이터는 캐시 메모리에 접근하여 빠르게 가져올 수 있습니다.
위와 같은 저장공간 계층 구조에서 L1~L3 캐시 공간에 저장됩니다.
모든 데이터를 캐시에 담아서 사용하면 좋겠지만, 현실은 그럴수 없기에 데이터를 선별해야합니다.
그럼 어떤 데이터를 캐시에 담아야 할까요?
이때 사용하는 개념이 지역성입니다.
지역성이란 기억장치 내의 데이터에 균일하게 접근하는 것이 아닌, 어느 한 순간에 특정 부분을 집중적으로 참조하는 특성을 말합니다.
특정 데이터가 한 번 접근 되었을 경우, 가까운 미래에도 동일 데이터에 접근할 가능성이 높은 것을 말합니다.
메모리 상의 같은 주소에 여러 차례 읽기 쓰기를 수행하는 경우 작은 크기의 캐시로도 큰 효율성을 얻을 수 있습니다.
특정 데이터와 서로 인접한 데이터들이 가까운 미래에도 다시 접근할 가능성이 높은 것을 말합니다.
즉, 주변에 초점이 좀 더 맞춰저 있습니다.
CPU캐시나 디스크 캐시의 경우 한 메모리 주소에 접근할 때 해당 주소뿐만 아니라 해당 블록을 전부 캐시에 가져옵니다.
이때 메모리 주소를 순차적으로 접근하면, 캐시에 같은 블록이 담겨 있기 때문에 캐시의 효율성이 높아집니다.
특정 조건이 존재하지 않는 한 데이터에 순차적으로 접근하는 경향을 의미합니다. 공간적 지역성에 포함되어 설명되기도 합니다.
위와같은 지역성을 통해 캐시에 담을 데이터들을 선별합니다.
캐시의 목적은 DB에 매번 접근하여 데이터를 조회하는 것보다 빠르고 효율적으로 데이터를 가져오기 위함에 있습니다.
따라서 아래와 같은 경우 캐시의 사용을 고려하면 좋습니다.
만약 원하는 데이터가 캐시에 저장되어 있는 경우, 이를 Cache Hit 이라고 합니다.
반면 원하는 데이터가 없는 경우 Cache Miss라고 합니다. 즉, 원본 데이터를 조회하여 전달한 후, 캐시에 담아야합니다.
만약 데이터의 양이 많지 않고, 중복 저장되어도 부하가 적고, 데이터의 일관성이 깨져도 비지니스에 큰 영향이 없는 데이터라면 Local Caching 방식이 적절합니다.
(반대의 경우는 Global Caching)
여기까지 캐시에 대한 기본 개념들을 알아보았습니다.
실제 예제를 통해 좀 더 깊게 알아볼까요?
그렇다면 실제로 스프링에서 캐시를 사용하는 방법에 대해 알아보도록 하겠습니다.
캐싱을 사용하기 위해선 두가지 방법이 존재합니다.
Ehcache는 스프링에서 간단하게 사용할 수 있는 Java 기반 오픈소스 라이브러리입니다.
Spring AOP 기능을 활용하여 Annotation을 이용해 간단하게 사용 가능합니다.
추가적인 캐시 저장소를 연결하지 않는다면, ConcurrentHashMap 기반의 맵 저장소가 자동으로 추가됩니다.
앞서 말했던 것처럼 스프링은 AOP기반으로 메소드에 캐싱을 적용할 수 있도록 어노테이션들을 제공해줍니다.
구체적인 예시는 향로님이 올려주신 글을 보시면 큰 도움이 될 것 같습니다!
지금까지 캐시에 대해서 알아보았습니다!
읽어주셔서 감사합니다😝
References
Cache - Server (Redis, Spring Cache)