Lined Notebook

[스프링 MVC - 백엔드 웹 개발 기술] 13. 컨트롤러의 요청 매핑 방식과 HTTP 요청 기본 헤더 값 조회 방법

by ymkim

01. 요청 매핑

  • 요청 매핑이란 요청이 왔을 때 어떤 컨트롤러가 호출이 될지 매핑하는 방법

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) {
    // ...
}

https://mungto.tistory.com/438

  • 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

블로그의 정보

기록하고, 복기하고

ymkim

활동하기