Study/Spring

[스프링 웹 MVC 활용] 03. URI 패턴 및 요청 매개변수(단순 타입)

going.yoon 2022. 3. 1. 21:48

핸들러 메소드에서 인자로 받는 클래스들에 대해 조금 더 구체적으로 알아보자. 그 첫번째는 URI 패턴의 일부를 핸들러 메소드의 인자로 받는 방법이다.

 

I. URI 패턴

- @PathVariable, @MatrixVariable로 클라이언트가 요청을 보낼 때 uri에 매개변수를 넣어서 요청할 수 있다.

// # 1. testCode
@RunWith(SpringRunner.class)
@WebMvcTest
public class SampleControllerTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    public void helloTest() throws Exception { // 테스트를 할 때는 꼭 void형식으로 해줘야 한다.
        mockMvc.perform(get("/events/1;name=gayoung")) 
        				// #1.1 uri에 pathVariable로 보낼 1과 MatrixVariable로 보낼 name=gayoung셋팅
                        .andDo(print())
                        .andExpect(status().isOk())
                        .andExpect(jsonPath("id").value(1))
        ;
    }

}


// #2. Controller
@Controller
public class SampleController {

    @GetMapping("/events/{id}")
    @ResponseBody
    public Event events(@PathVariable Integer id , @MatrixVariable String name){
        Event event = new Event();
        event.setId(id);
        return event;
    }

}

단, 현재 MatrixVariable을 사용하기 위해서는 WebConfig 파일을 따로 설정을 해주어야 한다. ; 을 강제로 없애면서 MatrixVariable로 인식해주지 못하기 때문이다. config file 설정은 아래와 같이 해주면 된다.

 

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer){
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setRemoveSemicolonContent(false); // semicolon remove false
        configurer.setUrlPathHelper(urlPathHelper);
    }

}

 

Matrix Variable은 아래처럼도 사용이 가능하다.

// GET /owners/42;q=11/pets/21;q=22

@GetMapping("/owners/{ownerId}/pets/{petId}")
public void findPet(
        @MatrixVariable(name="q", pathVar="ownerId") int q1,
        @MatrixVariable(name="q", pathVar="petId") int q2) {

    // q1 == 11
    // q2 == 22
}

출처 : https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-matrix-variables

 

Web on Servlet Stack

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more com

docs.spring.io

 

 

 

II. 요청 매개변수 (단순 타입)

- Request의 형태가 쿼리 파라미터로 들어오거나, Form 데이터로 들어올 때는 @RequestParam으로 받아서 가뿐하게 처리하면 된다.

@RunWith(SpringRunner.class) // test 전용 ApplicationContext를 제공
@WebMvcTest
public class SampleControllerTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    public void helloTest() throws Exception { 
        mockMvc.perform(post("/events?name=gayoung"))
        // #1.  이런식으로 request를 보내도 되고
                        .andDo(print())
                        .andExpect(status().isOk())
                        .andExpect(jsonPath("name").value("gayoung"))
        ;
    }


    @Test
    public void helloTestParam() throws Exception {
        mockMvc.perform(post("/events").param("name", "gayoung")) 
          // #2. parameter 형식으로 넘겨도 된다.
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("name").value("gayoung"))
        ;
    }

}


@Controller
public class SampleController {

    @PostMapping("/events")
    @ResponseBody
    public Event events(@RequestParam String name){ 
    	// #3. 이때 @RequestParam Integer id를 넣어주면 에러 발생한다. required = true가 기본값이기 때문에 요청시 넣어줘야 함.
        Event event = new Event();
        event.setName(name);
        return event;
    }

}