[Spring] MultiValueMap이란 무엇인가?

Argonaut·2024년 12월 9일
post-thumbnail

0. 개요


Spring boot에 대해 공부를 하던 중 MultiValueMap이라는 인터페이스에 대해 알게되었고, 일반적인 Map과 그 차이를 알아보도록 하자.


1. MultiValueMap의 정의와 개념


Spring Framework에서 제공하는 인터페이스 MultiValueMap은 하나의 키에 여러 값을 매핑할 수 있는 구조를 제공합니다.
주로 HTTP 요청/응답 데이터와 같은 다중 값을 처리할 때 사용됨.


MultiValueMap의 주요 특징

  • MultiValueMap 인터페이스

    public interface MultiValueMap<K, V> extends Map<K, List<V>> {
        void add(K key, V value);
        void addAll(K key, List<? extends V> values);
        void addAll(MultiValueMap<K, V> values);
        void set(K key, V value);
        void setAll(Map<K, V> values);
        Map<K, V> toSingleValueMap();
    }
  • 특징

  1. 키와 다중 값의 매핑
    위 인터페이스를 보면 MultiValueMap은 Map<K, List>형태를 기반으로 설계가 됨.

  2. 값 순서 보장
    값은 List에 저장되므로 입력된 순서가 유지됨.

  3. 중복 허용
    동일한 키에 중복된 값 추가 가능함.

  4. 다양한 유틸리티 메서드 제공
    일반 Map과는 달리, 다중 값 관리에 특화된 메서드(add, addAll, set 등)가 포함됨.


MultiValueMap의 주요 메소드

  1. add(K key, V value)
    특정 키에 값을 추가하고, 키가 이미 존재하면 기존 리스트에 값을 추가

     MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
      map.add("key1", "value1");
      map.add("key1", "value2");
      System.out.println(map.get("key1")); // 출력: [value1, value2]
  2. addAll(K key, List<? extends V> values)
    특정 키에 여러 값을 한 번에 추가

    map.addAll("key1", List.of("value3", "value4"));
    System.out.println(map.get("key1")); // 출력: [value1, value2, value3, value4]
  3. set(K key, V value)
    특정 키에 값을 변경. 이때 기존 저장된 모든 값은 삭제되고 새 값을 추가

    map.set("key1", "newValue");
    System.out.println(map.get("key1")); // 출력: [newValue]
  4. setAll(Map<K, V> values)
    여러 키-값 쌍을 한 번에 설정. 이때 기존 저장된 모든 값은 삭제되고 새 값을 추가

    map.setAll(Map.of("key1", "value1", "key2", "value2"));
    System.out.println(map); // 출력: {key1=[value1], key2=[value2]}
  5. toSingleValueMap()
    첫 번째 값만 포함하는 단일 값의 Map을 반환. 각 키별로 하나의 값만 남김

    Map<String, String> singleValueMap = map.toSingleValueMap();
    System.out.println(singleValueMap); // 출력: {key1=value1, key2=value2}

MultiValueMap의 주요 구현체

  1. LinkedMultiValueMap
  • 가장 일반적으로 사용하는 구현체
  • 내부적으로 LinkedHashMapArrayList를 사용하여 키와 값을 저장
  • 순서가 보장되며, 값이 중복 가능
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("key1", "value1");
map.add("key1", "value2");
System.out.println(map); // 출력: {key1=[value1, value2]}
  1. MultiValueMapAdapter
  • 기존 Map<K, List>를 감싸서 MultiValueMap처럼 사용할 수 있도록 도와주는 어댑터
Map<String, List<String>> baseMap = new HashMap<>();
MultiValueMap<String, String> map = new MultiValueMapAdapter<>(baseMap);
map.add("key1", "value1");
System.out.println(map.get("key1")); // 출력: [value1]

MultiValueMap의 문제점

  1. 값 타입 고정

    값이 반드시 List로 저장되어 Set이나 다른 Collection이 필요할 경우 직접 변환해야함

  2. 메모리 사용 증가

    키 별로 List가 추가적으로 생성되기에 일반적인 Map에 비해 메모리 사용량이 높음.


2. Apache Commons Collections의 MultiValueMap


앞서 srpingframework 속 MultiValueMap를 알아보았는데, 이번에는 Apache Commons Collections의 MultiValueMap를 알아보고자 한다.


주요 특징

  • org.apache.commons.collections4.MultiValueMap은 Apache Commons Collections 라이브러리에서 제공하는 클래스로, 동일한 키에 여러 값을 저장하는 자료 구조이다.

  • Map<K, Collection> 형태로 동작

  • 기본적으로 값을 List 또는 Collection으로 저장하지만, 필요에 따라 다른 컬렉션을 사용 가능

예제

import org.apache.commons.collections4.MultiValueMap;
public class ApacheMultiValueMapExample {
    public static void main(String[] args) {
        // MultiValueMap 생성
        MultiValueMap<String, String> map = new MultiValueMap<>();
        // 값 추가
        map.put("key1", "value1");
        map.put("key1", "value2");
        // 값 조회
        System.out.println(map.get("key1")); // 출력: [value1, value2]
    }
}

Spring VS Apache

  • 공통점

    1. 하나의 키에 여러 값을 매핑할 수 있다.

    2. 키-값 형태의 데이터 구조를 다중 값으로 확장하는 데 사용된다.

  • 주요 차이점

    1. 설계 목적

      Spring MultiValueMapHTTP 요청/응답 데이터를 처리하는 데 최적화
      Apache MultiValueMap은 일반적인 다중 값 처리를 위한 범용적인 구조

    2. 값 저장 방식

      Spring의 구현체는 항상 List를 사용
      Apache의 구현체는 Collection을 사용하며, 이를 Set, List 등으로 변경 가능

    3. 라이브러리 의존성

      Spring MultiValueMap은 Spring Framework에 포함되어 추가 의존성 없이 사용 가능
      Apache MultiValueMap은 Apache Commons Collections 라이브러리를 의존성이 필요

요약

특징Spring MultiValueMapApache Commons Collections MultiValueMap
제공 라이브러리org.springframework.util.MultiValueMaporg.apache.commons.collections4.MultiValueMap
설계 목적HTTP 요청/응답 데이터 관리, 파라미터 및 헤더 처리일반 데이터 처리, 다중 값 매핑 및 관리
기본 구현체LinkedMultiValueMapMultiValueMap (기본적으로 List 기반)
값 저장 방식항상 List기본적으로 Collection (변경 가능)
주요 메서드add, set, toSingleValueMap 등 유틸리티 메서드 제공일반적인 Map 메서드 제공 (특화된 유틸리티 없음)
주요 용도HTTP 요청 파라미터, 헤더 및 폼 데이터 관리태그 관리, 이벤트 시스템, 일반적인 다중 값 처리
순서 보장 여부순서 보장 (LinkedHashMap 기반)순서 보장 (LinkedHashMap 기반)
의존성 추가 필요 여부Spring Framework 포함Apache Commons Collections 별도 추가 필요

3. 결론


Spring의 MultiValueMap이 HTTP 요청/응답 데이터 및 다중 값 매핑을 효율적으로 처리하기 위해 설계된 간단하고 강력한 유틸리티라면,
Apache의 MultiValueMap은 일반적인 다중 값 매핑에 유연한 데이터 구조라고 할 수 있다.

@참고문헌
1) https://programmerjkr.tistory.com/23
2) https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/MultiValueMap.html
3) https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html
4) https://good-or-bad.tistory.com/57

profile
성장하는 개발자가 되기 위한 기록 일지

0개의 댓글