JAVA/SPRING

@RequestMapping의 value 패턴.

gracelove91 2019. 10. 19. 23:39
  • @RequestMapping("/hello")
    • hello 주소 요청만 매핑된다.
  • @RequestMapping("/hello?")
    • hello 뒤 한글자만 붙어야 매핑된다.
  • @RequestMapping("/hello/*")
    • hello 뒤 / 이후 하나의 뎁스만 매핑된다.
  • @RequestMapping("/hello/**")
    • hello 뒤 / 이후 여러개의 뎁스가 매핑된다.
  • @RequestMapping("/hello/[a-z]+")
    • hello 뒤 / 이후 정규표현식이 매핑된다.

SampleController.java


@Controller
@RequestMapping
public class SampleController {

    @RequestMapping(value = {"/hello", "/hi"})
    @ResponseBody
    public String hello() {
        return "hello";
    }

    @RequestMapping("/hello?")
    @ResponseBody
    public String helloMustBeBehindOneChar() {
        return "hello one char";
    }

    @RequestMapping("/hello/*")
    @ResponseBody
    public String helloMustBeBehindOneDepth() {
        return "hello one depth";
    }

    @RequestMapping("/hello/**")
    @ResponseBody
    public String helloMustBeBehindOverOneDepth() {
        return "hello over one depth";
    }

    @RequestMapping("/hello/{name:[a-z]+}")
    @ResponseBody
    public String helloPathVariableRegx(@PathVariable String name) {
        return "hello regx " + name;
    }
}

SampleControllerTest.java


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

    @Autowired
    private MockMvc mockMvc;

    /**
     *
     * 리퀘스트 매핑의 주소는 @RequestMapping(value = {"/hello", "/hi"}) 다.
     */
    @Test
    public void helloTest() throws Exception {
        mockMvc.perform(get("/hello"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().string("hello"))
                .andExpect(handler().method(SampleController.class.getMethod("hello")));
    }

    /**
     *
     * 리퀘스트매핑의 주소는 @RequestMapping("/hello?") 다.
     */
    @Test
    public void helloMustBeBehindOneCharTest() throws Exception {
        mockMvc.perform(get("/helloa"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().string("hello one char"))
                .andExpect(handler().method(SampleController.class.getMethod("helloMustBeBehindOneChar")));
    }

    /**
     *
     * 컨트롤러의 @RequestMapping("/hello?") 는 hello 뒤 한 글자만 매핑된다.
     */
    @Test
    public void helloMustBeBehindOneCharTest_두글자이상_expect_not_found() throws Exception {
        mockMvc.perform(get("/helloaa"))
                .andDo(print())
                .andExpect(status().isNotFound());
    }


    /**
     *리퀘스트매핑의 주소는 @RequestMapping("/hello/*") 다.
     *
     */
    @Test
    public void helloMustBeBehindOneDepth() throws Exception {
        mockMvc.perform((get("/hello/1")))
                .andDo(print())
                .andExpect(handler().methodName("helloMustBeBehindOneDepth"));
    }

    /**
     *
     * 리퀘스트매핑의 주소는 @RequestMapping("/hello/**")다.
     */
    @Test
    public void helloMustBeBehindOverOneDepth() throws Exception {
        mockMvc.perform((get("/hello/1/2")))
                .andDo(print())
                .andExpect(handler().methodName("helloMustBeBehindOverOneDepth"));
    }

    /**
     *
     * 리퀘스트매핑의 주소는 @RequestMapping("/hello/{name:[a-z]+}") 다.
     * 정규표현식 사용한다.
     */
    @Test
    public void helloRegx() throws Exception {
        mockMvc.perform((get("/hello/eunmo")))
                .andDo(print())
                .andExpect(handler().methodName("helloPathVariableRegx"))
                .andExpect(content().string("hello regx eunmo"));
    }

}