MVC 프레임워크 11

Mar 6, 2023

4 mins read

요청 매핑 알아보기

  • hello.springmvc.basic.requestmapping 패키지에 MappingController를 하나 만든다.
  • @Controller는 반환값이 String이면 뷰 이름으로 인식되서 뷰가 랜더링 된다.
  • @RestController는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다.
  • @RequestMapping 대부분의 속성을 배열[] 로 제공하므로 다중 설정이 가능하다. {"/hello-basic", “/hello-go”}
package hello.springmvc.basic.requestmapping;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MappingController {
	
	private Logger log = LoggerFactory.getLogger(getClass());
	
	@RequestMapping(value = "/hello-basic", method = RequestMethod.POST)
	private String helloBasic() {
		log.info("helloBasic");
		return "ok";
	}
	
	/**
	 * 편리한 축약 애노테이션 (코드보기)
	 * @GetMapping
	 * @PostMapping
	 * @PutMapping
	 * @DeleteMapping
	 * @PatchMapping
	 */
	@GetMapping(value = "/mapping-get-v2")
	public String mappingGetV2() {
		log.info("mapping-get-v2");
		return "ok";
	}
	
	/*
	 * PathVariable(경로변수) 사용
	 * 변수명이 같으면 생략 가능
	 * @PathVariable("userId") String userId -> @PathVariable userId
	 * */
	@GetMapping(value = "/mapping/{userId}")
	public String mappingPath(@PathVariable("userId") String data) {
		log.info("mappingPath userId={}", data);
		return "ok";
	}
	
	/**
	 * PathVariable 사용 다중
	 */
	@GetMapping("/mapping/users/{userId}/orders/{orderId}")
	public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
		log.info("mappingPath userId={}, orderId={}", userId, orderId);
		return "ok";
	}
	
	/**
	 * 파라미터로 추가 매핑
	 * 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";
	}
	
	/**
	 * 특정 헤더로 추가 매핑
	 * 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";
	}
	
	/**
	 * Content-Type 헤더 기반 추가 매핑 Media Type
	 * consumes="application/json"
	 * consumes="!application/json"
	 * consumes="application/*"
	 * consumes="*\/*"
	 * MediaType.APPLICATION_JSON_VALUE
	 */
	@PostMapping(value = "/mapping-consume", consumes = MediaType.APPLICATION_JSON_VALUE)
	public String mappingConsumes() {
	 log.info("mappingConsumes");
	 return "ok";
	}
	
	/** 
	 * Accept 헤더 기반 Media Type
	 * produces = "text/html"
	 * produces = "!text/html"
	 * produces = "text/*"
	 * produces = "*\/*"
	 */
	@PostMapping(value = "/mapping-produce", produces = MediaType.TEXT_PLAIN_VALUE)
	public String mappingProduces() {
	 log.info("mappingProduces");
	 return "ok";
	}
	
}

HTTP 메서드

  • @RequestMapping 에 method 속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게 호출된다.
  • 모두 허용 GET, HEAD, POST, PUT, PATCH, DELETE

요청 매핑 - API 예시

  • hello.springmvc.basic.requestmapping 패키지에 MappingClassController를 만든다.
  • 회원 관리를 HTTP API로 만든다 생각하고 매핑을 어떻게 하는지 알아보자.
package hello.springmvc.basic.requestmapping;

import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/mapping/users") 
public class MappingClassController {
	
	/*
	 *	회원 목록 조회: GET /users
	 *	회원 등록: POST /users
	 *	회원 조회: GET /users/{userId}
	 *	회원 수정: PATCH /users/{userId}
	 *	회원 삭제: DELETE /users/{userId}
	 * 
	 * */
	
	@GetMapping
	public String user() {
		return "get users";	
	}
	
	@PostMapping
	public String addUser() {
		return "post users";
	}
	
	@GetMapping("/{userId}")
	public String findUser() {
		return "find user";
	}
	
	@PatchMapping("/{userId}")
	public String updateUser() {
		return "update user";
	}
	
	@DeleteMapping("/{userId}")
	public String deleteUser() {
		return "delete user";
	}

}
  • Postman으로 위 매핑들을 테스트 해볼 수 있다. postman_mapping_test.PNG