Request Mapping 2

사나이장대산·2024년 11월 1일

Spring

목록 보기
7/26
post-thumbnail

특정 파라미터 매핑

속성 설정을 통하여 특정 헤더, 특정 파라미터와 Mapping 할 수 있다.

1. Parameter 추가 매핑

- 특정 파라미터와 매핑하는 방법
package com.example.springbasicannotation.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ParameterController {

    // parms 속성값 추가
    @GetMapping(value = "/users", params = "gender=man")
    public String params() {
        // logic
        String result = "params API가 호출 되었습니다.";
        return result;
    }

}
  • 실제 URL GET http://localhost:8080/users**?gender=man** 파라미터가 있어야 호출된다.
  • 실행결과

  • 속성 작성 규칙

    1. params = "gender"
      • params의 key값은 커스텀이 가능하다
      • value는 없어도 된다.
    2. params = "!gender"
      • gender가 없어야 한다.
    3. params = "gender=man"
      • gender=man 이어야 한다.
    4. params = "gender!=man"
      • params의 value값이 man가 아니여야 한다.
    5. params = {"gender=man", "gender=woman"}
      • 배열로 속성 값을 여러 개 설정이 가능하다.
  • 파라미터가 없을 시

2. 특정 Header 매핑

  • 특정 Header와 매핑하는 방법
@RestController
public class ParameterController {
	
	// headers 속성값 추가
  @PostMapping(value = "/users", headers = "Content-Type=application/json")
  public String headers() {
      // logic
      String result = "headers API가 호출 되었습니다.";
      return result;
  }
	
}

Postman → Body → raw → JSON

속성 작성 규칙은 위 params 속성 값의 규칙과 같다.

3. Mediatype 매핑, consume(수용)

  • HTTP Header Content-Type(요청)과 매핑 된다.
@RestController
public class ParameterController {
	
	// consumes 속성값 추가
  @PostMapping(value = "/users", consumes = "application/json") // MediaType.APPLICATION_JSON_VALUE
  public String consumes() {
      // logic
      String result = "consumes API가 호출 되었습니다.";
      return result;
  }
	
}
  • consumes 속성 value값으로는 이미 Spring에서 제공되는 Enum인 MediaType.APPLICATION_JSON_VALUE 형태로 사용한다.

  • Postman → Body → raw → JSON

  • Postman → Headers → Content-Type → Value

  • 파라미터가 없거나 다르다면?

  • HTTP 상태코드 405 Unsupported Media Type Exception 발생

  • 속성 작성 방법

    1. consumes=”application/json”
      • application/json 미디어 타입 허용
    2. consumes=”!application/json”
      • application/json 제외 미디어 타입 허용
    3. consumes=”application/*”
      • application/ 으로 시작하는 모든 미디어 타입 허용
    4. consumes=”*\/*”
      • 모두 허용

MediaType 매핑 produces(제공)

  • 요청 헤더의 Accept 값에 따라서 produces 하는 값이 변한다.
@RestController
public class ParameterController {
	
	// produces 속성값 추가
  @GetMapping(value = "/users", produces = "text/plain")
  public String produces() {
      // logic
      String result = "text/plain 데이터 응답";
      return result;
  }
	
}
  • HTTP 요청 Accept Header에 Media Type이 있어야한다.

*/* : 전체 Media Type 허용

  • 실행 결과
  • consumes 속성 사용법과 같다.
  • 위에 나온 모든 MediaType은 Spring이 제공하는 Enum을 사용하면 된다.

ex) produces = “application.json"→ produces = MediaType.APPLICATION_JSON_VALUE

Spring이 지원하는 Parameter

어노테이션 기반 Spring의 Controller는 다양한 파라미터를 쉽게 사용할 수 있도록 지원한다.

  • HTTP Header 조회
    • Spring에서 요청 Heade에 쉽게 접근할 수 있다.
  • Controller 예시
// 로깅
@Slf4j
@RestController
public class RequestHeaderController {

    @GetMapping("/request/headers")
    public String headers(
            HttpServletRequest request, // Servlet에서 사용한것과 같음
            HttpServletResponse response, // Servlet에서 사용한것과 같음
            @RequestHeader MultiValueMap<String, String> headerMap,
            @RequestHeader("host") String host,
            @CookieValue(value = "cookie", required = false) String cookie,
            HttpMethod httpMethod,
            Locale locale
    ) {
		    // Servlet
        log.info("request={}", request);
        log.info("response={}", response);
        
        // @RequestHeader
        log.info("headerMap={}", headerMap);
        log.info("host={}", host);
        
        // @CookieValue
        log.info("cookie={}", cookie);
        
        // HttpMethod
        log.info("httpMethod={}", httpMethod);
        
        // Locale
        log.info("Locale={}", locale);

        return "success";
    }
}

-PostmanAPI호출

  • Log 출력결과
  1. request
    • HttpServletRequest 객체 주소 값
  2. response
    • HttpServletRequest 객체 주소 값
  3. headerMap :
hashMap={
	user-agent=[PostmanRuntime/7.35.0], 
	accept=[*/*], 
	postman-token=[5f324c1c-7902-4750-9e01-2c4d093e8ad6],
	host=[localhost:8080],
	accept-encoding=[gzip, deflate, br],
	connection=[keep-alive]
}
  1. host
    • host 정보
  2. cookie
    • Header의 Cookie 값
  3. httpMethod
    • 호출에 사용한 HttpMethod
  4. Locale
    • 위치 정보를 나타내는 헤더
    • 우선순위가 존재한다.

MultuVlaueMap

Map과 유사하게 Key, Value 형식으로 구현되어 있지만 하나의 Key가 여러 Value를 가질 수 있다 HTTP Header, Reqeust Parameter와 같이 하나의 Key에 여러 값을 받을 때 사용한다.

ex) key1=value1&key1=value2

  • 예시코드
MultiValueMap<String, String> linkedMultiValuemap = new LinkedMultiValueMap();

// key1에 value1 저장
linkedMultiValuemap.add("key1", "value1");
// key1에 value2 저장
linkedMultiValuemap.add("key1", "value2");

// key1에 저장된 모든 value get
List<String> values = linkedMultiValuemap.get("key1");
profile
사나이 張大山 포기란 없다.

0개의 댓글