본문 바로가기
스터디/Spring

[Spring] MultiValueMap 의미와 사용법

by zoodi 2024. 4. 21.
728x90

목차

     

     

     

    1. 개요

    코드 작업 중에 MultiValueMap 이라는 인터페이스를 알게되었습니다. MultiValueMap 은 URLScheme을 생성할 때 url 파라미터를 셋팅 할 때 사용하였습니다.

     

    <예시 코드>

    public String generateTaskViewAppScheme(String domainId, String projectId, String taskId) {
    		LinkedMultiValueMap<String, String> params = new LinkedMultiValueMap<>();
    		params.add("domainId", domainId);
    		params.add("projectId", projectId);
    		params.add("taskId", taskId);
    		params.add("version", "18");
    
    		String appUrl = UriComponentsBuilder.newInstance()
    			.scheme(ONEAPP_URL_SCHEMA)
    			.host("task")
    			.path("view")
    			.queryParams(params)
    			.build(true)
    			.toUriString();
    		return appUrl;
    	}

     

     

    2. MultiValueMap 이란?

    MultiValueMap 인터페이스는 자바 api 문서에는 없고 스프링 api 문서에서 찾을 수 있습니다. 즉 자바 내장 인터페이스가 아닌 스프링에서 제공하는 인터페이스입니다.

    스프링 공식문서

     

    MultiValueMap (Spring Framework 6.1.5 API)

    Add all the values of the given list to the current list of values for the given key.

    docs.spring.io

    Extension of the Map interface that stores multiple values. ( Spring api )
    -> 여러 값을 저장하는 맵 인터페이스의 확장

     

    그렇다면 단순 Map 과 어떤 차이가 있을까요?

     

     

    3. Map vs MultiValueMap

    <예시 코드>

    Map<String, Integer> basicMap = new HashMap<>();
    basicMap.put("test",1);
    basicMap.put("test",2);
    
    System.out.println(basicMap);   // test=2
    
    MultiValueMap<String,Integer> multiValueMap = new LinkedMultiValueMap<>();
    multiValueMap.add("test",1);
    multiValueMap.add("test",2);
    		
    System.out.println("multiValueMap = " + multiValueMap);  // test=[1, 2]

     

    공식 문서를 살펴보면 MultiValueMap이 Map 인터페이스를 상속할 때 Value 값을 List로 감싼채로 상속받는 것을 알 수 있습니다. 즉 하나의 key 와 하나 이상의 value로 이루어진 리스트를 쌍으로 받는 것입니다.

     

    일반적으로 Map 을 구현한 HashMap을 중복된 Key 가 존재할 수 없습니다. 따라서 위 예시 코드에서 가장 마지막에 put 한 2가 최종적으로 출력됩니다.

    MultiValueMap 은 put 이 아닌 add 를 하는 경우에 Key 값이 중복되면 해당 Key 값에 List 로 모두 저장됩니다.

    MultiValueMap 또한 put이 가능합니다.

     

    MultiValueMap<String,Integer> multiValueMap = new LinkedMultiValueMap<>();
    // 정수가 담기는 리스트를 생성
    List<Integer> intList = new LinkedList<>();
    // 리스트에 1,2,3 추가
    intList.add(1);
    intList.add(2);
    intList.add(3);
    multiValueMap.put("putTest",intList);
    System.out.println("multiValueMap = " + multiValueMap);  // putTest = [1, 2, 3]

    MultiValueMap의 put 은 value에 List를 요구합니다. 따라서 List를 인자로 한 번에 줄 수 있습니다.

     

    주의)

    MultiValueMap은 스프링 프레임워크에 내장된 인터페이스로 일반 자바환경에서는 사용할 수 없습니다.

     

     


    참고 문서:

    https://velog.io/@nimoh/Spring-MultiValueMap%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

    728x90

    댓글