IT/SPRING
[SPRING] @RequestMapping 활용하기
윤재웅
2019. 11. 8. 00:16
[SPRING] @RequestMapping 활용하기
여러 경로를 한 메서드에 처리하고 싶다면, 배열로 경로 목록을 지정하면 된다.
@Controoler
public class HomeController {
@RequestMapping({"/main", "/index"})
public String list(ModelMap 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){
...
}
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){
...
}