트러블 슈팅

Overfetching 성능 개선

5kiran 2023. 3. 24.
반응형

최종 프로젝트 성능 개선

1. 증상

DB에서 불필요한 데이터를 받아오는 Overfetching 문제가 있었다.
이 사소한 문제 하나로도 성능에 차이가 생기지 않을까라는 의문이 들었다.
필요한 칼럼만 select로 가져오면 유의미한 성능에 변화가 있을까??
  • Overfetching으로 인한 성능 저하

2. 해결방안

쿼리를 수정하여 불필요한 데이터를 최소화 시키면 성능 면에서 좋은 결과를 얻을 수 있을 거라고 판단하여 쿼리 수정 작업 진행
  • 조회 시 필요한 칼럼만을  select하여 불필요한 데이터를 최소화

Service와 Repository

위와 같은 코드를 QueryBulider를 사용하는 로직으로 바꾸고자 했다.
Repository에서 find를 QueryBulider로 바꿔보았다.

Repository
변경되거나 추가된 코드

정상적으로 기능이 작동되는 걸 확인했다.

이제 각각 쿼리를 비교해보자

TypeORM의 find 메소드와 QueryBulider

우선 사진을 보면 쿼리는 거의 비슷하다.
첫 번째 사진은 TypeORM의 find 메서드를 사용했을 때 쿼리이다.
두 번째 사진은 TypeORM의 QueryBulider를 사용했을 때 쿼리이다.
쿼리를 보면 의도한 데로 불필요한 칼럼을 제외한 데이터를 잘 받아오는 것을 볼 수 있다.

 

3. 결과

부하테스트를 진행해 보았다.

부하 테스트는 Jmeter를 이용했고 설정은 아래와 같이 설정해 줬다.

Jmeter

미가입 그룹 리스트 15.49% 개선

1. 리팩토링

2. 기존

우선 생각보다 유의미한 결과가 있어서 놀랐다.
무려 15.5%나 성능이 개선됐다.
여기에 그치지 않고 나는 기존 코드에서 QueryBulider로 변경이 필요해 보이는 몇 개의 코드들을 QueryBulider로 바꾸고 전체적으로 얼마나 유의미한 변화가 생기는지 알고 싶었다.

 

가입 신청 그룹 리스트 14.08% 개선

1. 리팩토링

2. 기존

소속된 그룹 리스트 8.84% 개선

1. 리팩토링

2. 기존

위와 같이 성능이 어느 정도 향상되는 것을 볼 수 있다.

반응형

댓글