Spring

[Spring] 스프링 MVC(5) - @RequestMapping 어노테이션

재담 2022. 3. 13. 19:13

@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 자체를 이용해서 게시글 링크를 표현하는 경우도 많아졌다.

 

@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 프로그래밍 (최범균 저)