프로젝트 DB 최적화 과정 기술
이번 프로젝트에서 DB 성능 개선을 가장 우선시한 이유는 시스템 전체적인 성능 향상과 사용자 경험 개선을 목표로 하고 있는데 DB가 사용자 경험에 있어 가장 큰 성능적 체감을 제공한다고 생각하기 때문이다. 이번 프로젝트는 MongoDB를 사용 중이며, 성능 개선의 대상은 사용자의 가입일에 따라 동적으로 댓글 작성 권한을 부여하는 기능이다.
문제 정의
사용자에게 가입 후 일정 기간이 지나면 댓글을 작성할 수 있는 권한을 부여하려고 한다. 이를 위해 가입한지 3일이 지난 사용자에게 자동으로 댓글 작성 권한을 부여하는 방식을 고려했다. 초기에는 가입 날짜를 계산하여 이를 기반으로 권한을 부여하였으나, 성능 향상을 목적으로 일정 기간이 지나면 자동으로 토큰을 부여하는 방식으로 전환할 예정입니다.
초기 구현: 가입일 계산 방식
처음에는 사용자의 가입일을 계산하여, 현재 시간과 비교하여 3일이 지났는지를 판별하는 방식을 사용하였다. 이 방식은 다음과 같은 흐름으로 구현되었다
- 사용자의 가입일과 현재 날짜를 비교하여 가입 후 3일이 지났는지 확인한다.
- 3일이 지났을 경우, 댓글 작성 권한을 부여한다.
- 이 방식은 간단하고 직관적이지만, 매 요청마다 가입일을 계산하여 성능 부하가 발생할 수 있다.
// 가입일 계산 코드
const today = new Date();
const joinDateObj = new Date(joinDate);
const diffTime = Math.abs(today - joinDateObj);
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
최적화 과정: 자동 토큰 부여 방식
성능 향상을 목표로, 가입 후 일정 기간이 지나면 자동으로 댓글 작성 권한을 부여하는 방식으로 전환하였다. 이 방식은 다음과 같은 흐름으로 구현되었다:
- 사용자가 처음 로그인하거나 요청을 할 때, 가입 후 일정 기간이 지났는지를 확인합니다.
- 일정 기간이 지났다면, 서버에서 자동으로 토큰을 생성하고 이를 사용자에게 부여합니다.
- 사용자는 이 토큰을 사용하여 댓글 작성 권한을 획득하고, 이후에는 별도의 날짜 계산 없이 토큰만으로 권한을 확인합니다.
- 이 방식은 초기 계산에 비해 서버에 매우 작은 부하를 주며, 댓글 작성 권한을 보다 빠르게 제공할 수 있다.
성능 비교 및 최적화 증명
두 방식의 성능을 비교하고 최적화를 증명하기 위해 다음과 같은 절차를 거쳤다:
postman 이라는 api 성능 측정 툴을 사용했다.
성능 테스트: 가입일 계산 방식과 자동 토큰 부여 방식을 각각 구현하여 성능 테스트를 진행하였다. 이 과정에서 다수의 동시 요청을 보내 성능을 측정해봤다.
commenttokken 엔드포인트가 토큰방식 join-days가 날짜 계산 방식이다.
결과 분석: 성능 테스트 결과를 바탕으로 두 방식의 장단점을 분석하였다. 특히 서버 응답 시간을 비교하였다.
날짜 계산 방식
토큰 확인 방식
결론
이번 프로젝트는 MongoDB 데이터베이스를 최적화하고, 이를 통해 사용자 경험을 향상시키기 위한 노력을 지속적으로 진행하고 있다. 초기에는 백엔드에서 직접 계산하던 코드를 데이터베이스 레벨로 이동시켜 코드 복잡도를 줄였다. 하지만 그 결과 응답 속도에 있어서 유의미한 성능 개선을 얻지 못한 점이 아쉬웠다. 너무 작은 케이스와 소규모 프로젝트여서일까 아니면 내 예측이 틀린걸까. 발상은 나쁘지 않았던 것 같은데 첫 성능 개선의 시도가 유의미한 성과가 아니어서 좀 아쉽지만 계속해서 성능 개선의 방향을 고민해볼 예정이다.
Ghost