Spring/문법

MultiValueMap<K, V>

가지코딩 2025. 5. 3. 20:46

MultiValueMap이란?

  • Spring에서 제공하는 인터페이스로, 하나의 키에 여러 개의 값을 저장할 수 있는 Map 자료구조이다.
  • 일반적인 Map<K, V>는 하나의 키에 하나의 값만 매핑할 수 있지만,
  • MultiValueMap<K, V>는 하나의 키에 List<V> 형태의 여러 값을 매핑할 수 있다.

주로 HTTP 쿼리 파라미터, Form 데이터, 헤더 정보 등에서 다중 값 처리가 필요할 때 사용된다.

 

MultiValueMap은 Spring Framework에서 제공하는 자료구조이므로, Spring 환경에서만 기본적으로 사용 가능하다.

  • org.springframework.util 패키지에 속해 있다.

주요 메서드

 

add(K key, V value)

  • 주어진 키에 값을 추가한다. 
  • 같은 키에 대해 여러 값을 추가할 수 있다.
MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
multiValueMap.add("key1", "value1");
multiValueMap.add("key1", "value2");
multiValueMap.add("key2", "value3");

System.out.println(multiValueMap); 
// 출력: {key1=[value1, value2], key2=[value3]}

 

 

set(K key, V value)

  • 주어진 키에 대해 값을 하나만 설정한다.
  • 기존 값이 있으면 덮어쓰고, 새로운 값으로 설정된다.
multiValueMap.set("key1", "newValue");
System.out.println(multiValueMap);
// 출력: {key1=[newValue], key2=[value3]}

 

 

getFirst(K key)

  • 특정 키에 대해 첫 번째 값을 반환한다.
  • 만약 키가 없으면 null을 반환한다.
List<String> values = multiValueMap.getFirst("key1");
System.out.println(values); 
// 출력: value1

 

 

get(Object key)

  • 주어진 키에 해당하는 모든 값을 리스트로 반환한다.
  • 만약 키가 없으면 null을 반환한다.
List<String> values = multiValueMap.get("key1");
System.out.println(values); 
// 출력: [value1, value2]

 

 

remove(Object key, Object value)

  • 특정 키와 값을 매핑에서 삭제한다.
  • 주어진 값이 여러 개 있을 경우, 해당 값만 삭제합니다. 삭제 후에는 해당 값이 더 이상 존재하지 않는다.
multiValueMap.remove("key1", "value1");
System.out.println(multiValueMap);
// 출력: {key1=[value2], key2=[value3]}

 

 

containsKey(Object key)

  • 주어진 키가 MultiValueMap에 포함되어 있는지 확인한다.
boolean containsKey = multiValueMap.containsKey("key1");
System.out.println(containsKey); 
// 출력: true

 

 

keySet()

  • MultiValueMap에 있는 모든 키의 집합을 반환한다.
Set<String> keys = multiValueMap.keySet();
System.out.println(keys);
// 출력: [key1, key2]

 

 

values()

  • MultiValueMap에 있는 모든 값들의 집합을 반환한다.
Collection<List<String>> allValues = multiValueMap.values();
System.out.println(allValues);
// 출력: [[value2], [value3]]

 

 

clear()

  • MultiValueMap의 모든 데이터를 삭제한다.
multiValueMap.clear();
System.out.println(multiValueMap);
// 출력: {}

활용 예시

RestTemplate 쿼리 파라미터에 사용

UriComponentsBuilder builder = UriComponentsBuilder
    .fromHttpUrl("https://example.com/search");

MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
queryParams.add("tag", "spring");
queryParams.add("tag", "boot");

builder.queryParams(queryParams);

URI uri = builder.build().encode().toUri();
System.out.println(uri);
// 출력: https://example.com/search?tag=spring&tag=boot

 

 

@RequestParam MultiValueMap 사용

@GetMapping("/search")
public String search(@RequestParam MultiValueMap<String, String> params) {
    List<String> tags = params.get("tag"); // 여러 값 받을 수 있음
    return "Tags: " + tags;
}

 

 

활용 팁

 

  • MultiValueMap은 값의 순서를 유지하므로, 순서가 중요한 요청에서 유리하다.
  • 값이 없을 때 get() 호출 시 null 또는 빈 리스트가 올 수 있으므로 NPE에 주의한다.