프로젝트 개요
- 목적: 대규모 사용자 기반을 대상으로 하는 포인트 관리 시스템에서 포인트 적립 및 사용 내역 조회 기능 개선.
- 기술 스택: Java, Spring Framework, JPA, QueryDSL, Swagger for API Documentation
발견된 문제
- 초기 구현에서는 포인트 사용 및 적립 내역 조회 API가 전체 데이터셋을 한 번에 로드하는 방식을 사용했습니다. 이 방법은 데이터 셋의 크기가 시간이 지남에 따라 선형적으로 증가함에 따라, API 응답 시간이 점차 늘어나는 문제를 초래했습니다. 사용자 경험의 저하는 물론, 서버 부하가 증가하여 시스템 전체의 안정성에 영향을 미쳤습니다.
문제 분석
- 성능 테스트를 통해, 데이터 로드 시 응답 시간이 평균 157.86ms임을 확인했습니다. 이는 사용자 경험을 저하시킬 수 있는 수준이며, 특히 모바일 사용자에게는 더욱 민감한 문제입니다.
해결책 구현
1. 커서 기반 페이지네이션: 전체 데이터셋을 한 번에 로드하는 대신, 커서 기반 페이지네이션을 도입하여 데이터를 부분적으로 로드하도록 구현했습니다. 이를 위해 QueryDSL을 사용하여 페이징 로직을 개발했고, Long.MAX_VALUE
를 사용하여 최초 요청 시 최신 데이터부터 조회하도록 설정했습니다.
2. RESTful API 개선: 기존의 /points/used-details
API 경로를 REST 원칙에 부합하도록 /points/used
로 변경하여 자원의 표현을 더 명확히 하고, API 경로의 일관성을 개선했습니다.
3. Swagger 문서화: 페이지네이션 매개변수 cursorId
와 limit
에 대한 자세한 설명을 추가하여, API 문서를 개선함으로써 프론트엔드 개발자들이 API를 더 쉽게 이해하고 사용할 수 있도록 지원했습니다.
성과 및 결과
- 적용 후 성능 측정 결과, API 응답 시간이 평균 36.72ms로 감소하여 약 77%의 응답 시간 단축을 실현했습니다. 이는 사용자 대기 시간을 현저히 줄이고, 서버 부하를 감소시켜 전체적인 시스템 성능을 향상시켰습니다.
- RESTful API 구조로의 전환과 Swagger 문서의 개선은 다른 개발 팀원들이 API를 더 쉽게 이해하고 효과적으로 사용할 수 있게 만들어, 프로젝트 내 협업 효율성을 증진시켰습니다.
리플렉션 및 학습
- 이 프로젝트를 통해 커서 기반 페이지네이션과 RESTful 설계의 중요성을 깊이 있게 이해하게 되었습니다. 또한 성능 최적화가 사용자 경험에 미치는 직접적인 영향을 체감할 수 있었고, 이는 앞으로의 개발 과정에서도 중요한 고려 사항이 될 것이라 생각합니다.
- 문서화의 중요성도 재확인하게 되었습니다. 효과적인 문서화는 개발자 간의 원활한 커뮤니케이션을 가능하게 하며, API의 신뢰성과 접근성을 크게 향상시긴다는 것을 깨달았습니다.