
애플리케이션에서 자주 조회되는 데이터는 처음 메인 페이지의 첫 페이지에 있는 데이터들입니다.
ecommerce 프로젝트에서 메인페이지는 보통 상품 목록 데이터들이 있습니다.
애플리케이션의 전체적인 성능을 높이기 위해서는 자주 조회되는 데이터를 '캐싱' 해주면 되겠다고 생각했습니다.
그렇다면 cache(캐시)란 무엇일까요?
위키백과에 캐시에 대해 검색하면 다음과 같은 결과가 나옵니다.
💡 위키백과
캐시는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 저장소를 가리킨다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우 또는 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다. 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근할 수 있다.
즉, DB에 저장된 데이터로 접근함으로써 발생하는 I/O 비용을 줄여 속도를 향상 시키기 위해 중간에 데이터를 저장한 임시 저장소를 말합니다.
그렇다면, 이러한 Cache는 언제 사용해야 할까요?
1. 동일 데이터에 반복적으로 접근해야 하는 경우
2. 변하지 않는 데이터에 접근해야하는 경우
3. 데이터에 접근 시 복잡한 로직이 필요한 경우
위와 같은 상황에서 캐싱을 해주면, 큰 성능 향상 이점을 갖게 된다고 합니다.
필자의 프로젝트는 Spring Boot 프레임워크를 사용 중이며, Spring은 내부적으로 캐시를 사용할 수 있도록 기능을 제공합니다.(Spring Cache Abstraction)
이외에도 Redis, Memcached와 같은 외부에서 제공하는 캐시도 있습니다.
두 캐시를 크게 Local Cache와 Global Cache라고 하며, 이를 사용하는 기준으로는 다음과 같이 TradeOff가 존재합니다.
Local의 경우, 데이터 접근 시 I/O 비용이 없습니다. 하지만, 서버의 인스턴스가 여러 개인 환경에서 인스턴스 간에 데이터 일관성 유지가 어렵워 신뢰성이 떨어지게 됩니다.
반면에, Global은 네트워크 I/O 비용이 발생합니다. 하지만 서버 외부에서 캐싱 데이터를 관리하기 때문에 데이터 일관성 유지가 가능합니다.
위와 같이 트레이드오프가 존재합니다.
현재 필자의 프로젝트는 하나의 서버에 여러 인스턴스가 존재하는 환경이므로, 데이터 일관성 유지를 위해 Global Cache 도입하는 것이 맞습니다.
결론적으로 말하면, Redis를 사용하겠습니다.
먼저, Redis는 다양한 기능을 지원합니다. 장애 대응을 위한 복제 및 영구 저장은 실시간 서비스 장애 시 빠르게 복구가 가능합니다.
이외에도 다양한 데이터 자료구조와 트랜잭션이 존재하므로, 프로젝트 내에서 활용도가 높습니다.
아래의 블로그를 참고하면, 성능적인 측면에서도 Redis가 Memcached보다 조회 측면에서 우수하다는 것을 확인할 수 있습니다.