
Spring boot에 대해 공부를 하던 중 MultiValueMap이라는 인터페이스에 대해 알게되었고, 일반적인 Map과 그 차이를 알아보도록 하자.
Spring Framework에서 제공하는 인터페이스 MultiValueMap은 하나의 키에 여러 값을 매핑할 수 있는 구조를 제공합니다.
주로 HTTP 요청/응답 데이터와 같은 다중 값을 처리할 때 사용됨.
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(); }
특징
키와 다중 값의 매핑
위 인터페이스를 보면 MultiValueMap은 Map<K, List>형태를 기반으로 설계가 됨.
값 순서 보장
값은 List에 저장되므로 입력된 순서가 유지됨.
중복 허용
동일한 키에 중복된 값 추가 가능함.
다양한 유틸리티 메서드 제공
일반 Map과는 달리, 다중 값 관리에 특화된 메서드(add, addAll, set 등)가 포함됨.
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]
addAll(K key, List<? extends V> values)
특정 키에 여러 값을 한 번에 추가
map.addAll("key1", List.of("value3", "value4")); System.out.println(map.get("key1")); // 출력: [value1, value2, value3, value4]
set(K key, V value)
특정 키에 값을 변경. 이때 기존 저장된 모든 값은 삭제되고 새 값을 추가
map.set("key1", "newValue"); System.out.println(map.get("key1")); // 출력: [newValue]
setAll(Map<K, V> values)
여러 키-값 쌍을 한 번에 설정. 이때 기존 저장된 모든 값은 삭제되고 새 값을 추가
map.setAll(Map.of("key1", "value1", "key2", "value2")); System.out.println(map); // 출력: {key1=[value1], key2=[value2]}
toSingleValueMap()
첫 번째 값만 포함하는 단일 값의 Map을 반환. 각 키별로 하나의 값만 남김
Map<String, String> singleValueMap = map.toSingleValueMap(); System.out.println(singleValueMap); // 출력: {key1=value1, key2=value2}
LinkedMultiValueMapMultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("key1", "value1"); map.add("key1", "value2"); System.out.println(map); // 출력: {key1=[value1, value2]}
MultiValueMapAdapterMap<String, List<String>> baseMap = new HashMap<>(); MultiValueMap<String, String> map = new MultiValueMapAdapter<>(baseMap); map.add("key1", "value1"); System.out.println(map.get("key1")); // 출력: [value1]
값 타입 고정
값이 반드시 List로 저장되어 Set이나 다른 Collection이 필요할 경우 직접 변환해야함
메모리 사용 증가
키 별로 List가 추가적으로 생성되기에 일반적인 Map에 비해 메모리 사용량이 높음.
앞서 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 MultiValueMap은 HTTP 요청/응답 데이터를 처리하는 데 최적화
Apache MultiValueMap은 일반적인 다중 값 처리를 위한 범용적인 구조
값 저장 방식
Spring의 구현체는 항상 List를 사용
Apache의 구현체는 Collection을 사용하며, 이를 Set, List 등으로 변경 가능
라이브러리 의존성
Spring
MultiValueMap은 Spring Framework에 포함되어 추가 의존성 없이 사용 가능
ApacheMultiValueMap은 Apache Commons Collections 라이브러리를 의존성이 필요
| 특징 | Spring MultiValueMap | Apache Commons Collections MultiValueMap |
|---|---|---|
| 제공 라이브러리 | org.springframework.util.MultiValueMap | org.apache.commons.collections4.MultiValueMap |
| 설계 목적 | HTTP 요청/응답 데이터 관리, 파라미터 및 헤더 처리 | 일반 데이터 처리, 다중 값 매핑 및 관리 |
| 기본 구현체 | LinkedMultiValueMap | MultiValueMap (기본적으로 List 기반) |
| 값 저장 방식 | 항상 List | 기본적으로 Collection (변경 가능) |
| 주요 메서드 | add, set, toSingleValueMap 등 유틸리티 메서드 제공 | 일반적인 Map 메서드 제공 (특화된 유틸리티 없음) |
| 주요 용도 | HTTP 요청 파라미터, 헤더 및 폼 데이터 관리 | 태그 관리, 이벤트 시스템, 일반적인 다중 값 처리 |
| 순서 보장 여부 | 순서 보장 (LinkedHashMap 기반) | 순서 보장 (LinkedHashMap 기반) |
| 의존성 추가 필요 여부 | Spring Framework 포함 | Apache Commons Collections 별도 추가 필요 |
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