반응형
이번 포스팅에서는 제가 실제 프로젝트에서 겪었던 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로 단축했습니다
더 나은 해결 방법이나 개선 아이디어가 있으시다면 편하게 공유해 주세요.
'개발 > 성능 개선' 카테고리의 다른 글
| 서버 리소스 절약하면서 데이터 정리하기 - MySQL Event 활용기 (2) | 2025.07.05 |
|---|---|
| Bulk Update 성능 개선: JPA에서 JdbcTemplate으로 전환 (0) | 2025.04.07 |