
스프링을 사용하여 간단한 블로그 CRUD API를 개발하면서 공부하는 중에 다음의 코드를 보고 의문점이 들었다.
List<ArticleResponse> articles = blogService.findAll()
.stream()
.map(ArticleResponse::new)
.collect(Collectors.toList());
이렇게 코드를 작성하는 이유가 무었일까? 그래서 당장 GPT한테로 달려가서 물어보았다.
우선 나의 의문점을 가져다 준 코드부터 살펴보자. 각 코드가 의미하는 것은 다음과 같다.
blogService.findAll()
List<Article>와 같은 컬렉션을 반환한다. 예를 들어, 데이터베이스에서 모든 Article 객체를 가져오는 메서드일 수 있다..stream()
findAll()이 반환한 List<Article>을 Stream<Article>으로 변환한다..map(ArticleResponse::new)
Article 객체를 ArticleResponse 객체로 변환한다.ArticleResponse의 생성자를 호출하여 매핑(mapping)을 수행한다..collect(Collectors.toList())
List<ArticleResponse>로 수집한다..stream()의 역할.stream()은 컬렉션(List, Set 등)을 Stream으로 변환한다.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());
.stream()은 컬렉션을 스트림으로 변환하여 데이터 변환과 처리를 더 쉽고 간결하게 할 수 있도록 한다.
위 코드에서는 Article 객체들을 ArticleResponse로 매핑하는 작업을 스트림으로 처리하여 반복문 없이 간단히 작성할 수 있다.