[스프링 MVC - 백엔드 웹 개발 기술] 13. 컨트롤러의 요청 매핑 방식과 HTTP 요청 기본 헤더 값 조회 방법
by ymkim01. 요청 매핑
- 요청 매핑이란 요청이 왔을 때 어떤 컨트롤러가 호출이 될지 매핑하는 방법
01-1. MappingController - RequestMapping
package hello.springmvc.basic.requestmapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MappingController {
private Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping("/hello-basic")
public String helloBasic() {
log.info("helloBasic");
return "ok";
}
}
매핑 정보에 대해 한번 더 복기 해보자
- @RestController
- 반환 값으로 뷰를 찾는게 아니라, HTTP 메시지 바디에 바로 입력
- @Controller
- 반환 값으로 뷰를 반환한다, 후에 해당 뷰를 랜더링 한다
- @RequestMapping(”/hello-basic”)
- /hello-basic 요청 시 해당 메서드(API) 호출
- 다중 요청(Multi Path)도 가능 → @GetMapping({"/hello-basic", "/hello-test"})
01-2. HTTP 메서드 지정 안함
// method를 명시하지 않았음
@RequestMapping(value = "/hello-method")
- @RequestMapping 에 method 속성 지정 안하면 HTTP 메서드와 무관하게 호출된다
- 모두 허용 GET, HEAD, POST, PUT, PATCH, DELETE
// method 명시
@RequestMapping(value = "/hello-test", method = RequestMethod.POST)
- method를 명시함으로써 다른 HTTP Method 요청을 방지한다
01-3. HTTP 매핑 축약
/**
* 축약 어노테이션 (코드보기)
* @GetMapping
* @PostMapping
* @PutMapping
* @DeleteMapping
* @PatchMapping
*/
@GetMapping(value = "/mapping-get-v2")
public String mappingGetV2() {
log.info("mapping-get-v2");
return "ok";
}
- 위와 같이 축약어(@GetMapping)를 통해 Method mapping 가능
01-4. 경로 변수(PathVariable) 사용
/**
*
* PathVariable 사용
* 변수명이 같으면 생략 가능
*/
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
log.info("mappingPath userId = {}", data);
return "ok";
}
- URL 자체로 들어오는 값을 파라미터(Parameter)로 받는다
- 최근 HTTP API는 위와 같이 리소스 경로에 식별자를 넣는 스타일을 선호한다
01-5. 경로 변수(PathVariable) 다중 매핑
/**
* 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";
}
- 다중 매핑 사용, @PathVariable을 통해 리소스 경로에 2개의 식별자 등록
01-6. 미디어 타입 조건 매핑- HTTP 요청 Content-Type, consume
@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsume() {
log.info("mappingConsume");
return "ok";
}
// consume 예시 : consume은 들어오는 데이터 타입을 제어
@PostMapping(path = "/pets", consumes = MediaType.APPLICATION_JSON_VALUE)
public void addPet(@RequestBody Pet pet) {
// ...
}
- consumes: 들어오는 데이터 타입(data type)을 정의할 때 사용
- 보내는 쪽은 content-type을 명시해야 한다, Content-Type : application/json
01-7. 미디어 타입 조건 매핑 - HTTP 요청 Accept, produce
/**
* produce는 나가는 데이터 타입을 제어
* Accept: application/json
*/
@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduce() {
log.info("mappingProduce");
return "ok";
}
- produce: 나가는 데이터 타입(data type)을 정의할 때 사용
- 보내는 쪽은 Accept을 명시해야 한다, Accept : application/json
02. 요청 매핑 - API 예시
회원 관리를 HTTP API로 만든다 가정하고 매핑을 어떻게 하는지 알아보자. (실제 데이터가 넘어가는 부분은 생략, URL 매핑만 작성)
02-1. 회원 관리 API
- 회원 목록 조회 : GET /users
- 회원 등록 : POST /users
- 회원 조회 : GET /users/{userId}
- 회원 수정 : PATCH /users/{userId}
- 회원 삭제 : DELETE /users/{userId}
02-2. MappingClassController
package hello.springmvc.basic.requestmapping;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/mapping/users")
public class MappingClassController {
@GetMapping
public String users() {
return "get users";
}
@PostMapping
public String addUser() {
return "post users";
}
@GetMapping("/{userId}")
public String findUser(@PathVariable String userId) {
return "get userId=" + userId;
}
@PatchMapping("/{userId}")
public String updateUser(@PathVariable String userId) {
return "update userId=" + userId;
}
@DeleteMapping("/{userId}")
public String deleteUser(@PathVariable String userId) {
return "delete userId=" + userId;
}
}
- 간단한 CRUD HTTP API를 생성 후 POSTMAN을 통해 테스트 진행
- 다음에는 HTTP 요청 시 데이터를 어떻게 조회하는지 알아본다
03. HTTP 요청 - 기본, 헤더 조회
어노테이션 기반의 스프링 컨트롤러는 다양항 파라미터를 지원한다. 이번 시간에는 HTTP 헤더 정보를 조회하는 방법에 대해 알아본다.
03-1. RequestHeaderController
package hello.springmvc.basic.request;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
@Slf4j
@RestController
public class RequestHeaderController {
/**
* Client의 요청 Header 정보 출력
*/
@RequestMapping("/headers")
public String headers(
HttpServletRequest request,
HttpServletResponse response,
HttpMethod httpMethod,
Locale locale,
@RequestHeader MultiValueMap<String, String> headerMap,
@RequestHeader("host") String host,
@CookieValue(value = "myCookie", required = false) String cookie
) {
log.info("request = {}", request);
log.info("response = {}", response);
log.info("httpMethod = {}", httpMethod);
log.info("locale = {}", locale);
log.info("headerMap = {}", headerMap);
log.info("header host = {}", host);
log.info("myCookie = {}", cookie);
return "ok";
}
}
- Client의 HTTP Header 정보 출력 방법
- HttpServletRequest : Servlet Request 객체 확인
- HttpServletResponse : Servlet Response 객체 확인
- HttpMethod : HTTP Method 정보 확인
- Locale : Locale 정보 확인 (우선순위가 가장 높은 순으로 반환)
- @RequestHeader MultiValueMap<String, String> : 모든 Header 정보 확인
- @RequestHeader(”host”) String host : Header Host 정보 확인
- @CookieValue(”myCookieName”) String cookie : Cookie 정보 확인
- MultiValueMap이란?
- 하나의 키(key)에 여러개의 값을 받을 수 있음 ( 같은 키에 여러개 값 매핑 1 : N )
- keyA=vlaue1&keyA=value2
@Controller 사용 파라미터 목록 참고
https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/arguments.html
'Spring MVC > 스프링 MVC - 백엔드 웹 개발 기술' 카테고리의 다른 글
[스프링 MVC - 백엔드 웹 개발 기술] 15. HTTP 응답 - 정적 리소스와 뷰 템플릿 반환 및 응답 방법 (1) | 2024.01.05 |
---|---|
[스프링 MVC - 백엔드 웹 개발 기술] 14. HTTP 요청 파라미터 - 쿼리 스트링과 HTML Form, @RequestParam, @ModelAttribute, 텍스트, JSON 요청 방식 (1) | 2024.01.05 |
[스프링 MVC - 백엔드 웹 개발 기술] 12. 프로젝트 생성과 로깅 간단히 알아보기 (2) | 2024.01.05 |
[스프링 MVC - 백엔드 웹 개발 기술] 11. 스프링 MVC 구조의 이해 (0) | 2023.10.01 |
[스프링 MVC - 백엔드 웹 개발 기술] 10. MVC 프레임워크 만들기 (1) | 2023.09.11 |
블로그의 정보
기록하고, 복기하고
ymkim