본문으로 바로가기

[Spring MVC] URI 패턴

category Spring/SpringMVC 2019. 7. 19. 08:43

URI란? Uniform Resource Identifier 의 줄임말로서 통합 자원 식별자라고 부릅니다.

URI 대한 내용은 https://searchmicroservices.techtarget.com/definition/URI-Uniform-Resource-Identifier 참고하세요

 

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping(value="/URI")
public class SampleController {

	@GetMapping(value = "/normal")
	@ResponseBody
	public String getNormal() {
		return "normal";
	}
	
	@GetMapping(value = "/normal/*")
	@ResponseBody
	public String getNormalAsta() {
		return "normalAsta";
	}
	
}

URI 요청을 할때 여러가지 패턴을 사용할수 있습니다.

? : 한글자 (~/URI/normal/? => ~/URI/normal/1)

* : 여러글자 (~/URI/normal/* => ~/URI/normal/testsetse) 

** : 여러 패스 ~/URI/normal/** => ~/URI/normal/tests/setest/testes~~)

 

이외에도 정규식도 가능하며 만약 URI 패턴이 중복이 될수 있다면 더 구체적으로 맵핑되는 핸들러를 선택합니다.

 

package com.example.demo;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.handler;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

@RunWith(SpringRunner.class)
@WebMvcTest
public class SampleControllerTest {

	@Autowired
	MockMvc mockMvc;
	
	@Test
	public void testURI() throws Exception{
		mockMvc.perform(get("/URI/normal"))
		       .andDo(print())
		       .andExpect(content().string("normal"))
		       .andExpect(handler().handlerType(SampleController.class))
		       .andExpect(handler().methodName("getNormal"));
	
		mockMvc.perform(get("/URI/normal/asta"))
		       .andDo(print())
		       .andExpect(content().string("normalAsta"))
		       .andExpect(handler().handlerType(SampleController.class))
		       .andExpect(handler().methodName("getNormalAsta"));
	}
	
}

 

* 기본적으로 스프링은 URI 확장자 맵핑을 지원합니다.

 - 확장자 맵핑이란? /URI/normal 이라고 했을때 default로 /URI/normal.*도 인식 가능함

 - 하지만 이 기능은 권장하지 않습니다. RFD Attack 등의 이유로 보안상의 이슈가 생길수 있습니다.

 - 스프링부트에서는 기본적으로 사용하지 않도록 설정되어 있습니다.

 

by 백기선..스프링 웹 MVC