MVC - Request Mapping


본 카테고리는 스프링 프레임워크를 다룬다.

좀 더 자세한 내용은 아래의 공식 사이트를 참고하자.

참고 스프링 프레임워크 공식 사이트


스프링 MVC 프레임워크의 요청 매핑

웹 애플리케이션을 개발한다는 것은 두 가지의 코드를 작성하는 것이다.

  1. 특정 요청 URL을 처리할 코드
  2. 처리 결과를 HTML과 같은 형식으로 응답하는 코드

첫 번째, 특정 요청 URL을 처리할 코드는 @Controller 어노테이션을 사용한 컨트롤러 클래스를 이용해서 구현한다.

컨트롤러 클래스는 요청 매핑 어노테이션을 사용해 메소드가 처리할 요청 경로를 지정할 수 있다.

요청 매핑 어노테이션은 @RequestMapping, @GetMapping, @PostMapping 등이 있다.

아래 코드는 @GetMapping 어노테이션을 이용해 요청 경로를 처리하는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloController {

@GetMapping("/hello")
public void hello(Model model,
@RequestParam(value = "name", required = false) String name) {
model.addAttribute("greeting", "안녕하세요, " + name);
return "hello";
}
}

요청 매핑 어노테이션을 적용한 메소드를 두 개 이상 정의할 수도 있다.

예를 들어 아래와 같은 경로로 요청이 온다고 가정하자.

위와 같은 경우엔 아래처럼 작성할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class RegisterController {

@RequestMapping("/register/step1")
public String handleStep1() {
// body
}

@PostMapping("/register/step2")
public String handleStep2(
@RequestParam(value = "agree", defaultValue = "false") Boolean agree,
Model model) {
// body
}

@GetMapping("/register/step2")
public String handleStep2Get() {
// body
}

@PostMapping("/register/step3")
public String handleStep3(RegisterRequest regReq) {
// body
}
}

GET과 POST의 구분

스프링 MVC는 별도 설정이 없으면 GET과 POST 방식에 상관없이 @RequestMapping에 지정한 경로와 일치하는 요청을 처리한다.

만약 POST 방식의 요청만 처리하고 싶다면 @PostMapping 어노테이션을 지정해야 한다.

1
2
3
4
@PostMapping("/register/step3")
public String handleStep3Post(RegisterRequest regReq) {
// body
}

위와 같이 설정하면 GET 방식의 /register/step3의 요청은 처리하지 않게된다.

@GetMapping으로 설정하면 반대로 POST 방식의 요청은 처리하지 않는다.

1
2
3
4
5
6
7
8
9
@GetMapping("/register/step3")
public String handleStep3Get(RegisterRequest regReq) {
// body
}

@PostMapping("/register/step3")
public String handleStep3Post(RegisterRequest regReq) {
// body
}

위와 같이 처리하면 같은 경로에 대해 GET방식과 POST방식을 각각 다른 메소드로 처리하게끔 할 수 있다.

요청 파라미터 접근

클라이언트의 요청시 해당 요청의 파라미터를 파악할 수 있는 방법은 두 가지가 있다.

먼저 컨트롤러 메소드에서 HttpServletRequest를 직접 이용하는 방법이다.

아래 예제 코드를 통해 확인할 수 있다.

1
2
3
4
@RequestMapping("/params")
public String getParameterMethod(HttpServletRequest httpServletRequest) {
httpServletRequest.getParameter(PARAMETER_NAME);
}

요청 파라미터에 접근하는 또 다른 방법은 @RequestParam 어노테이션을 사용하는 것이다.

파라미터의 개수가 몇 개 안된다면 해당 어노테이션을 사용해서 간단하게 파악할 수 있다.

이또한 아래 예제 코드를 통해 확인할 수 있다.

1
2
3
4
5
6
@RequestMapping("/params")
public String getParameterMethod(@RequestParam(value = "value", defaultValue = "default") String value) {
if (value == null) {
// body
}
}