데이터베이스 쿼리 횟수 줄이기

강두연·2020년 12월 6일
3
post-thumbnail

웹 성능 향상시키기

오늘은 기술에 대한 자세한 다루는 방법이나 이런 얘기보다는 백엔드 개발자 입장에서 서비스의 성능(속도)를 개선 시키는 대표적인 방법에 대해 블로깅하겠다.

사실, 가장 간단한 방법으로는 좋은 장비를 구축(Scale-up) 하거나 장비의 개수를 더 많이 사용하는(Scale-out)을 하면 되지만 문제는 돈이 많이 든다는 것이다.

해당 포스트에서는 똑같은 장비를 사용하는 환경이라 가정하고 성능을 개선시키는 방법에 대해 얘기해보겠다.

효율적인 로직 구현, 알맞는 알고리즘 활용하여 시간 및 공간 복잡도 줄이는 방법은 당연한 얘기인것 같아서 해당 포스트에서는 논외로 하겠다.

데이터베이스에 접근하는 쿼리 수 줄이기

프레임워크의 ORM을 잘 사용하거나, Query Language에 대해 깊이 잘 알고 있으면 같은 내용의 데이터를 불러오더라도 더 적은 DB hits 로 불러올 수 있다.
본인이 사용하고 있는 프레임워크인 Django로 예를 들면, 매번 for문을 돌리면서 쿼리를 날리는 방법보다는 select_related 나 prefetch_related 등을 사용하여 한번에 'JOIN'문을 실행하여 여러 테이블에 접근하여 데이터를 가져오고싶을 때 한방 혹은 두방에 모든 데이터를 합쳐서 불러오는 방법이 있다.
해당 내용에 대해서는 추후 블로깅하겠다.

다른 방법으로는, '캐싱'서버를 적극 활용하는 것이다.

캐싱이란?
자주 사용하는 쿼리문에 대한 결과를 미리 메모리에 저장하는 기법으로 캐싱이 되어있는 데이터들은 디비를 거치지 않고 바로 메모리에서 불러오는 방법으로 자주 사용된다.

캐싱 서버를 활용할 때 가장 대표적으로 흔하게 쓰이는 게 바로 오픈소스인 'Redis' 이다. Redis는 메모리에 인덱싱을 하여 (key, value) 형태로 저장한다.
예시로 페이지 최상단에 노출되는 이벤트 상품들을 캐싱하여 홈페이지에 필요한 데이터를 불러올 때마다 메모리에 접근하여 더욱 빠르게 데이터들을 클라이언트에게 전달하는 기법으로 많이 사용된다.

현재 위코드에서 진행중인 2차프로젝트에서 한번 적용해보고 싶은 기술중에 하나이다.
빨라지는 속도의 체감을 위하여 상품데이터도 Faker 라이브러리를 사용하여 2만개가 넘는 데이터를 넣어놨다. 기회가 된다면 꼭 Caching을 사용하여 빨라진 속도를 체감해보고 싶다.

profile
Work hard, Play hard

1개의 댓글

comment-user-thumbnail
2021년 1월 20일

두연님 그래서 Redis 성능은 어땠나요 ?? 후기 넘나 궁금쓰

답글 달기