@RequestMapping은 DefaultAnnotationHandlerMapping에서 컨트롤러를 선택할 때 대표적으로 사용하는 애노테이션이다.
url당 하나의 컨트롤러에 매핑되던 다른 핸들러 매핑과 달리 메서드 단위까지 세분화하여 적용할 수 있으며,
url 뿐 아니라 파라미터, 헤더 등 더욱 넓은 범위를 적용할 수 있다.
🌱속성
DefaultAnnotationHandlerMapping은 클래스와 메서드에 붙은 @RequestMapping 애노테이션 정보를 결합해 최종 매핑정보를 생성한다.
기본적인 결합 방법은 클래스 레벨의 @RequestMapping을 기준으로 삼고, 메서드 레벨의 @RequestMapping으로 세분화하는 방식으로 사용된다.
@RequestMapping에 사용할 수 있는 속성들은 아래와 같다.
🌱String[] value
URL 패턴을 지정하는 속성이다.
String 배열로 여러개를 지정할 수 있으며, ANT 스타일의 와일드카드를 사용할 수 있다.
@RequestMapping(value="/post")
@RequestMapping(value="/post.*")
@RequestMapping(value="/post/**/comment")
@RequestMapping(value={"/post", "/P"})
{}를 사용하는 URI 템플릿을 사용할 수도 있다.
@RequestMapping(value="/post/{postId}")
{}를 패스 변수라고 부르며 컨트롤러에서 파라미터로 전달받을 수 있다.
참고로 URL 패턴은 디폴트 접미어 패턴이 적용되므로 아래 2개는 동일한 의미이다.
// 2개는 동일하다!
@RequestMapping(value="/post")
@RequestMapping(value={"/post", "/post/", "/post.*"})
🌱RequestMethod[] method
RequestMethod는 HTTP 메서드를 정의한 ENUM이다.
GET, POST, PUT, DELETE, OPTIONS, TRACE로 총 7개의 HTTP 메서드가 정의되어 있다.
@RequestMapping에 method를 명시하면 똑같은 URL이라도 다른 메서드로 매핑해줄 수 있다.
// url이 /post인 요청 중 GET 메서드인 경우 호출됨
@RequestMapping(value="/post", method=RequestMethod.GET)
// url이 /post인 요청 중 POST 메서드인 경우 호출됨
@RequestMapping(value="/post", method=RequestMethod.POST)
이로인해 컨트롤러에서 번거롭게 HTTP 메서드를 확인할 필요가 없다.
🌱String[] params
요청 파라미터와 값으로도 구분할 수 있다.
String 배열로 여러개를 지정할 수 있으며, 아래와 같이 사용 가능하다.
// /post?useYn=Y 일 경우 호출됨
@RequestMapping(value="/post", params="useYn=Y")
// not equal도 가능
@RequestMapping(value="/post", params="useYn!=Y")
// 값에 상관없이 파라미터에 useYn이 있을 경우 호출됨
@RequestMapping(value="/post", parmas="useYn")
// 파라미터에 useYn이 없어야 호출됨
@RequestMapping(value="/post", params="!useYn")
GET 파라미터만이 아닌 POST 파라미터 또한 비교 대상이다.
폼 내에서 input 태그 등으로 넘겨도 위의 매핑을 적용할 수 있다.
근데 만약 아래와 같은 상황이라면 어떻게 될까?
// 요청 : /post?useYn=Y
@RequestMapping(value="/post")
@RequestMapping(value="/post", params="useYn=Y")
요청이 2가지 매핑을 다 만족하지만 이럴 경우 구현이 상세한 쪽으로 선택된다.
🌱String[] headers
헤더 값으로 구분할 수 있다.
방식은 위의 params와 비슷하다.
@RequestMapping(value="/post", headers="content-type=text/*")
'Backend🌱 > Spring' 카테고리의 다른 글
[Spring / 스프링] @RequestMapping 대신 @PostMapping @GetMapping 쓰는 이유 (0) | 2023.08.24 |
---|---|
[Spring] REST(Representational State Transfer), JSON(JavaScript Object Notation), Ajax(jQuery) (0) | 2023.08.24 |
[진짜 모르면 손해] Spring / @RequestBody vs @RequestParam 이해하기🐈 (0) | 2023.04.19 |
[Spring Boot] @RequestMapping, @GetMapping, @PostMapping (0) | 2023.04.17 |
Spring Boot와 React 연동하기 (0) | 2023.04.11 |