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에 주의한다.
'Spring > 문법' 카테고리의 다른 글
JSON 포맷 변경하기: Jackson 설정 커스터마이징 (1) | 2025.05.23 |
---|---|
Spring Boot Logger 사용법 – SLF4J & Logback (0) | 2025.05.23 |
Spring Boot 환경별 설정 관리하기 – application-{profile}.properties (0) | 2025.05.23 |
다중 데이터소스 설정 하기 (feat. DB 여러 개 연결하기) (0) | 2025.05.12 |
정적 팩토리 메서드 (Static Factory Method) (0) | 2025.05.09 |