Java 8 Stream API로 컬렉션 처리 리팩토링
배경
사내 주문 관리 시스템의 리포트 생성 로직을 개선하는 작업을 맡았다. Java 6 시절 작성된 코드라 중첩된 for문과 if문이 많아 가독성이 떨어졌다. Java 8을 도입한 지 1년이 지났으니 Stream API로 리팩토링을 시도했다.
기존 코드
List<Order> activeOrders = new ArrayList<>();
for (Order order : orders) {
if (order.getStatus() == OrderStatus.ACTIVE) {
activeOrders.add(order);
}
}
long totalAmount = 0;
for (Order order : activeOrders) {
totalAmount += order.getAmount();
}
개선 코드
long totalAmount = orders.stream()
.filter(order -> order.getStatus() == OrderStatus.ACTIVE)
.mapToLong(Order::getAmount)
.sum();
5줄 이상의 코드가 3줄로 줄었고, 의도가 명확해졌다.
성능 이슈
작은 컬렉션(1000건 이하)에서는 문제없었지만, 대량 데이터 처리 시 기존 for문보다 느린 케이스가 있었다. parallelStream()을 시도했으나 오히려 오버헤드가 커졌다.
결국 API 레이어에서는 Stream 사용, 배치 처리는 전통적 for문 유지로 결론지었다. 성능 크리티컬한 부분은 측정 후 판단하는 게 맞다.
교훈
- Stream API는 가독성 개선에 확실히 도움이 된다
- 짧다고 무조건 좋은 건 아니다
- 성능이 중요한 구간은 벤치마크 필수
- 팀 코드 리뷰에서 Stream 사용 가이드 문서화 필요