핸들러 메소드에서 인자로 받는 클래스들에 대해 조금 더 구체적으로 알아보자. 그 첫번째는 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
}
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;
}
}
'Study > Spring' 카테고리의 다른 글
Servlet programming 처리 과정 (0) | 2022.06.20 |
---|---|
데코레이터 패턴, 프록시패턴 그리고 다이나믹 프록시 (0) | 2022.04.13 |
[스프링 웹 MVC 활용] 02. 핸들러 메소드의 Argument와 Return 타입 (0) | 2022.03.01 |
[스프링 웹 MVC 활용] 01. HTTP Request 맵핑하기 (0) | 2022.03.01 |
[스프링 웹 MVC 설정] 01. @EnableWebMvc와 WebMvcConfigurer (0) | 2022.03.01 |