본문 바로가기

CODING/JAVA

[스크랩]@RequestMapping 을 이용한 요청 매핑

자료 출처 : 오늘과 다른 양형! 블로그 (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){
...
}