[Spring] 요청 방식(@RequestMapping, @GetMapping, @PostMapping)

0. 주요 어노테이션

이름설명
@Controller해당 클래스가 Controller임을 나타내기 위한 어노테이션
@RequestMapping요청에 대해 어떤 Controller, 어떤 메소드가 처리할지를 맵핑하기 위한 어노테이션
@RequestParamController 메소드의 파라미터와 웹요청 파라미터와 맵핑하기 위한 어노테이션
@ModelAttributeController 메소드의 파라미터나 리턴값을 Model 객체와 바인딩하기 위한 어노테이션
@SessionAttributesModel 객체를 세션에 저장하고 사용하기 위한 어노테이션
@RequestPartMultipart 요청의 경우, 웹요청 파라미터와 맵핑가능한 어노테이션(egov 3.0, Spring 3.1.x부터 추가)
@CommandMapController메소드의 파라미터를 Map형태로 받을 때 웹요청 파라미터와 맵핑하기 위한 어노테이션(egov 3.0부터 추가)
@ControllerAdviceController를 보조하는 어노테이션으로 Controller에서 쓰이는 공통기능들을 모듈화하여 전역으로 쓰기 위한 어노테이션(egov 3.0, Spring 3.2.X부터 추가)

1. @RequestMapping이란?

특정 url로부터 요청을 받으면 어떤 Controller에서 처리할 지 알아야 한다.
이 때, 특정 url을 요청을 수행할 Controller과 매핑하여 지정하는 어노테이션이 @RequestMapping이다.

2. RequestMapping의 동작 방식

  1. SpringBoot 애플리케이션이 실행되면 애플리케이션에서 사용할 baen들을 담을 ApplicationContext를 생성하고 초기화한다.

  2. @RequestMapping이 붙은 메서드들이 handler에 등록되는 것은 ApplicationContext가 refresh되는 과정에서 일어난다. refresh과정에서 Spring Application 구동을 위해 많은 Baen들이 생성되고, 그 중 하나가 RequestMappingHandlerMapping이다. 이 Bean은 우리가 @RequestMapping으로 등록한 메서드들을 가지고 있다가 요청이 들어오면 Mapping해주는 역할을 수행한다.

  1. 그 이후 Bean으로 등록된 HandlerMapping이 변수들을 찾아서 Adapter를 거쳐 실행하여 실행한다.

3. @RequestMapping이 사용하는 속성

이름타입설명
valueString[]URL 값으로 매핑 조건을 부여 (default)
methodRequetMethod[]HTTP Request 메소드 값을 매핑 조건으로 부여
사용 가능한 메소드는 GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE (7개)
paramsString[]HTTP Request 파라미터를 매핑 조건으로 부여
consumesString[]설정과 Content-Type request 헤더가 일치할 경우에만 URL이 호출됨
producesString[]설정과 Accept request 헤더가 일치할 경우에만 URL이 호출됨
  • value

    value연결할 url을 지칭한다. 보통 호스트 주소와 포트 번호를 제외하고, REST API에 따른 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은 다중으로 사용할 수 있다.

  • method

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,

좋은 웹페이지 즐겨찾기