웹, 앱 개발/Spring

@SpringQueryMap란? & 사용 예시

나아가는중 2023. 3. 30. 23:16
반응형

@SpringQueryMap 란?

SpringQueryMap은 Spring Cloud OpenFeign 라이브러리에서 제공하는 어노테이션 중 하나입니다.

 

이 어노테이션은 Feign 클라이언트에서 GET 요청을 보낼 때, Query Parameter를 맵 형태로 전달하기 위해 사용됩니다.

 

@RequestParam과 유사한 역활을 수행하지만, 여러 개의 파라미터가 아닌 단일 맵 형태로 전달할 수 있다는 점이 다릅니다.

 


예를 들어, @RequestParam을 사용하여 다음과 같이 Query Parameter를 전달할 수 있습니다.

@RequestParam 사용 예시

    @GetMapping("/request_param")
    fun requestParam(
        @RequestParam("id") id: Int,
        @RequestParam("name") name: String,
    ) : String {
        return "${id} ${name}"
    }

 


하지만, SpringQueryMap을 사용하면 다음과 같이 맵 형태로 Query Parameter를 전달할 수 있습니다.

@SpringQueryMap 사용 예시

    @GetMapping("/spring_query_map")
    fun springQueryMap(
        @SpringQueryMap queryParams: MyQueryParam,
    ) : String {
        return "${queryParams.id} ${queryParams.name}"
    }
    
    data class MyQueryParam(
        val id: Int,
        val name: String,
    )

 

 


테스트 코드

@ExtendWith(SpringExtension::class)
@WebMvcTest(SpringQueryMapController::class)
@AutoConfigureMockMvc
class SpringQueryMapControllerTest {

    @Autowired
    private lateinit var mockMvc: MockMvc

    companion object {
        const val id = "1"
        const val name = "test"

        val queryParams = LinkedMultiValueMap(mapOf(
            "id" to listOf(id),
            "name" to listOf(name)
        ))

        const val PREFIX = "/spring_query_map"
    }


    @Test
    fun requestParamTest() {
        val result = mockMvc.perform(MockMvcRequestBuilders.get("$PREFIX/request_param")
            .queryParams(queryParams)
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(MockMvcResultMatchers.status().isOk)
            .andReturn()

        assertEquals("${id} ${name}", result.response.contentAsString)
    }

    @Test
    fun springQueryMapTest() {
        val result = mockMvc.perform(MockMvcRequestBuilders.get("$PREFIX/spring_query_map")
            .queryParams(queryParams)
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(MockMvcResultMatchers.status().isOk)
            .andReturn()

        assertEquals("${id} ${name}", result.response.contentAsString)
    }
}

 

반응형