주니어 개발자의 성능 개선에 대한 고민

Kyle·2023년 11월 23일
0
post-thumbnail

- 어떤 작업을 맡았는가

OTA 플랫폼의 호스트 서비스에서 할인 정책이 적용된 각각의 가격을 달력에 띄우기 위한 작업을 진행하고 있었습니다.

플랫폼에서는 예약 일자를 기반으로 여러 조건을 검사하여 최종 가격을 띄우는데 호스트 서비스에서는 달력에 순수한 가격만을 띄우고 있어 정책이 적용된 가격을 띄우는 것이 작업의 목표였습니다.

- 어떤 문제에 부딪혔는가

기존의 로직을 사용하기 위해서는 매일을 예약 일자로 잡아 계산을 해야 합니다. 그렇게 된다면 한 달 안의 모든 일자에 대해 계산을 적용하게 되는데 이를 통해 순수한 가격을 불러올 때 보다 3배까지의 시간이 걸리게 된 것입니다.

- 어떤 과정으로 문제를 해결했는가

조건을 검사하고 계산하는 코드가 반복문을 여러 번 돌면서 불필요하게 생기는 쿼리가 성능 저하의 주된 이슈였습니다.

  1. 시간복잡도 개선 : 순수함수
    우선 O(a x b x c)로 되어 있던 시간복잡도를 순수 함수로 필요한 부분을 빼내어 O(a * b)로 개선하였습니다. 쏙쏙 들어오는 함수형 코딩: 심플한 코드로 복잡한 소프트웨어 길들이기  책을 참고하며 기능 단위로 순수함수를 만들었습니다. 이를 통해 함수 안에서 함수 명과 크게 연관 없는 코드들도 순수 함수를 통해 적절한 함수명을 가진 상태로 분리될 수 있었고 실행하는 쿼리도 줄일 수 있게 되었습니다.
  2. 함수 내부 정리
    반복문에서의 배열에 대한 직접적인 접근 대신 인덱싱을 사용할 수 있도록 개선하였습니다. 코드 가독성 및 추후의 유지보수를 위해 변수명 또한 수정하였습니다.

- 어떤 결과가 있었는가

달력에 가격을 렌더링 할 때 0.78초가 걸렸습니다. 1차 작업 후 모든 날짜에 대해 service를 호출할 때는 7.35초가 걸렸고 위의 개선 과정 후에는 0.08초로 렌더링 시간을 단축 시킬 수 있었습니다. 최종적으로 기존의 시간에 비해 10배, 1차로 한 작업에 비해 100배의 시간을 단축한 결과를 낼 수 있게 되었습니다.

- 어떤 점을 느꼈는가

프론트엔드 작업 뿐 아니라 백엔드 작업도 맡으며 성능에 대한 고민, 쿼리에 대한 고민을 깊게 할 수 있었어서 뜻 깊은 작업이었습니다.  Eager load ,  Preload 에 대해서도 접하게 되어 이를 사용한 리팩토링도 진행해 보려고 합니다.

profile
불편함을 고민하는 프론트엔드 개발자, 박민철입니다.

0개의 댓글