ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 : Java 스트림의 map() 메서드 사용
    백엔드 : 서버공부/Spring 2024. 2. 13. 23:13
    728x90

    스프링과 직접적으로 관련있는 글은 아니지만, 제가 자주 사용하게 되는 문법이라 기록해두고자 작성하게 되었습니다.

    오늘 기록할 문법은 map() 메서드입니다.

    Java 8부터는 stream 통해 간편하고 효율적으로 데이터를 처리할 수 있습니다.

    그 중에서도 map() 메서드는 스트림의 각 요소를 다른 요소로 변환하는 데 사용됩니다. 

    사용법

    map() 메서드의 기본적인 사용법은 다음과 같습니다.

    stream.map(element -> 변환식)

     

    여기서 stream은 스트림 객체를 나타내며, element는 스트림의 각 요소를 가리키는 변수입니다.

    변환식은 각 요소를 변환하는 데 사용됩니다. 이 변환식은 람다 표현식으로 표현되며, 다음과 같은 구조를 가집니다.

    (element) -> { 변환 로직 }

    element를 받아서 변환 로직을 수행한 후에 변환된 값을 반환합니다.

     

    아주 간단한 예시를 통해 확인해 보겠습니다. 아래는 map() 메서드를 사용하여 리스트의 각 요소를 제곱하는 예시입니다.

    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    
    public class Main {
        public static void main(String[] args) {
            List<Integer> numbers = Arrays.asList(1,2,3,4,5,6);
    
            List<Integer> squares = numbers.stream()
                                           .map(x -> x * x)
                                           .collect(Collectors.toList());
    
            System.out.println(squares);
        }
    }

    위 예시는 numbers 리스트의 각 요소를 제곱하여 squares 리스트에 저장하는것이 목표입니다.

    이를 위해 map() 메서드는 각 요소를 받아서 제곱 연산을 수행하고, 변환된 값을 새로운 스트림에 포함시킵니다. 이후 collect() 메서드를 사용하여 스트림을 리스트로 변환합니다.

     

    그래서 왜 이 패턴을 스프링 프로젝트에서 많이 쓰게됬냐면, 바로 엔티티 리스트를 DTO 객체 리스트로 변환하기 위함입니다. 

    보통 레포지토리 계층에서의 매서드의 결과는 엔티티 틀래스인데 이를 직접 조작했다가는 여러 문제가 야기될 수 있기때문에.. DTO를 중간에 두는데 이때 entitiy -> DTO 의 작업을 하게됩니다. 

    이 작업때 사용하는 문법이 바로 map입니다.

     

    아래는 간단한 예시입니다.

    import java.util.List;
    import java.util.stream.Collectors;
    
    public class Main {
        public static void main(String[] args) {
            /** 엔티티 객체 리스트
            * finAll()은 전체 맴버를 리스트로 반환하는 매서드, 엔티티 객체로 반환
            */
            List<Entity> entities = memberRepository.finAll();
    
            // DTO로 변환
            List<DTO> dtos = entities.stream()
                                     .map(entity -> new memberDTO(entity.getName, entity.getOld()))
                                     .collect(Collectors.toList());
        }
    }

    위의 예시에서 map() 메서드는 각 엔티티 객체를 받아서 해당하는 DTO 객체로 변환하고 있습니다. 이후 collect() 메서드를 사용하여 DTO 객체들을 리스트로 수집합니다.

    주로 도메인에 해당하는 엔티티클래스들은 setter는 닫아놓고 getter만 열어두는것이 관례이고, 이것이 유지 보수 측면이나 여러 측면에서 유리하기 때문에 이러한 문법을 사용하게 되는 것 같습니다.

Designed by Tistory.