filter()란?
Stream에서 원하는 조건만 맞는 요소를 거르기 위한 연산
List<String> names = List.of("Alice", "Bob", "Charlie");
List<String> result = names.stream()
.filter(name -> name.startsWith("A"))
.toList(); // [Alice]
이런식으로 다른 함수들과 함께 쓸수 있는 장점이 있다.
코테준비하다 보면 매우 용의하게 쓸 수 있어서 실무에서도 써보려고 도입하다가
문제점을 생각해서 정리해본다.
DB값을 뽑아서 처리할때는 손해다.
List<String> rewardNames = rewardRepository.findAll().stream()
.filter(r -> r.getVote().getVoteCode().equals(vote.getVoteCode()))
.map(Reward::getRewardName)
.toList();
기존 소스를 이런식으로 만들었는데 리펙토링 작업중 생각보다 문제가 있을 것 같다.
이유는 간단한데 DB에서 전체를 뽑아다가 메모리에서 연산처리하는 것은 생각보다
바보 같은 실수 였다.
효율적으로 처리하려면
List<String> rewardNames = rewardRepository.findByVote_VoteCode(vote.getVoteCode())
.stream()
.map(Reward::getRewardName)
.toList();
이런식으로 먼저 조건연산을 DB에서 처리한다음 가지고 와야하는 것이 효율적인데,
내가 생각한 이유는 다음과 같다.
- 값의 문제가 있는 경우 특별한 경우가 아니라면 DB가 방어하는 것이 더 효율적이며, 책임원칙에서도 옳바르다.
- 분산처리 서버 자체의 부하를 추가적으로 늘리는 형식이 되서, 만약 값이 많을경우 지연될 가능성이 존재한다.
그럼 왜이렇게했냐?
사실 현재 들어있는 항목은 데이터량이 많지 않은 테이블로, 자바에서 처리하는게 더빠를 것 같다는 상상으로 해봤다.
그래서 만든다음 테스트를 해봤는데 DB가 더빨랐다. (AWS 오로라 DB쓰는데 좀 좋은거 같다.)
그래서 굳이? 라는 생각이들어서 다시 바꿔서 만들었다.
'JAVA' 카테고리의 다른 글
array VS List (1) | 2025.03.09 |
---|---|
자바 리플렉션 (Reflection)을 이해해보자 (1) | 2025.02.07 |
JAVA 메모리 - 자바 가상머신 스택과 네이티브 메서드 스택 (2) | 2024.12.14 |
JAVA 메모리 - 프로그램 카운터 레지스터에 대한 이해 (0) | 2024.12.14 |
JAR , WAR (0) | 2024.08.23 |