filter방식을 이해하고, 문제점 생각해보기

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에서 처리한다음 가지고 와야하는 것이 효율적인데,

내가 생각한 이유는 다음과 같다.

  1. 값의 문제가 있는 경우 특별한 경우가 아니라면 DB가 방어하는 것이 더 효율적이며, 책임원칙에서도 옳바르다.
  2. 분산처리 서버 자체의 부하를 추가적으로 늘리는 형식이 되서, 만약 값이 많을경우 지연될 가능성이 존재한다.

그럼 왜이렇게했냐?

 

사실 현재 들어있는 항목은 데이터량이 많지 않은 테이블로, 자바에서 처리하는게 더빠를 것 같다는 상상으로 해봤다.

그래서 만든다음 테스트를 해봤는데 DB가 더빨랐다. (AWS 오로라 DB쓰는데 좀 좋은거 같다.)

그래서 굳이? 라는 생각이들어서 다시 바꿔서 만들었다.