Christmas Pikachu 스프링 부트에서 데이터 그룹화하기: groupBy() 활용법
개발일지/스프링

스프링 부트에서 데이터 그룹화하기: groupBy() 활용법

ZI_CO 2024. 11. 1.

자바 스프링 부트를 이용하여 데이터를 처리하는 과정에서도 자바스크립트와 마찬가지로 데이터를

특정 기준에 따라 그룹화하는 작업이 자주 필요합니다. 이번 포스팅에서는 자바 스프링 부트에서 데이터를

효과적으로 그룹화하는 방법을 소개하겠습니다.

특히 최신 자바 버전에서 제공하는 Stream API의 Collectors.groupingBy()를 활용하여 간단하고 가독성

높은 코드를 작성하는 방법에 대해 알아보겠습니다.

기존 데이터 그룹화 방법

우선 데이터를 그룹화하는 작업을 하기 위해 반복문과 조건문을 이용한 기존 방법은 코드가 길고

유지보수가 어렵다는 단점이 있었습니다. 예를 들어, 여러 사용자의 이름, 나이, 국가 정보를 가진 리스트가 있을 때,

국가별로 사용자를 분류하고 싶다고 가정해봅시다.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class GroupingExample {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        users.add(new User("John", 25, "US"));
        users.add(new User("Jane", 30, "KR"));
        users.add(new User("Robin", 22, "CA"));
        users.add(new User("Doe", 13, "US"));
        users.add(new User("Smith", 20, "KR"));

        Map<String, List<User>> usersByCountry = new HashMap<>();

        for (User user : users) {
            usersByCountry
                .computeIfAbsent(user.getCountry(), k -> new ArrayList<>())
                .add(user);
        }

        System.out.println(usersByCountry);
    }
}

class User {
    private String name;
    private int age;
    private String country;

    public User(String name, int age, String country) {
        this.name = name;
        this.age = age;
        this.country = country;
    }

    public String getCountry() {
        return country;
    }

    @Override
    public String toString() {
        return "User{" + "name='" + name + '\'' + ", age=" + age + ", country='" + country + '\'' + '}';
    }
}

 

위 코드는 국가별로 사용자 정보를 그룹화하지만, 코드가 복잡하고 반복적인 패턴이 많아 가독성이 떨어집니다.

Collectors.groupingBy()를 이용한 데이터 그룹화

Java 8 이상에서는 Stream API와 Collectors.groupingBy()를 이용하여 더 간결하고 이해하기 쉬운 코드로

데이터를 그룹화할 수 있습니다.

다음은 같은 작업을 groupingBy()를 이용하여 간단하게 해결하는 방법입니다.

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class GroupingByExample {
    public static void main(String[] args) {
        List<User> users = List.of(
                new User("John", 25, "US"),
                new User("Jane", 30, "KR"),
                new User("Robin", 22, "CA"),
                new User("Doe", 13, "US"),
                new User("Smith", 20, "KR")
        );

        Map<String, List<User>> usersByCountry = users.stream()
                .collect(Collectors.groupingBy(User::getCountry));

        System.out.println(usersByCountry);
    }
}

 

Collectors.groupingBy()를 사용하면 간결하게 데이터를 그룹화할 수 있으며, 코드의 가독성도 크게 향상됩니다.

이 메서드는 특정 기준으로 데이터를 쉽게 분류할 수 있는 유용한 도구로, 데이터를 효율적으로 처리하고

유지보수하기 쉬운 코드를 작성하는 데 큰 도움이 됩니다.

다양한 기준으로 그룹화하기

groupingBy() 메서드는 분류 기준이 되는 람다식을 자유롭게 정의할 수 있어, 여러 가지 기준으로 데이터를

그룹화할 수 있습니다. 예를 들어, 나이를 기준으로 "YOUNG"과 "OLD"로 사용자를 분류할 수 있습니다.

import java.util.Map;

public class AdvancedGroupingExample {
    public static void main(String[] args) {
        List<User> users = List.of(
                new User("John", 25, "US"),
                new User("Jane", 30, "KR"),
                new User("Robin", 22, "CA"),
                new User("Doe", 13, "US"),
                new User("Smith", 20, "KR")
        );

        Map<String, List<User>> usersByAgeGroup = users.stream()
                .collect(Collectors.groupingBy(user -> user.getAge() < 25 ? "YOUNG" : "OLD"));

        System.out.println(usersByAgeGroup);
    }
}

 

이 코드는 나이를 기준으로 "YOUNG"과 "OLD"로 사용자를 분류하여 데이터를 그룹화합니다. 이러한 방식으로 다양한 기준을 적용해 데이터를 쉽게 그룹화할 수 있습니다.

댓글