0. 주요 어노테이션
이름 | 설명 |
---|---|
@Controller | 해당 클래스가 Controller임을 나타내기 위한 어노테이션 |
@RequestMapping | 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지를 맵핑하기 위한 어노테이션 |
@RequestParam | Controller 메소드의 파라미터와 웹요청 파라미터와 맵핑하기 위한 어노테이션 |
@ModelAttribute | Controller 메소드의 파라미터나 리턴값을 Model 객체와 바인딩하기 위한 어노테이션 |
@SessionAttributes | Model 객체를 세션에 저장하고 사용하기 위한 어노테이션 |
@RequestPart | Multipart 요청의 경우, 웹요청 파라미터와 맵핑가능한 어노테이션(egov 3.0, Spring 3.1.x부터 추가) |
@CommandMap | Controller메소드의 파라미터를 Map형태로 받을 때 웹요청 파라미터와 맵핑하기 위한 어노테이션(egov 3.0부터 추가) |
@ControllerAdvice | Controller를 보조하는 어노테이션으로 Controller에서 쓰이는 공통기능들을 모듈화하여 전역으로 쓰기 위한 어노테이션(egov 3.0, Spring 3.2.X부터 추가) |
1. @RequestMapping이란?
특정 url로부터 요청을 받으면 어떤 Controller에서 처리할 지 알아야 한다.
이 때, 특정 url을 요청을 수행할 Controller과 매핑하여 지정하는 어노테이션이 @RequestMapping
이다.
2. RequestMapping의 동작 방식
SpringBoot 애플리케이션이 실행되면 애플리케이션에서 사용할 baen들을 담을 ApplicationContext를 생성하고 초기화한다.
@RequestMapping
이 붙은 메서드들이 handler에 등록되는 것은 ApplicationContext가 refresh되는 과정에서 일어난다. refresh과정에서 Spring Application
구동을 위해 많은 Baen들이 생성되고, 그 중 하나가 RequestMappingHandlerMapping
이다. 이 Bean은 우리가 @RequestMapping
으로 등록한 메서드들을 가지고 있다가 요청이 들어오면 Mapping해주는 역할을 수행한다.
3. @RequestMapping이 사용하는 속성
이름 | 타입 | 설명 |
---|---|---|
value | String[] | URL 값으로 매핑 조건을 부여 (default) |
method | RequetMethod[] | HTTP Request 메소드 값을 매핑 조건으로 부여 사용 가능한 메소드는 GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE (7개) |
params | String[] | HTTP Request 파라미터를 매핑 조건으로 부여 |
consumes | String[] | 설정과 Content-Type request 헤더가 일치할 경우에만 URL이 호출됨 |
produces | String[] | 설정과 Accept request 헤더가 일치할 경우에만 URL이 호출됨 |
@RequestMapping(value="/hello")
위와 같이 매핑을 하게 되면 보통 local환경에선 localhost:8080/hello로 url을 입력했을 경우에 해당하게 된다. 뿐만 아니라 value를 생략하거나 다중 요청도 가능하다.
@RequestMapping({"/hello", "/hello-buddy", "/hello/**"}
위와 같이 다중 요청도 가능하며 셋 중 어느 url을 쳐도 다 연결된다.
경로변수(@PathVariable) 사용
뿐만 아니라 최근 HTTP API는 리소스 경로에 식별자를 넣는 스타일을 선호한다. 쿼리 파라미터로 식별자를 넣는 방법도 있지만 경로 변수를 사용하는 것이 매핑되는 부분을 편리하게 조회할 수 있다.@GetMapping("/mapping/{userId}") public String mappingPath(@PathVariable("userId") String data) { log.info("mappingPath userId={}", data); return "ok"; } @GetMapping("mapping/{userId}") public String mappingPath(@PathVariable String userId) { log.info("mappingPath userId={}", userId); return "ok"; }
@PathVariable
어노테이션을 선언한 "userId"는String
자료형으로 data에 매핑이 되는데, 아래와 같이 data 대신 같은 파라미터를 선언해주면 생략이 가능하다.@GetMapping("/mapping/users/{userId}/orders/{orderId}") public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) { log.info("mappingPath userId={}, orderId={}", userId, orderId); return "ok"; }
이와 같이
@PathVariable
은 다중으로 사용할 수 있다.
RequestMethod의 경우, GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
등 8가지가 있다. 보통의 경우에는 @RequestMapping
어노테이션에 아래와 같이 method를 쓸 수 있다.
@RequestMapping(method = RequestMethod.GET, value = "/hello")
하지만 GET, POST, PUT, PATCH, DELETE
메서드에 대해서 각각에 맞는 메서드 옵션이 적용된 어노테이션(@GetMapping
이나 @PostMapping
과 같은)이 존재하여 @RequestMapping
하위에 써서 코드를 좀 더 간결하게 만들 수 있다.
추가적으로 @RequestMapping
은 Class와 Method에 붙일 수 있고, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping
등은 Method에만 붙일 수 있다.
Link
https://tecoble.techcourse.co.kr/post/2021-06-18-spring-request-mapping/,
https://sarc.io/index.php/development/1139-requestmapping,
https://mungto.tistory.com/436,
https://dahliachoi.tistory.com/42,
잘 읽어보았습니다 감사합니다