@RequestMapping을 이용한 경로 지정
@RequestMapping 어노테이션의 값으로 경로를 지정한다. 스프링 MVC는 웹 브라우저의 요청이 들어오면 @RequestMapping의 값을 이용해서 요청을 처리할 컨트롤러 메서드를 결정한다.
@Controller
public class EventController {
@RequestMapping("/event/list")
public String list(Model model) {
return "event/list";
}
// 이하 생략
...
}
위 코드에서 @RequestMapping 어노테이션의 값을 "/event/list"로 지정했는데, 실제로 어떤 URL을 처리하는지는 서블릿 매핑의 URL 패턴에 따라 달라진다.
| 컨텍스트 경로 | DispatcherServlet 매핑 URL 패턴 | 실제 URL |
| /mypage | / | http://host:port/mypage/event/list |
| /mypage | /main/* | http://host:port/mypage/main/event/list |
다음과 같이 컨트롤러 클래스와 메서드에 @RequestMapping을 함께 적용할 수도 있다. 컨트롤러와 메서드에 @RequestMapping 어노테이션을 모두 사용하면, 클래스에 적용한 값과 메서드에 적용한 값을 조합해서 매핑될 경로를 결정한다.
@Controller
@RequestMapping("/event")
public class EventController {
@RequestMapping("/list")
public String list(Model model) {
return "event/list";
}
@RequestMapping("/home")
public String home(Model model) {
return "event/home";
}
// 이하 생략
...
}
@RequestMapping 어노테이션은 method 속성을 이용해서 메서드에서 처리할 전송 방식을 지정할 수 있다. 또한 @RequestMapping이 동일한 경로를 갖고 method 속성만 다를 수 있다. 이 경우 다음과 같이 클래스의 @RequestMapping에 경로를 지정하고 메서드의 @RequestMapping에는 method 속성만 지정해도 된다.
@Controller
@RequestMapping("/member/regist")
public class RegistrationController {
@RequestMapping(method = RequestMethod.GET)
public String form() {
return "member/registrationForm";
}
@RequestMapping(method = RequestMethod.POST)
public String regist(...) {
return "member/registered";
}
}
RESTful API의 증가와 함께 다음과 같이 요청 파라미터를 사용하지 않고 URL 자체를 이용해서 게시글 링크를 표현하는 경우도 많아졌다.
- http://host/articles/10
- https://jaedam.tistory.com/89
@PathVariable 어노테이션을 사용하면 위와 같은 URL을 쉽게 처리할 수 있다. @RequestMapping 어노테이션은 경로에 {변수} 형식의 경로 변수를 사용할 수 있는데, @PathVariable 어노테이션을 사용하면 경로 변수의 값을 파라미터로 전달받을 수 있다. @PathVariable 어노테이션은 파라미터 이름과 동일한 이름을 갖는 경로 변수를 사용한다.
@Controller
public class MemberController {
@RequestMapping("/members/{memberId}")
public String memberDetail(@PathVariable String memberId, Model model) {
// 이하 생략
...
return "member/memberDetail";
}
// 이하 생략
...
}
파라미터 이름이 경로 변수와 다를 경우, 다음과 같이 @PathVariable에 경로 변수를 값으로 지정한다.
@Controller
public class MemberController {
@RequestMapping("/members/{mid}")
public String memberDetail(@PathVariable("mid") String memberId, Model model) {
// 이하 생략
...
return "member/memberDetail";
}
// 이하 생략
...
}
요청 컨텐트 타입을 제한하고 싶다면, consumes 속성을 사용하면 된다. 예를 들어, Content-Type 요청 헤더가 "application/json"인 경우만 처리하고 싶다면 다음과 같은 코드를 사용하면 된다.
@RequestMapping(value="/members/", method=RequestMethod.POST, consumes="application/json")
public Result addMember(...) {
// 이하 생략
...
}
반대로 응답 결과로 JSON을 요구하는 요청을 처리하고 싶다면, 즉 Accept 요청 헤더에 "application/json"이 포함된 경우만 처리하고 싶다면, produces 속성을 사용하면 된다.
@RequestMapping(value="/members/{memberId}", method=RequestMethod.POST, produces="application/json")
@ResponseBody
public MemberInfo getMember(@PathVariable String memberId) {
// 이하 생략
...
}
Reference
- 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)
'Spring' 카테고리의 다른 글
| [Spring] 스프링 MVC(7) - 커맨드 객체와 @ModelAttribute 어노테이션 (0) | 2022.03.13 |
|---|---|
| [Spring] 스프링 MVC(6) - @RequestParam 어노테이션 (0) | 2022.03.13 |
| [Spring] 스프링 MVC(4) - 서블릿 매핑 (0) | 2022.03.12 |
| [Spring] 스프링 MVC(3) - 스프링 MVC 설정 (0) | 2022.03.12 |
| [Spring] 스프링 MVC(2) - DispatcherServlet 설정 (0) | 2022.03.12 |