[Spring] Java Stream API - `.stream()`의 의미

호이·2025년 1월 15일

Spring

목록 보기
2/3

1. 의문점

스프링을 사용하여 간단한 블로그 CRUD API를 개발하면서 공부하는 중에 다음의 코드를 보고 의문점이 들었다.

List<ArticleResponse> articles = blogService.findAll()
    .stream()
    .map(ArticleResponse::new)
    .collect(Collectors.toList());

이렇게 코드를 작성하는 이유가 무었일까? 그래서 당장 GPT한테로 달려가서 물어보았다.

2. 코드의 흐름 설명

우선 나의 의문점을 가져다 준 코드부터 살펴보자. 각 코드가 의미하는 것은 다음과 같다.

  1. blogService.findAll()

    • 이 메서드는 일반적으로 List<Article>와 같은 컬렉션을 반환한다. 예를 들어, 데이터베이스에서 모든 Article 객체를 가져오는 메서드일 수 있다.
  2. .stream()

    • findAll()이 반환한 List<Article>Stream<Article>으로 변환한다.
    • 스트림은 데이터 흐름에서 여러 연산(변환, 필터링 등)을 쉽게 적용할 수 있게 한다.
  3. .map(ArticleResponse::new)

    • 스트림 내 각 Article 객체를 ArticleResponse 객체로 변환한다.
    • 이 코드는 ArticleResponse의 생성자를 호출하여 매핑(mapping)을 수행한다.
  4. .collect(Collectors.toList())

    • 스트림 연산 결과를 다시 List<ArticleResponse>로 수집한다.

3. .stream()의 역할

  • .stream()은 컬렉션(List, Set 등)을 Stream으로 변환한다.
  • 스트림은 데이터 처리 작업(필터링, 매핑, 정렬 등)을 선언적이고 간결하게 수행할 수 있도록 한다.

4. 왜 stream()을 사용하는가?

stream()을 사용하는 주요 이유는 데이터 처리 작업을 간결하고 효율적으로 작성하기 위함이다.

스트림 없이 작성:

List<Article> articles = blogService.findAll();
List<ArticleResponse> responses = new ArrayList<>();
for (Article article : articles) {
    responses.add(new ArticleResponse(article));
}

stream()을 사용하지 않았다면 blogService.findAll()로 모든 Article를 객체를 불러와 변수로 저장한 후 반복문을 사용하여 다시 ArticleResponse객체 타입으로 리스트 형태로 저장하는 것을 볼 수 있다.

스트림을 사용한 코드:

List<ArticleResponse> responses = blogService.findAll()
    .stream()
    .map(ArticleResponse::new)
    .collect(Collectors.toList());
  • 장점: 코드가 더 간결하다.
  • 효율성: 스트림은 병렬 처리와 같은 고급 기능을 쉽게 사용할 수 있다.

4. 결론

.stream()은 컬렉션을 스트림으로 변환하여 데이터 변환과 처리를 더 쉽고 간결하게 할 수 있도록 한다.

위 코드에서는 Article 객체들을 ArticleResponse로 매핑하는 작업을 스트림으로 처리하여 반복문 없이 간단히 작성할 수 있다.

profile
기억하기 싫어서 기록하는 작은 공간

0개의 댓글