[개발 리포트] Findex 프로젝트

1. 프로젝트 개요

  • 서비스 명: Findex (금융 지수 데이터 대시보드)
  • 목적
    • 파편화된 금융 지수 데이터를 통합하여 사용자가 한눈에 지표를 관리할 수 있는 백엔드 시스템 구축
  • 주요 기능
    • 금융위원회 OpenAPI 연동을 통한 지수 데이터 수집
    • 자동 동기화 설정
    • 기간별 지수 차트 및 성과 랭킹 제공

2. 담당 작업

  • API 개발: 지수 정보 CRUD 및 조건별 목록/요약 조회 API 구현.
  • 시스템 아키텍처 설계: JPA 엔티티 관계 설계
  • 공통 모듈 구축: 전역 예외 처리 및 AOP 기반 성능 추적 로그 시스템 구축

3. 기술적 성과

  • QueryDSL 기반 동적 조회 최적화
    • 다양한 필드 정렬 조건을 처리하기 위해 QueryDSL 도입
    • 첫 번째 페이지 조회 시 전체 카운트 쿼리를 생략하도록 로직을 개선하여 불필요한 DB 연산 방지
    • 관련 PR
  • DTO Projection을 통한 조회 성능 개선
    • 요약 목록 조회 시 엔티티 전체가 아닌 필요한 필드만 직접 조회하도록 설계하여 메모리 낭비와 데이터 변환 비용을 최소화
    • 관련 PR
  • 공통 예외 응답 설계
    • @RestControllerAdvice를 통해 예외 처리를 공통화
    • 유효성 검증 실패 시 에러가 발생한 필드와 메시지를 명확히 구분하여 클라이언트에 전달하도록 구현
    • 관련 PR
  • AOP 기반 상황별 로깅
    • 외부 API 연동(500ms)과 내부 로직(150ms)의 성능 임계값을 분리하여 실제 지연이 발생하는 지점을 정확하게 모니터링할 수 있도록 구성
    • 관련 PR

4. 문제 해결 과정

[문제 1] 지수 데이터 삭제 로직 성능 개선 (N+1 문제 해결)

  • 상황
    • 지수 정보 삭제 시 연관된 지수 데이터들이 개별적으로 삭제되면서 N+1 쿼리 발생
  • 분석
    • deleteBy 메서드는 연관 객체를 하나씩 조회 후 삭제하므로 성능 저하 유발
    • 양방향 참조가 없어 CASCADE 옵션 활용이 어려운 구조
  • 해결
    • 벌크 쿼리를 통해 한 번의 쿼리로 연관 데이터를 일괄 삭제하도록 변경
    • 이후 DB의 ON DELETE CASCADE 설정을 활용하여 최종적으로 자식 객체 삭제 쿼리 자체를 제거
  • 결과
    • 삭제 쿼리를 2번에서 1번으로 최적화하여 대량의 지수 데이터 연관 삭제 시 안정성 확보
  • 관련 PR 및 이슈

[문제 2] 서버 리전 변경을 통한 네트워크 지연 해결

  • 상황
    • 지수 차트 데이터 로딩 중 약 1.17초의 지연 발생하나, 서버 로직 수행 시간은 정상(10ms 내외)임을 확인
  • 분석
    • 브라우저의 Waterfall를 분석한 결과, DNS Lookup과 초기 연결(Initial connection)에서 병목 확인
    • 서버가 미국(US) 리전에 위치하여 물리적 거리가 원인임을 파악
  • 해결
    • 애플리케이션 서버 및 데이터베이스 서버 리전을 싱가포르로 변경하여 네트워크 응답 속도를 개선
  • 결과
    • Waiting (TTFB) 시간이 617ms에서 182ms로 단축(약 70% 개선)
    • 전체 응답 속도가 1,170ms에서 653ms로 약 44% 개선
  • 관련 이슈

[문제 3] 로그 시스템의 실효성 확보

  • 상황
    • 모든 연동 요청 로그가 SLOW 로 기록 됨
  • 분석
    • 모든 요청에 동일한 임계값(150ms)을 적용하였기 때문에, 외부 API와 연동하는 로직에서 항상 SLOW 로그가 발생
  • 해결
    • AOP 로직 내에 외부 연동 메서드(syncIndexDatasyncIndexInfo)를 별도로 관리하는 화이트리스트를 도입하여 임계값을 500ms로 상향 조정
  • 결과
    • 불필요한 경고 로그를 제거하고, 실제 로직상의 성능 저하가 발생하는 지점만을 명확히 추적할 수 있게 됨
  • 관련 PR 및 이슈

5. 협업 및 피드백

  • 성능 중심의 코드 리뷰
    • 팀원의 동기화 로직에서 발생하는 N+1 문제를 발견하고,  Map을 활용한 일괄 조회 및 업데이트 방식을 제안하여 성능을 개선함

      image.png image.png

  • 로직 정합성 및 가독성 리뷰
    • 팀원의 차트 그래프 산출 로직에서 앞 단의 그래프가 출력되지 않는 산출 로직 피드백
    • 내부 DTO는 별도로 분리하지 않도록 피드백
    • 관련 PR

6. 코드 품질 및 최적화

1) Enum을 활용한 코드 가독성 개선

  • 상황
    • 정렬 기준의 타입(숫자, 문자열 등)에 따라 각각의  BooleanExpression 을 생성하는 분기문으로 repository 클래스의 코드가 길어짐
  • 분석
    • 정렬 필드에 따른 커서 정렬  BooleanExpression 을 구할 수 있도록 분리 필요
  • 해결
    • 정렬 필드를 Enum으로 선언하여 각 정렬 필드마다 커서 정렬 로직을 반환하는 메서드를 오버라이딩 하도록 함
  • 관련 PR 및 이슈

7. 향후 개선 사항

  • 현재 실시간으로 처리되는 지수 데이터 연동 로직을 Spring Batch를 이용한 배치 프로세스로 전환하여, 대용량 데이터 처리 시의 시스템 안정성을 더욱 높일 수 있음

Leave a comment