본문 바로가기
개발/성능 개선

DB 조회 최적화: Map을 활용한 조회 횟수 줄이기

by nineteen 2025. 7. 14.
반응형

이번 포스팅에서는 제가 실제 프로젝트에서 겪었던 DB 조회 성능 이슈와 이를 해결한 경험을 적어보고자 합니다.
DB (외부 저장소)를 건별로 호출하던 로직을 한 번에 조회하여 Map으로 변환 후 매핑하는 방식으로 전환하면서 얻은 성능 개선 경험을 기록해보고자 합니다.

as-is (기존 방식)

  • 데이터 10건 조회 시, 각 데이터의 관련 ID마다 외부 저장소(DB/ES/Redis 등)를 개별 호출
  • 호출 횟수: 데이터 N건 → 외부 저장소 N회 호출

코드 예시

// Data 클래스 예시
public class Data {
    private Long id;
    private String title;
    private List<Integer> relatedIds; // 외부 저장소에서 조회할 ID 목록

    // getters, setters...
}

// 데이터별로 외부 저장소 호출 (비효율)
for (Data data : dataList) {
    List<String> relatedInfo = externalService.findInfoByIds(data.getRelatedIds());
    // ... DataResponse 조립 ...
}

 

to-be (개선 방식)

  • 모든 데이터의 관련 ID를 한 번에 모아 외부 저장소(DB/ES/Redis 등)를 단 1회만 호출
  • Map으로 변환 후, 각 데이터에 매핑
  • 호출 횟수: 데이터 N건 → 외부 저장소 1회 호출

코드 예시

// Data 클래스 예시
public class Data {
    private Long id;
    private String title;
    private List<Integer> relatedIds; // 외부 저장소에서 조회할 ID 목록

    // getters, setters...
}

// 1. 전체 관련 ID 수집
Set<Integer> allRelatedIds = dataList.stream()
    .flatMap(data -> data.getRelatedIds() != null ? data.getRelatedIds().stream() : Stream.empty())
    .collect(Collectors.toSet());

// 2. 외부 저장소 1회 호출, Map 반환
Map<Integer, String> idToInfoMap = externalService.findIdToInfoMap(allRelatedIds);

// 3. 각 데이터에 매핑
for (Data data : dataList) {
    List<String> relatedInfo = data.getRelatedIds() == null ? List.of() :
        data.getRelatedIds().stream()
            .map(id -> idToInfoMap.get(id))
            .filter(Objects::nonNull)
            .toList();
    // ... DataResponse 조립 ...
}

 

효과

  • 외부 저장소 호출 횟수 대폭 감소 (N회 → 1회)
  • 응답 속도 개선: 저의 경우 1.2-1.3초 → 200-300ms (약 75% 성능 향상)

 

마치며

이 글에서 소개한 최적화 방법의 핵심은 단순합니다.
여러 번의 개별 호출 대신, 필요한 데이터를 한 번에 조회하고 Map으로 변환하여 효율적으로 매핑하는 것입니다.

이러한 접근 방식을 통해:

  • 외부 저장소 호출 횟수를 N회에서 1회로 줄였고
  • 저의 경우 응답 속도를 1.2-1.3초에서 200-300ms로 단축했습니다

더 나은 해결 방법이나 개선 아이디어가 있으시다면 편하게 공유해 주세요.