6-2. 요청 매핑

shin·2025년 8월 11일

Spring MVC

목록 보기
24/25

@RestController / @Controller


MappingController

package hello.springmvc.basic.requestmapping;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

@RestController
public class MappingController {

	private Logger log = LoggerFactory.getLogger(getClass());
    
    /**
    * 기본 요청
    * 둘다 허용 /hello-basic, /hello-basic/
    * HTTP 메서드 모두 허용 GET, HEAD, POST, PUT, PATCH, DELETE
    */
    @RequestMapping("/hello-basic")
    public String helloBasic() {
    
   		log.info("helloBasic");
    	return "ok";
    }
}
  • @Controller : 반환값이 String이면 뷰 이름으로 인식 -> 뷰 렌더링
  • @RestController : 반환 값으로 뷰를 찾는 것이 아니라, HTTP 응답 바디에 바로 입력(내부적으로 @ResponseBody 포함)

1. 기본 요청 매핑 : @RequestMapping

@RequestMapping("/hello-basic")
public String helloBasic() {
    return "ok";
}
  • /hello-basic URL 요청에 대해 메서드 실행

  • HTTP 메서드 무관(GET, PORT, PUT 등 모두 허용)

  • 스프링 부트 3.0 이전에는 /hello-basic와 /hello-basic/ 동일 취급

    • 기존에는 마지막에 있는 /를 제거했지만, 스프링부트 3.0부터 마지막 /를 유지함
    • 3.0부터는 /hello-basic와 /hello-basic/ 서로 다른 URL로 처리

2. HTTP 메서드 제한 매핑

@RequestMapping(value = "/mapping-get-v1", method = RequestMethod.GET)
public String mappingGetV1() { return "ok"; }
  • 특정 HTTP 메서드만 매핑(GET, POST, PUT, DELETE 등)
  • 요청 메서드가 맞지 않으면 405(Method Not Allowed) 반환

3. HTTP 메서드 매핑 축약 어노테이션


@GetMapping("/mapping-get-v2")
public String mappingGetV2() { return "ok"; }
  • @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping 등
  • 내부적으로 @RequestMapping(method = RequestMethod.GET)과 동일

4. 경로 변수 매핑 - @PathVariable


@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable String userId) {
    return "ok";
}
  • URL 경로 일부를 변수로 매핑
  • 변수 이름과 파라미터 이름이 같으면 @PathVariable("userId") -> @PathVariable 생략 가능

5. 다중 경로 변수


@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
    return "ok";
}

6. 특정 요청 파라미터 조건 매핑


/**
* 파라미터로 추가 매핑
* params="mode",
* params="!mode"
* params="mode=debug"
* params="mode!=debug" (! = )
* params = {"mode=debug","data=good"}
*/
@GetMapping(value = "/mapping-param", params = "mode=debug")
public String mappingParam() {

	log.info("mappingParam");
	return "ok";
}
  • 특정 쿼리 파라미터 존재 혹은 값에 따라 매핑
  • 예 : /mapping-param?mode=debug 요청만 처리

7. 특정 요청 헤더 조건 매핑


/**
* 특정 헤더로 추가 매핑
* headers="mode",
* headers="!mode"
* headers="mode=debug"
* headers="mode!=debug" (! = )
*/
@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader() {

	log.info("mappingHeader");
	return "ok";
}
  • 요청 헤더에 특정 키, 값이 있을 때만 매핑

8. Content-Type 조건 매핑(consumes)


/**
* Content-Type 헤더 기반 추가 매핑 Media Type
* consumes="application/json"
* consumes="!application/json"
* consumes="application/*"
* consumes="*\/*"
* MediaType.APPLICATION_JSON_VALUE
*/
@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsumes() {

	log.info("mappingConsumes");
	return "ok";
}
  • HTTP 요청의 Content-Type 헤더 기준 매핑

  • 맞지 않으면 415(Unsupported Media Type) 반환

  • 예시 : consumes

consumes = "text/plain"
consumes = {"text/plain", "application/*"}
consumes = MediaType.TEXT_PLAIN_VALUE

9. Accept 헤더 조건 매핑(produces)


/**
* Accept 헤더 기반 Media Type
* produces = "text/html"
* produces = "!text/html"
* produces = "text/*"
* produces = "*\/*"
*/
@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduces() {

	log.info("mappingProduces");
	return "ok";
}
  • HTTP 요청의 Accept 헤더 기준 매핑
  • 맞지 않으면 406(Not Acceptable) 반환
  • 예시 :
produces = "text/plain"
produces = {"text/plain", "application/*"}
produces = MediaType.TEXT_PLAIN_VALUE
produces = "text/plain;charset=UTF-8"

참고


  • @RequestMapping의 속성들은 배열로 여러 개 설정 가능
  • @RestController 사용 시 반환 문자열이 뷰가 아닌 HTTP 응답 본문으로 직접 전달됨


API 예시


  • 회원 관리를 HTTP API로 만든다 생각하고 매핑을 어떻게 하는지 알아보기
  • (실제 데이터가 넘어가는 부분은 생략하고 URL 매핑만)

회원 관리 API

  • 회원 목록 조회: GET /users
  • 회원 등록: POST /users
  • 회원 조회: GET /users/{userId}
  • 회원 수정: PATCH /users/{userId}
  • 회원 삭제: DELETE /users/{userId}

MappingClassController

package hello.springmvc.basic.requestmapping;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/mapping/users")
public class MappingClassController {

  /**
  * GET /mapping/users
  */
  @GetMapping
  public String users() {
  
  	return "get users";
  }
  
  /**
  * POST /mapping/users
  */
  @PostMapping
  public String addUser() {
  
  	return "post user";
  }
  
  /**
  * GET /mapping/users/{userId}
  */
  @GetMapping("/{userId}")
  public String findUser(@PathVariable String userId) {
  
  	return "get userId=" + userId;
  }
  
  /**
  * PATCH /mapping/users/{userId}
  */
  @PatchMapping("/{userId}")
  public String updateUser(@PathVariable String userId) {
  
  	return "update userId=" + userId;
  }
  
  /**
  * DELETE /mapping/users/{userId}
  */
  @DeleteMapping("/{userId}")
  public String deleteUser(@PathVariable String userId) {
  
  	return "delete userId=" + userId;
  }
}
  • @RequestMapping("/mapping/users")
    • 클래스 레벨에 매핑 정보를 두면 메서드 레벨에서 해당 정보를 조합해서 사용함
  • 회원 목록 조회: GET /mapping/users
  • 회원 등록: POST /mapping/users
  • 회원 조회: GET /mapping/users/id1
  • 회원 수정: PATCH /mapping/users/id1
  • 회원 삭제: DELETE `/mapping/users/id1
profile
Backend development

0개의 댓글