본문 바로가기
Spring

[Spring] @RequestMapping - 요청 주소 매핑하기

by Amy IT 2022. 9. 1.

 

목차

     

    @RequestMapping

    @Controller 또는 @RestController 어노테이션으로 등록된 클래스는 자동으로 스프링 빈으로 등록이 되어 매핑됩니다. 하지만 사용자가 요청한 URL에 매핑하기 위해서는 빈의 매핑 정보를 정의해야 합니다. 이때 사용하는 것이 @RequestMapping 어노테이션입니다.

    @RequestMapping 어노테이션은 Spring MVC Framework의 RequestHandlerMappingHandler 인터페이스를 어노테이션화한 것으로서, 사용자의 요청을 스프링 Controller 메소드 또는 클래스에 매핑하기 위해 사용됩니다. 클래스 레벨에 사용하면 클래스 내 모든 메소드에 공유되는 매핑 주소로 설정할 수 있으며, 메소드 레벨에 사용하면 특정한 매핑으로 범위를 좁힐 수 있습니다.

    @RequestMapping 어노테이션에는 URL, HTTP 메소드, 요청 파라미터, 헤더, 미디어 타입 등 여러 가지 속성(attribute)을 지정할 수 있는데, 지정한 속성에 따라 handler가 매핑을 하게 됩니다. URL을 포함한 모든 속성이 같을 수는 없으며, 어느 하나라도 다르다면 같은 URL로 들어온 요청에 대해서도 다른 처리를 할 수 있게 됩니다. 

     

    value

    value는 디폴트 엘리먼트로서, 연결할 URL을 의미합니다. 보통 호스트 주소와 포트 번호를 제외하고 API 설계 규약에 따라 이름을 짓습니다.

    @RequestMapping(value = "/test")
    @RequestMapping("/test") //value를 제외하고 다른 속성을 지정하지 않는 경우 value 생략 가능
    @RequestMapping(value = {"/test", "/example"}) //OR 조건, 여러 URL과 매핑 가능

     

    PathPattern을 이용한 URL 지정도 가능합니다. 

    @RequestMapping(value = "/test/u?er") //한 글자 일치 (ex./test/user)
    @RequestMapping(value = "/test/*user") //0 또는 여러 글자 일치 (ex./test/loginuser)
    @RequestMapping(value = "/test/*") //해당 경로 바로 아래까지만 (ex./text/user)
    @RequestMapping(value = "/test/**") //해당 경로 아래 모두 (ex./test/user, /test/user/example)
    @RequestMapping(value = "/test/{user}") //@PathVariable 파라미터로 전달받은 값을 변수로 사용 (ex./test/amy)
    @RequestMapping(value = "/test/{user:[a-z]+}") //정규식을 사용한 변수 (ex./test/amy)

     

    method

    HTTP 요청 메소드에 따라 매핑되는 대상을 다르게 설정할 수 있습니다. RequestMethod로 명명되어 있는 GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE 8가지 중 하나를 사용할 수 있으며, 지정하지 않을 시 모든 종류의 요청에 대해 매핑하게 됩니다. 

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    @RequestMapping(value = "/test", method = RequestMethod.POST)
    @RequestMapping(value = "/test", method = RequestMethod.PUT)
    @RequestMapping(value = "/test", method = RequestMethod.DELETE)
    @RequestMapping(value = "/test", method = {RequestMethod.GET, RequestMethod.POST}) //OR 조건, 여러 요청방식에 대해 매핑

     

    스프링 4.3 버전부터는 이를 줄여서 사용할 수 있는 축약형(shortcut) 어노테이션을 사용할 수 있습니다.

    @GetMapping(value = "/test")

     

    클래스 레벨에 공통되는 URL 주소인 /test를 매핑 주소로 설정하고 각 메소드에 대해 축약형 어노테이션을 다음과 같이 사용하면, /test 주소에 대한 요청이 각 요청 방식에 맞는 메소드로 매핑됩니다.

    @Controller
    @RequestMapping(value = "/test")
    public class TestController {
    	
    	@GetMapping
    	public String getXX() {
    		return "view1";
    	}
    	@PostMapping
    	public String postXX() {
    		return "view2";
    	}
    	@PutMapping
    	public String putXX() {
    		return "view3";
    	}
    	@DeleteMapping
    	public String deleteXX() {
    		return "view4";
    	}
    }

     

    params

    파라미터로 전달된 값이 지정한 값과 일치하는 것을 매핑해 줍니다. 사용자가 요청하는 URL에 특정 파라미터 값을 요구하거나 제외하여 매핑할 수 있습니다. 

    @RequestMapping(value = "/test", params = "userid=admin") //key=value가 모두 일치하는 경우
    @RequestMapping(value = "/test", params = "status!=0") //해당 key=value가 아닌 모든 경우
    @RequestMapping(value = "/test", params = "status") //해당 key를 갖는 모든 경우
    @RequestMapping(value = "/test", params = {"userid=admin", "status!=0"}) //AND 조건, 지정한 조건이 모두 일치하는 경우

     

    매핑 결합

    클래스 레벨에 @RequestMapping을 지정하여 공통 조건을 나타내고, 내부 메소드에서 세부 조건을 지정할 수 있습니다. 아래의 경우 매핑되는 주소는 /test/example 이 됩니다.

    @Controller
    @RequestMapping("/test")
    public class TestController {
    	@RequestMapping(value = "/example", method = RequestMethod.GET)
    	public String getXX() {
    		return "view1";
    	}
    }

     

     

     

    참고

     

    댓글