[#2] JAVA, 그리고 캐시

NIB·2021년 7월 7일

[개발일지]

목록 보기
1/3

최근 팀이 변경되면서 한번도 유지보수를 해본 적 없는 쇼핑몰 사이트 유지보수를 맡게 됐다 ..
뭐가 그렇게 다르겠어? 데이터 확인하고 쿼리만 잘 걸면 괜찮겠지 하고 생각하며 자신있게 들어갔는데 웬걸! 하는 것 마다 처음해보는 방식이라 입사 3개월 신입처럼 혼나고 있다. 오늘은 그 혼난 수많은 사유들 중에서 새롭게 배우게 된 캐시 적용에 대해 작성해보려고 한다.

갑자기 자바에서 캐시 적용을 찾는 이유?

우선 잊어버리기 전에 이 캐시 적용을 찾아보게 된 계기를 적어놓겠다.
웹 사이트를 개발할때는 보통 이 사이트를 개발해달라고 요청하는 클라이언트들이 있다. 우리가 사이트를 개발하면 프론트/어드민 페이지 두 개의 사이트를 개발하게 되는데 클라이언트들이 어드민에서 콘텐츠를 등록하면 그게 프론트에 노출되는 방식으로 사용이 된다.
그런데 내가 쇼핑몰 사이트 유지보수를 맡게 되고 얼마 지나지 않아 클라이언트 쪽에서 이런 문의가 왔다.

어드민에서 콘텐츠를 등록했는데, 콘텐츠가 노출이 안돼요!

왜? 내가 처음 이 문의를 받았을 때 들었던 생각은 왜..? 라는 단어 뿐이었다. 어드민에서 콘텐츠를 등록하면 당연히 DB에 해당 데이터들이 쌓이게 될 거다.
그럼 프론트에서 데이터를 노출 시킬때 DB를 조회해서 보여주기 때문에 컨텐츠가 제대로 등록이 됐다면 나오는게 당연한데?? 무슨 이런 문의가 왔나 싶었는데 그 후에 또 다른 문의가 왔다.

시간이 지나니 노출이 되네요.. 혹시 캐시 갱신이 몇 분인가요?

캐시? 나는 보통 쇼핑몰처럼 사용자가 많이 몰리는 사이트가 아닌 back-end 단에서 데이터를 가공하는, 어드민의 그 어드민 정도 되는 사이트를 관리하던 입장이어서 데이터에 캐시를 둔다는 사실이 너무도 생소했다. 내게 있어 오직 중요한건 대량의 데이터를 insert/select할 때 timeout이 발생하지 않기 위해 불필요한 쿼리 및 join을 줄이는 것 뿐이었으니... 그리고 그걸 질문하는 순간 넌 대체 2년동안 뭘 한거냐며 뒤지게 혼났다 🤦‍♀️oO(모를수도 있지 ㅡㅡ 아는 척 하는 것보다야 낫구만) 이게 내가 캐시를 찾아보게 된 이유다.

그렇다면 캐시 적용을 하는 이유는 무엇인가?

캐시란 무엇인가부터 적기에는 나는 너무 바쁘고, 그런 사소한건 구글을 검색하면 나오기 때문에 간단히 넘어가겠다!
그렇다면 나는 여기서 가장 단편적인 궁금증이 떠올랐다.
왜? 그걸 왜 적용하는데?
사용자 한명이 메인에 접근한다고 생각해보자. 쇼핑몰의 특성상 메인에서 조회되어 불러올 데이터들(상품들)이 있을거다. 뭐, 기획전이나 메인배너, 신규상품, 인기상품, 기획전 상품등등등.
사용자 한명이 들어올 때마다 select 쿼리가 대략 5번씩 실행된다고 가정해보자. 그렇다면 그 한명이 새로고침을 10번 하면 50번의 쿼리가 날라가고, 100번한다면 500번, 1000번이면 5000번의 동일한 쿼리가 DB를 거쳐 웹페이지에 뿌려지게 된다.
상품의 경우를 생각해보면 상품은 보통 하루에 한번씩 데이터가 필요할 때마다 update 되게 되어진다. 10분을 주기로 생각해볼때 10분안에 1000개의 상품이 모두 변경될 가능성이 있을까? 물론 아예 없다고 할 수는 없지만 그런 경우는 사이트를 오픈한다던가 하는 매우 특수한 경우일 것이다.
그렇다면 이 5개의 select 쿼리를 사용자가 들어올 때마다 매 초, 날라간다는 건 사이트에 부하가 걸리기 좋은 상황이라고 볼 수 있다.
이런 상황에서 데이터를 캐시 잡아 사용자가 들어올 때 캐시에 저장된 데이터를 뿌려주고, 설정한 시간마다 캐시를 갱신하는 방식을 사용하게 되는 것이다.
한마디로 말하자면 사이트의 부하를 최소화하기 위한 방식이다.

사이트 부하 방지? 오케 좋았어! 그러면 구현은?

그래 그래 이 정도면 캐시를 사용하는 이유도 알았고 부하 관련해서 매우 중요한 역할을 하는 것도 알았다. 그렇다면 구현은? spring을 사용하는 프로젝트에서 해당 캐시 구현 및 적용은 어떤 방식으로 하게 되는 걸까?

메인 클래스에 아래와같이 선언 되어 있으면 캐시를 사용한다는 뜻
@EnableCaching
@Cacheable
ehcache.xml을 작성해서 캐시..어쩌구 아무튼 그걸 설정을 해줘야 한대
이거에 대해서 좀 찾아보는게 좋겠어 !

0개의 댓글