자료 출처 : 오늘과 다른 양형! 블로그 (http://yang1650.tistory.com/133)
@RequestMapping 을 이용한 요청 매핑
"컨트롤러 구현" = 클라이언트의 요청을 처리할 메서드를 구현
- 클라이언트는 URL로 요청을 전송
- 요청 URL을 어떤 메서드가 처리할지 여부를 결정하는 것이 “@RequestMapping“
@RequestMapping을 이용한 경로 지정
@Controoler
public class EventController {
@RequestMapping("/event/list")
public String list(ModelMap model){
....
}
}
여러 경로를 한 메서드에 처리하고 싶다면, 배열로 경로 목록을 지정하면 된다.
@Controoler
public class HomeController {
@RequestMapping({"/main", "/index"})
public String list(ModelMap model){
....
}
}
클래스와 메서드에 @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){
...
}
}
HTTP 전송 방식 지정
- 로그인 데이터나 게시글 데이터를 존성해야 할 경우 <form> 태그에서 method 속성값을 “post”로 지정하는 것이 일반적
- @RequestMapping 애노테이션은 method 속성을 이용해서 메서드에서 처리할 전송 방식을 지정할 수 있다.
- 동일한 경로를 값으로 갖고 method 속성만 다를 수 있다.
@Controller
public class RegistrationController{
@RequestMapping(value="/member/regist", method=RequestMethod.GET)
public String form(...) {
return "member/registrationForm";
}
@RequestMapping(value="/member/regist", method=RequestMethod.POST)
public String regist(...) {
return "member/registered";
}
}
@PathVariable을 이용한 경로 변수
- 게시글의 내용을 보여주는 URL을 보면 http://host/readArticles?id=10와 같이 요청 파라미터를 이용하는 경우가 많음
- 하지만, URL자체를 이용해서 게시글 링크를 표현하는 경우도 많음
- @RequestMapping 애노테이션은 경로에 {변수} 형식의 경로 변수를 사용할 수 있음
- @PathVariable 애노테이션을 사용하면 경로 변수의 값을 파라미터로 전달받을 수 있다.
@Controller
public class MemberController {
@RequestMapping("/members/{memberId}")
public String memberDetail(@PathVariable Stirng memberId, Model model){
...
}
- 경로 변수는 한 개 이상 사용할 수 있다.
@RequestMapping("/members/{memberId}/orders/{orderId}")
public String memberOrderDetail(
@PathVariable ("memberId") String memberID,
@PathVariable ("orderId") Long orderId, Model model){
...
}
- 스프링은 경로 변수의 값을 파라미터의 타입에 맞게 변환해준다.
- 경로 변수를 파라미터 타입으로 변환할 수 없을 경우, 스프링 MVC는 웹 브라우저에 400에러 코드를 응답 결과롤 전송한다.
- 정규 표현식을 사용할 수도 있다.
Ant 패턴을 이용한 경로 매핑
- * : 또는 그 이상의 글자
ex) @RequestMapping(“/member/?.info”) : /member/로 시작하고, 확장자가 .info로 끝나는 모든 경로 - ? : 1개 글자
ex) @RequestMapping(“/faq/f?00.fq”) : /faq/f로 시작하고, 1글자가 사이에 위치하고 00.fq로 끝나는 모든 경로 - ** : 0개 도는 그 이상의 디렉토리 경로
ex) @RequestMapping(“/folders/**/files”) : /folders/로 시작하고, 중간에 0개 이상의 중간 경로가 존재하고 /files로 끝나는 모든 경로. 예를 들어, /folders/files, /folders/1/2/3/files 등이 매핑된다.
처리 가능한 요청 컨텐트 타입.응답 가능한 컨텐트 타입 한정
- 서비스 또는 클라이언트/서버간 통신 방식으로 REST API가 자리를 잡으면서 HTTP의 데이터로 JSON이나 XML을 전송하는 경우가 증가
- @RequestMapping은 컨트롤러 메서드에서 처리 가능한 요청 컨텐트 타입과 응답 컨텐트 타입을 제한하는 방법을 제공
- 같은 URL이라 하더라도 컨텐트 타입에 따라 다른 응답을 보여주도록 처리
- 요청 컨텐트 타입 제한 = comsumes 속성 사용하면 된다. 예를 들어 Content-Type 요청 헤더가 “application/json”인 경우만 처리하고 싶다면 다음과 같은 코드를 사용하면 된다.
@RequestMapping(value="/member", method=@RequestMethod.POST, consumes="application/json")
public Result addMemeber(@RequestBody NewMember mem) {
...
}
- 반대로 응답 결과로 JSON을 요구하는 요청을 처리하고 싶다면, 즉 Accept 요청 헤더에 application/json이 표함된 경우만 처리하고 싶다면, producess 속성을 사용하면 된다.
@RequestMapping(value="/member/{memberId}", method=@RequestMethod.GET, produces="application/json")
@ResponseBody
public MemberInfo getMember(@PathVariable String memberId){
...
}