현재 국내 상거래 사이트 가격 추적 애플리케이션을 개발하는 프로젝트를 진행 중입니다.
해당 어플리케이션은 사용자가 등록한 상품에 대해 주기적으로 정보를 수집하여 관리합니다. 사용자는 상품 별로 목표 가격을 설정하고 상품의 가격이 목표가격 이하로 하락하게 되면 알림을 받을 수 있습니다. 또한 앱 내에서 상품의 가격 변화를 담은 그래프와 상품 정보를 확인할 수 있습니다.
해당 프로젝트는 주기적으로 데이터를 수집하고 다수의 사용자에 대해 다양하고 많은 데이터를 전달하는 과정을 효율적으로 처리하는 것이 핵심 과제라고 생각하였으며, 이를 위해 캐시를 적용하는 과정에서 진행한 학습, 고민, 구현 등에 대해 기록하고자 합니다.
이번 파트에서는 Cache를 적용하게된 배경과 학습과정 및 고려사항에 대해 적어보도록 하겠습니다.
Cache는 미래의 요청에 대한 결과 데이터를 미리 저장해뒀다가 빠르고 효율적으로 서비스하는 것을 목표로 합니다. 이미 조회한 데이터나 연산 결과를 저장함으로써 향후 동일한 요청에 대한 처리 속도를 향상시키고 서버 부하를 감소시킬 수 있어 어플리케이션의 성능을 향상시킬 수 있습니다.
이러한 장점을 가진 Cache를 진행중이던 프로젝트에 적용하면 상품 데이터를 전달하거나 확인하기 위해서는 항상 외부 DB 서버에 접근하여 값을 읽어와야야해서 발생하던 비용을 대폭 줄일 수 있을 것이라고 생각하였습니다.
위에서 언급한 Cache의 장점만을 보면, 무조건 사용해야 하는 것 아닌가? 하는 생각을 할 수 있습니다. 하지만 Cache의 장점을 가져가는 상황은 Cache가 Hit이 되어야 하는 상황에만 유한합니다.
Cache Hit 이란 요청에 대한 데이터가 캐시에 존재하여 데이터를 캐시로부터 즉시 응답받을 수 있는 경우를 말합니다. 이 경우에는 데이터를 처리하기 위해 캐시만을 검색하므로 빠르게 응답할 수 있고 부가적인 I/O가 발생하지않습니다.
Cache Miss는 요청에 대한 데이터가 캐시에 존재하지 않는 경우를 말합니다. 이 경우에는 캐시 검색 이후 DB와 같은 별도의 리소스에서 데이터를 검색하여 응답하는 과정을 거칩니다.
Cache Miss가 발생할 경우에는 오히려 Cache를 사용하지 않은 경우보다 Cache에 대한 I/O가 추가적으로 발생하여 성능이 저조한 현상을 보이게 됩니다.
따라서 Cache의 이점을 살리기 위해서는 Cache Hit 비율을 최대한 높이는 것이 중요합니다.
Cache Hit을 높일 수 있는 이상적인 방법은 Cache에 모든 데이터를 저장하는 것입니다. 하지만 현실은 Cache 저장공간의 한계가 있기 때문에, Cache에 어떤 데이터를 저장할지에 대한 전략을 잘 세우는 것이 중요합니다.
우선 Cache에 저장할 데이터를 결정할 때에는 데이터가 자주 참조되며 변경이 적으며, 변경의 영향이 적은지에 대한 여부를 판단하는 것이 중요합니다.
또한 현재 비즈니스 로직에 적절한 캐시 전략을 선택하는 것도 중요합니다.
Cache는 데이터를 저장하고 관리하는 범위에 따라 local cache와 global cache로 나뉩니다.
지금까지 설명한 내용을 바탕으로 진행중인 프로젝트에 어떻게 Cache를 적용하면 좋을지 고민을 해보았습니다. 학습을 목적으로 하는 프로젝트이기 때문에 다양한 Cache를 사용해보고자 하여, Local Cache와 Global Cache를 모두 사용하고자 하였습니다. 또한 Local Cache는 직접 Cache를 구현하여 적용해보는 과정을 가지고, Global Cache는 Redis를 사용하여 적용하기로 하였습니다.
다음 파트에서는 Local Cache를 프로젝트에 적용하는 과정에 대해 소개하도록 하겠습니다.
어떤 데이터를 저장하고 활용하는지, Cache는 어떻게 구성하였는지 등에 대한 자세한 내용을 다루겠습니다.
프로젝트를 진행하며 데이터 처리 성능 개선을 위해 Cache를 적용하기로 결정하여, Cache에 대해 학습하고 어떻게 현재 프로젝트에 적절하게 적용할 수 있을지 고민하는 시간을 가졌습니다.
Cache 구조 설계에 따라 Cache의 효율이 크게 차이가 날 수 있다는 것과 효율적인 구조 설계를 위해서는 고려해야하는 부분이 정말 많다는 것을 깨닫게 되었습니다.
현재 프로젝트의 상황에 적절한 Cache 구조와 학습을 병행 할 수 있도록 설계하는 것이 중요할 것 같습니다.