Spring - 요청 지원 기능

김승호·2024년 12월 17일
0

SPRING - 요청 기능들

1. 요청 매핑

1. @RequestMapping

1) method 속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게 호출된다. (모두 허용 GET, HEAD, POST, PUT, PATCH, DELETE)
2) 스프링 부트 3.0 부터는 기존에는 마지막에 있는 /hello-basic , /hello-basic/ 는 서로 다른 URL 요청을 사용해야 한다.

2. 축약 HttpMethod

1) @GetMapping
2) @PostMapping
3) @PutMapping
4) @DeleteMapping
5) @PatchMapping

2. 요청 매핑 속성

1. @PathVariable

1) 경로에 있는 변수를 매개변수로 받아서 컨트롤러에 사용할 수 있는 속성이다.
2) pathVariable 다중 매핑이 가능하다.

    @RequestMapping("/mapping/{userId}")
    public String helloBasic1(
            @PathVariable String userId
    ){
        log.info("mappingPath userID={}",userId);
        return "ok";
    }

{userId}을 받아서 Controller 내부에서 사용이 가능하다.

2. params

1) 해당 쿼리가 없을 경우 Error을 발생 시키는 속성이다.
2) 없을 경우 400 Error가 발생한다.

    @GetMapping(value = "/mapping-param", params = "mode=debug")
    public String mappingParam() {
        log.info("mappingParam");
        return "ok";
    }

3. header

1) 해당 헤더가 없을 경우 Error을 발생 시키는 속성이다.
2) 없을 경우 404 Error가 발생한다.

    @GetMapping(value = "/mapping-header", headers = "mode=debug")
    public String mappingHeader() {
        log.info("mappingHeader");
        return "ok";
    }

4. consumes (Content-Type)

1) 해당 Content-Type이 아닐 경우 Error을 발생 시키는 속성이다.

    @PostMapping(value = "/mapping-consume", consumes = "application/json")
    public String mappingConsumes() {
        log.info("mappingConsumes");
        return "ok";
    }

5. produces (Accept)

1) 해당 Accept이 아닐 경우 Error을 발생 시키는 속성이다.

@PostMapping(value = "/mapping-produce", produces = "text/html")
    public String mappingProduces() {
        log.info("mappingProduces");
        return "ok";
    }

3. 요청 매개변수

1. 파라미터

1. @RequestParam

1) 요청 파라미터(쿼리 등)를 매개변수로 받는다.

  • 1) @RequestParam("username")
    2) @RequestParam = 변수이름이 파라미터명이랑 같을 경우 생략가능
@RequestMapping("/request-param-v2")
    @ResponseBody
    public String requestParamV2(
            @RequestParam("username") String username,
            @RequestParam("age") int age
    )
    {
        log.info("username : {}",username);
        log.info("age : {}",age);
        return "ok";
    }

3) @RequestParam 생략 시 (생략도 가능)
속성에서 required=false를 적용시킴으로 주의한다.
required=false 일 경우 파라미터 null 허용
required=true 일 경우 파라미터 null 불가 (default)

2. @ModelAttribute

1) ModelAttribute를 통해 객체로 파라미터를 바로 받을 수 있다.

2) ModelAttribute 사용 시 자동으로 model에 값이 등록된다.
    @RequestMapping("/model-attribute-v1")
    @ResponseBody
    public String modelAttributeV1(@ModelAttribute HelloData helloData)
    {
        log.info("username : {}",helloData.getUsername());
        log.info("age : {}",helloData.getAge());
        return "ok";
    }

2) @ModelAttribute 생략 가능
3. HttpServletRequest 을 불러서 직접 받기

2. Message Body - 단순 텍스트

1. @RequestBody

public String requestBodyStringV4(@RequestBody String messageBody) {
        log.info(messageBody);
        return "ok";
}

2. HttpEntity

  1. InputStream inputStream
  2. HttpServletRequest request

3. Message Body - Json

1. @RequestBody

    @PostMapping("/request-body-json-v5")
    @ResponseBody
public HelloData requestBodyJsonV5(@RequestBody HelloData helloData)
    {
        log.info("username = {}",helloData.getUsername());
        log.info("age = {}",helloData.getAge());
        return helloData;
    }

2. HttpEntity

    @PostMapping("/request-body-json-v4")
    @ResponseBody
    public String requestBodyJsonV4(HttpEntity<HelloData> requestBody)
    {
        HelloData helloData = requestBody.getBody();
        return "ok";
    }
  1. InputStream inputStream
  2. HttpServletRequest request

4. Redirect 시

1. RedirectAttributes

1) Spring MVC에서 리다이렉트 시 데이터를 전달하기 위해 사용하는 인터페이스입니다.
2) RedirectAttributes VS Model
데이터 유지 범위 : 리다이렉트된 후에도 데이터 유지 VS 현재 요청에서만 데이터 유효

@PostMapping("/submit")
public String handleSubmit(RedirectAttributes redirectAttributes) {
    redirectAttributes.addFlashAttribute("message", "Data saved successfully!");
    return "redirect:/result";
}

Message Body - Tip

  1. @ResponeBody에 상태코드 사용하고 싶다면 @ResponseStatus 사용
	@PostMapping("/request-body-json-v5")
	@ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public HelloData requestBodyJsonV5(@RequestBody HelloData helloData)
    {
        return helloData;
    }
  1. 상태코드를 런타임에서 바꿔야 할 경우 ResponseEntity 사용
    @PostMapping("/request-body-json-v4")
    @ResponseBody
    public ResponseEntity<HelloData> requestBodyJsonV4(HttpEntity<HelloData> requestBody)
    {
        HelloData helloData = requestBody.getBody();
        return new ResponseEntity<>(helloData, HttpStatus.BAD_REQUEST);
    }

참고

스프링 MVC 1편

profile
백준 : https://www.acmicpc.net/user/tmdghdhkdw (골드 - 2)

0개의 댓글