# Spring MVC ๊ธฐ๋ณธ ๊ธฐ๋Šฅ - ์š”์ฒญ ๋งคํ•‘ @RequestMapping, @RequestParam
Study Repository

Spring MVC ๊ธฐ๋ณธ ๊ธฐ๋Šฅ - ์š”์ฒญ ๋งคํ•‘ @RequestMapping, @RequestParam

by rlaehddnd0422

์š”์ฒญ ๋งคํ•‘

MappingController.java

@RequestMapping ์ถ•์•ฝ - @GetMapping, @PostMapping ๋“ฑ๋“ฑ ..

@RestController
public class MappingController {

    private Logger log = LoggerFactory.getLogger(getClass());

    /**
    ํŽธ๋ฆฌํ•œ @RequestMapping ์ถ•์•ฝ ์–ด๋…ธํ…Œ์ด์…˜
    @GetMapping
    @PostMapping
    @DeleteMapping
    @PatchMapping
    @PutMapping
     */
    @GetMapping(value = "/hello-basic")
    public String helloBasic() {
        log.info("helloBasic");
        return "ok";
    }
@RestController 
: @Controller๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์ด String ์ด๋ฉด ๋ทฐ ์ด๋ฆ„์œผ๋กœ ์ธ์‹ํ•ด์„œ ๋ทฐ๋ฅผ ์ฐพ๊ณ  ๋ทฐ๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐ˜๋ฉด @RestController๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ๋ทฐ๋ฅผ ์ฐพ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, String์„ HTTP ๋ฐ”๋””์— ๋ฐ”๋กœ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
@RequestMapping("/hello-basic")
: /hello-basic URL์ด ํ˜ธ์ถœ๋˜๋ฉด ์ด ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ๋งคํ•‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ ์†์„ฑ์„ ๋ฐฐ์—ด[]๋กœ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์ค‘ ์„ค์ • ๋˜ํ•œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๋ฉ”์†Œ๋“œ ๋˜ํ•œ ์ถ•์•ฝ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@GetMapping : GET ์š”์ฒญ์ผ ๊ฒฝ์šฐ๋งŒ ํ˜ธ์ถœ  (= @RequestMapping(value="", method = RequestMethod.GET)
@PostMapping : Post ์š”์ฒญ์ผ ๊ฒฝ์šฐ๋งŒ ํ˜ธ์ถœ  
@DeleteMapping : Delete ์š”์ฒญ์ผ ๊ฒฝ์šฐ๋งŒ ํ˜ธ์ถœ 
@PatchMapping : Patch ์š”์ฒญ์ผ ๊ฒฝ์šฐ๋งŒ ํ˜ธ์ถœ 
@PutMapping : Put ์š”์ฒญ์ผ ๊ฒฝ์šฐ๋งŒ ํ˜ธ์ถœ 

Logic : /hello-basic URL ํ˜ธ์ถœ โ–ถ๏ธŽ helloBasic() ๋ฉ”์†Œ๋“œ ์‹คํ–‰ โ–ถ๏ธŽ helloBasic log โ–ถ๏ธŽ HTTP ๋ฐ”๋””์— "ok" ๋ฆฌํ„ด 

 

@PathVariable ๊ฒฝ๋กœ ๋ณ€์ˆ˜

/**
@PathVariable
 */

@GetMapping("/mapping/{userId}/{orderId}")
public String mappingPath(@PathVariable("userId") String userId, @PathVariable("orderId") String orderId) {
    log.info("mappingPath userId ={}, orderId={}", userId, orderId);

    return "Ok";
}
@PathVariable
: ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์— @PathVariable๋ฅผ ์‚ฌ์šฉํ•ด ๊ฒฝ๋กœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ—๏ธ@PathVariable ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๋งคํ•‘๋œ URL ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ๊ฐ™๋‹ค๋ฉด @PathVariable์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* @PathVariable("userId") String userId, @PathVariable("orderId") String orderId โ–ถ๏ธŽ @PathVariable String userId, @PathVariable String orderId

@RequestMapping - ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐ๊ฑด ๋งคํ•‘ (params)

/**
 * ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ถ”๊ฐ€ ๋งคํ•‘
 * 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";
}

 ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†๋Š” ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ์‚ฌ์šฉํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ : localhost:8080/mapping-param?mode=debug

@RequestMapping - ํŠน์ • ํ—ค๋” ์กฐ๊ฑด ๋งคํ•‘ (header)

/**
 *ํŠน์ • ํ—ค๋”๋กœ ์ถ”๊ฐ€ ๋งคํ•‘
 * 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";
}
ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ HTTP ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Postman์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

header ์กฐ๊ฑด ์ถ”๊ฐ€ ํ•˜์ง€ ์•Š๊ณ  Send / header ์กฐ๊ฑด ์ถ”๊ฐ€ํ•˜๊ณ  Send

@RequestMapping - ํ—ค๋” ๊ธฐ๋ฐ˜ ์ถ”๊ฐ€ ๋งคํ•‘ Media Type (consumes)

/**
 * Content-Type ํ—ค๋” ๊ธฐ๋ฐ˜ ์ถ”๊ฐ€ ๋งคํ•‘ Media Type
 * consumes="application/json"
 * consumes="!application/json"
 * consumes="application/*"
 * consumes="*\/*"
 * MediaType.APPLICATION_JSON_VALUE
 */
@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsumes() {
    log.info("mappingConsumes");
    return "ok";
}
HTTP ์š”์ฒญ์˜ Content-Type ํ—ค๋”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฏธ๋””์–ด ํƒ€์ž…์œผ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ๋งž์ง€ ์•Š์œผ๋ฉด HTTP 415 ์ƒํƒœ์ฝ”๋“œ(Unsupported Media Type)๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

HTTP ํ—ค๋”์— Content-type์„ ์„ค์ •ํ•˜๊ธฐ ์ „ / ํ›„ 

 

Accept ํ—ค๋” ๊ธฐ๋ฐ˜ Media Type ์ฝ˜ํ…์ธ  ๋„ค๊ณ ์‹œ์—์ด์…˜ ( produces )

Accpet ํ—ค๋”๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

https://rlaehddnd0422.tistory.com/45

 

HTTP ํ‘œํ˜„ ํ—ค๋”

message body(ํŽ˜์ด๋กœ๋“œ)๋ฅผ ํ†ตํ•ด ํ‘œํ˜„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ‘œํ˜„ ๋ฐ์ดํ„ฐ๋Š” ์š”์ฒญ์ด๋‚˜ ์‘๋‹ต์—์„œ ์ „๋‹ฌํ•  ์‹ค์ œ ๋ฐ์ดํ„ฐ ํ‘œํ˜„ ํ—ค๋”๋Š” ํ‘œํ˜„ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณต ํ•ด์„ ์ •๋ณด -> ๋ฐ์ดํ„ฐ ์œ ํ˜•,

rlaehddnd0422.tistory.com

/**
 * Accept ํ—ค๋” ๊ธฐ๋ฐ˜ Media Type ( ์ฝ˜ํ…์ธ  ๋„ค๊ณ ์‹œ์—์ด์…˜ )
 * produces = "text/html"
 * produces = "!text/html"
 * produces = "text/*"
 * produces = "* \/*"
*/
@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduces() {
    log.info("mappingProduces");
    return "ok";
}
HTTP ์š”์ฒญ์˜ Accept ํ—ค๋”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฏธ๋””์–ด ํƒ€์ž…์œผ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ๋งž์ง€ ์•Š์œผ๋ฉด HTTP 406 ์ƒํƒœ์ฝ”๋“œ(Not Acceptable)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
produces ํŒŒ๋ผ๋ฏธํ„ฐ ์˜ˆ์‹œ
  produces = "text/plain"
  produces = {"text/plain", "application/*"}
  produces = MediaType.TEXT_PLAIN_VALUE
  produces = "text/plain;charset=UTF-8"

์š”์ฒญ ๋งคํ•‘ - API ์˜ˆ์‹œ

@RestController // @Controller + @ResponseBody
@RequestMapping("/mapping/users")
public class MappingClassController {

    /**
     * ํšŒ์› ๊ด€๋ฆฌ API
     *
     * ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ: 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 user";
    }

    @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;
    }
}
  • @RequestMapping("/mapping/users") : ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— ๋งคํ•‘ ์ •๋ณด๋ฅผ ๋‘๋ฉด ๋ฉ”์†Œ๋“œ ๋ ˆ๋ฒจ์—์„œ ํ•ด๋‹น ์ •๋ณด๋ฅผ Prefix๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ œ ๋งคํ•‘ ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ–ˆ์œผ๋‹ˆ, ์ด์ œ๋ถ€ํ„ฐ HTTP ์š”์ฒญ์ด ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์Šคํ”„๋ง MVC๋กœ ์–ด๋–ป๊ฒŒ ์กฐํšŒํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

HTTP ์š”์ฒญ - ๊ธฐ๋ณธ, ํ—ค๋” ์กฐํšŒ

์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์Šคํ”„๋ง ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋‹ค์–‘ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Request, Response์— ๋Œ€ํ•œ HTTP ํ—ค๋” ๋˜ํ•œ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@Slf4j
@RestController
public class RequestHeaderController {

    @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";

    }
}

HTTP ํ—ค๋”๋ฅผ ์กฐํšŒํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š”  ๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์กฐํšŒํ•˜๊ณ  ์‹ถ์€ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” ArgumentResolver๋ผ๋Š” ํˆด์„ ์ด์šฉํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด๋ ‡๊ฒŒ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.

ArgumentResolver์— ๋Œ€ํ•ด์„œ๋Š” ๋’ค์—์„œ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

HTTP ํ—ค๋” log ์ •๋ณด

  • HttpServletRequest, HttpServletResponse 
  • HttpMethod : HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค (org.springframework.http.HttpMethod)
  • Locale : Locale ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
  • @RequestHeader MultiValueMap<String, String > headerMap : ๋ชจ๋“  HTTP ํ—ค๋”๋ฅผ MultiValueMap ํ˜•์‹์œผ๋กœ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
    • MultiValueMap์€  ํ‚ค์˜ ์ค‘๋ณต์ด ํ—ˆ์šฉ๋œ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ํ‚ค๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ value๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ.
    • https://taehoung0102.tistory.com/182
 

์ž๋ฐ” Map ๊ณผ MultiValueMap์˜ ๋Œ€ํ•ด์„œ

์ด๋ฒˆ์— ์ƒˆ๋กญ๊ฒŒ ์žฌ๋ฏธ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์› ๋‹ค. ๋ฐ”๋กœ MultiValueMap์ด๋‹ค. MultiValueMap์„ ์•Œ๊ธฐ์ „์— ๊ธฐ์กด์— ์žˆ๋˜ Map๊ณผ ๋ฌด์—‡์ด ๋‹ค๋ฅธ์ง€ ํ•œ๋ฒˆ ๋น„๊ต๋ฅผํ•ด๋ณด์ž. Map์€ ํฌ๊ฒŒ 3๊ฐ€์ง€ 1. HashMap 2. TreeMap 3. LinkedHashMap HashMa

taehoung0102.tistory.com

 

  • @RequestHeader("host") String host : ํŠน์ • HTTP ํ—ค๋”๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
    • ํ•„์ˆ˜ ๊ฐ’ ์—ฌ๋ถ€ : required ๋กœ ์ง€์ •
    • ๊ธฐ๋ณธ ๊ฐ’ : defaultValue
  • @CookieValue(value="myCookie", required = false ) String Cookie : ํŠน์ • ์ฟ ํ‚ค๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
    • ํ•„์ˆ˜ ๊ฐ’ ์—ฌ๋ถ€ : required
    • ๊ธฐ๋ณธ ๊ฐ’ : defaultValue

1 , 2.  HTTP ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ - ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ(GET) , HTML Form(POST)

HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

1. ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•œ ์ „์†ก(GET)

  • /url?username=hello&age=20
  • ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์—†์ด ์ˆœ์ˆ˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์„œ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹
  • ์ฃผ๋กœ ๊ฒ€์ƒ‰, ํ•„ํ„ฐ, ํŽ˜์ด์ง•๋“ฑ์—์„œ ์“ฐ๋Š” ๋ฐฉ์‹

2. HTML Form ์„ ํ†ตํ•œ ์ „์†ก(POST)

  • content-type : application/x-www-form-urlencoded
  • ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ username=hello&age=20
  • ํšŒ์›๊ฐ€์ž…์ด๋‚˜ ์ƒํ’ˆ ์ฃผ๋ฌธ ๋“ฑ์—์„œ HTML Form์„ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

3. HTTP message body์— ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์„œ ์ „์†ก

  • HTTP API์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ. JSON, XML, TEXT
  • ๋ฐ์ดํ„ฐ ํ˜•์‹์€ ์ฃผ๋กœ JSON์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • PUT, PATCH, POST 
@RequestMapping("/request-param-v1")
public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException
{
    String username = request.getParameter("username");
    int age = Integer.parseInt(request.getParameter("age"));
    log.info("username = {}, age={}", username, age);

    PrintWriter writer = response.getWriter();
    writer.write("ok");
}

GET ๋ฐฉ์‹ ์ „์†ก

 

POST ๋ฐฉ์‹ ์ „์†ก

 HttpServletRequest์˜ request.getParameter()์„ ์‚ฌ์šฉํ•˜๋ฉด POST, GET ๋ฐฉ์‹ ๋ชจ๋‘ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๊ฐ„๋‹จํžˆ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ (request parameter) ์กฐํšŒ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ์Šคํ”„๋ง์œผ๋กœ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„์ ์œผ๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


HTTP ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ -@RequestParam

@RequestParam  V2 - ๊ธฐ๋ณธ

// @RequestParam ์‚ฌ์šฉ - String, int, Integer ๊ฐ™์€ ๋‹จ์ˆœ ํƒ€์ž…
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(@RequestParam("username") String username,
                           @RequestParam("age") int age) throws IOException
{
    log.info("username = {}, age={}", username, age);
    return "OK";
}

์ด ์ „์—์„œ๋Š” HttpServletRequest๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ–ˆ์ง€๋งŒ,

@RequestParam ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์„œ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

@RequestParam์˜ name(value) ์†์„ฑ์ด ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ

@RequestParam("username") String memberName โžฃ request.getParameter("username")

 

@RequestParam : ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์œผ๋กœ ๋ฐ”์ธ๋”ฉ
@Responsebody : View ์กฐํšŒ ๋ฌด์‹œ, HTTP message body์— ์ง์ ‘ ํ•ด๋‹น ๋‚ด์šฉ ์ž…๋ ฅ

v2 GET
v2 POST
v2 log

@RequestParam V3 - value ์ƒ๋žต

/**
 * @PathVaraiable ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ
 * @RequestParam ๋˜ํ•œ value ์™€ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด๋ž‘ ๊ฐ™์œผ๋ฉด value ์ƒ๋žต ๊ฐ€๋Šฅ
 */

@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(@RequestParam String username,
                             @RequestParam int age) throws IOException
{
    log.info("username = {}, age={}", username, age);
    return "OK";
}

@PathVariable๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ @RequestParam์—์„œ๋„ ๋ณ€์ˆ˜์ด๋ฆ„๊ณผ value๊ฐ€ ๊ฐ™์œผ๋ฉด value๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@RequestParam V4 - @RequestParam ์ƒ๋žต

/**
 *
 * @param username
 * @param age
 * @return
 * @throws IOException
 *
 * @RequestParam๋„ ์ƒ๋žต ๊ฐ€๋Šฅ. ๊ทผ๋ฐ ๊ถŒ์žฅํ•˜์ง„ ์•Š์Œ.
 */
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username, int age) throws IOException
{
    log.info("username = {}, age={}", username, age);
    return "OK";
}

์‹ฌ์ง€์–ด String, int, Integer์™€ ๊ฐ™์€ ๋‹จ์ˆœ ํƒ€์ž…์ผ ๊ฒฝ์šฐ์—๋Š” @RequestParam๋„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทผ๋ฐ ๋ช…์‹œ์ ์ด์ง€ ์•Š์•„ ์ฝ๋Š” ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์–ด์š”. ๊ถŒ์žฅํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค.

 

@RequestParam - required ์˜ต์…˜ , defaultValue ์˜ต์…˜

// required ์˜ต์…˜
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
        @RequestParam(required = true) String username,
        @RequestParam(required = false) Integer age) {  // Integer ๋Š” null ์ง€์›
    log.info("username={}, age={}", username, age);
    return "OK";
}
// defaultValue ์˜ต์…˜
// ๋นˆ ๋ฌธ์ž("")๊นŒ์ง€ defaultValue๋กœ ์ฒ˜๋ฆฌ
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(
        @RequestParam(required = true, defaultValue = "guest") String username,
        @RequestParam(required = false, defaultValue = "1") Integer age) {
    log.info("username={}, age={}", username, age);
    return "OK";
}
  • required ์˜ต์…˜์„ true๋กœ ์„ค์ •ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์š”์ฒญ ์‹œ ํ•„์ˆ˜์ ์œผ๋กœ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์˜ : ๋นˆ ๋ฌธ์ž("")๋„ ํ†ต๊ณผํ•จ (?username=""&age=20)
  • defaultValue ์˜ต์…˜์„ ์„ค์ •ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์š”์ฒญ ์‹œ ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉด defaultValue๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • defaultValue๋ฅผ true๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ required ์˜ต์…˜์€ ์˜๋ฏธ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค ( ๋””ํดํŠธ๋กœ ๊ฐ’์ด ์„ค์ •๋˜๋ฏ€๋กœ )
  • defaultValue๋Š” ๋นˆ ๋ฌธ์ž์˜ ๊ฒฝ์šฐ์—๋„ ์„ค์ •ํ•œ ๊ธฐ๋ณธ ๊ฐ’์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

@RequestParam - Map, MultiMap์„ ํ†ตํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ

/**
 *
 * @param paramMap
 * @return
 */
@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String,Object> paramMap)
{
    log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
    return "OK";
}


/**
 *
 * @param paramMultiMap
 * @return
 */
@ResponseBody
@RequestMapping("/request-param-Multimap")
public String requestParamMap(@RequestParam MultiValueMap<String, Object> paramMultiMap)
{
    log.info("username={}, age={}", paramMultiMap.get("username"), paramMultiMap.get("age"));
    return "OK";
}

 

ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ MultiMap ์‚ฌ์šฉ
MultiMap log

  • ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Map, MultiMap์„ ํ†ตํ•ด ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์ด 1๊ฐœ๊ฐ€ ํ™•์‹คํ•˜๋‹ค๋ฉด Map ์„ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด MultiValueMap ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค.

HTTP ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ -@ModelAttribute

 

๋จผ์ € ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

@Data
public class HelloData {
    private String username;
    private int age;
}

@Data - Lombok ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ @Setter, @Getter, @Tostring, @EqualsAndHashCode, @RequiredArgsConstructor๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์‹ค์ œ ๊ฐœ๋ฐœ์„ ํ• ๋•Œ์—๋Š” ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„, ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ๊ฐ์ฒด์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

@ResponseBody
@RequestMapping("/model-attribute-v0")
public String modelAttributeV0(@RequestParam String username, @RequestParam int age)
{
    HelloData data = new HelloData();
    data.setAge(age);
    data.setUsername(username);
    log.info("username = {} , age = {} ", username, age);

    return "ok";
}

ํ•˜์ง€๋งŒ ์Šคํ”„๋ง์€ ์ด ๊ณผ์ •์„ ์™„์ „ํžˆ ์ž๋™ํ™” ํ•ด์ฃผ๋Š” @ModelAttribute ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

 

@ModelAttribute V1 

@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData)
{
    log.info("username = {} , age = {} ", helloData.getUsername(), helloData.getAge());
    log.info("data = {}",helloData);

    return "ok";
}

 ์Šคํ”„๋ง MVC์—์„œ๋Š” @ModelAttribute๊ฐ€ ์žˆ์œผ๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

1.  HelloData ๊ฐ์ฒด ์ƒ์„ฑ

2.  ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์œผ๋กœ HelloData ๊ฐ์ฒด์˜ property( username, age )๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

3.  ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ setter๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ์ž…๋ ฅ(๋ฐ”์ธ๋”ฉ)ํ•ด์„œ ๊ฐ์ฒด์— ๊ฐ’์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

ex) username -> setUsername() ๋ฉ”์†Œ๋“œ ์ฐพ์•„์„œ ๊ฐ’ ์ฃผ์ž…

 

โ—๏ธ๋ฐ”์ธ๋”ฉ ์˜ค๋ฅ˜ : age=abc ์ฒ˜๋Ÿผ ์ˆซ์ž๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ• ๊ณณ์— ๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด BindException ์˜ˆ์™ธ ๋ฐœ์ƒ. ์ด๋Ÿฐ ๋ฐ”์ธ๋”ฉ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฒ€์ฆ ๋ถ€๋ถ„์—์„œ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ํŒจ์Šค

 

@ModelAttribute ์ƒ๋žต 

// @ModelAttribute ๋˜ํ•œ ์ƒ๋žต ๊ฐ€๋Šฅ.
// ํ•˜์ง€๋งŒ @RequestParam ๋„ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋ž€์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
// ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ.
@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(HelloData helloData)
{
    log.info("username = {} , age = {} ", helloData.getUsername(), helloData.getAge());
    log.info("data = {}",helloData);

    return "ok";
}

3. HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ - ๋‹จ์ˆœ ํ…์ŠคํŠธ 

์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋‹ค๋ฅด๊ฒŒ HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ง์ ‘ ๋„˜์–ด์˜ค๋Š” ๊ฒฝ์šฐ์—๋Š” @RequestParam๊ณผ @ModelAttribute๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  HTML Form ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ธ์ •๋˜๊ธด ํ•˜์ง€๋งŒ.

 

๋จผ์ € ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋‹ด์•„ ์ „์†กํ•˜๊ณ  ์ฝ์–ด๋ด…์‹œ๋‹ค.

HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋ฐ์ดํ„ฐ๋Š” InputStream์„ ์‚ฌ์šฉํ•ด ์ง์ ‘ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@PostMapping("/request-body-string-v1")
public void requestBodyString(HttpServletRequest request, HttpServletResponse response) throws IOException {
    ServletInputStream inputStream = request.getInputStream();
    String messagebody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

    log.info("message body = {}", messagebody);

    PrintWriter writer = response.getWriter();
    writer.write("ok");
}

 

Body : Text-raw

 

log

 

์ด์ œ ์Šคํ”„๋ง MVC๊ฐ€ ์ง€์›ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์ฝ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

InputStream, OuputStream(Writer) ์‚ฌ์šฉํ•œ ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์ถœ๋ ฅ

/**
 * @param inputStream    : HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋‚ด์šฉ์„ ์ง์ ‘ ์กฐํšŒ
 * @param responseWriter : HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€์˜ ๋ฐ”๋””์— ์ง์ ‘ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
 * @return
 * @throws IOException
 */
@PostMapping("/request-body-string-v2")
public void requestBodyStringV2(InputStream inputStream, Writer responseWriter) throws IOException {
    String messagebody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
    log.info("messageBody = {}", messagebody);
    responseWriter.write("ok");
}

์Šคํ”„๋ง MVC๋Š” ๋‹ค์Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • InputStream(Reader): HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋‚ด์šฉ์„ ์ง์ ‘ ์กฐํšŒ
  • OutputStream(Writer): HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€์˜ ๋ฐ”๋””์— ์ง์ ‘ ๊ฒฐ๊ณผ ์ถœ๋ ฅ

v2 Post ์ „์†ก

 

log ์ถœ๋ ฅ

 

HttpEntity๋ฅผ ํ†ตํ•œ ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์กฐํšŒ

    /**
     * HttpEntity ํŒจํ‚ค์ง€ ์‚ฌ์šฉ
     * @param httpEntity
     * @return
     * @throws IOException
     */
    @PostMapping("/request-body-string-v3")
    public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException {

        String messagebody = httpEntity.getBody();
        log.info("messageBody = {}", messagebody);

        return new HttpEntity<String>("ok");

//        return new ResponseEntity<>("ok", HttpStatus.CREATED);
    }

 

HttpEntity ๋Š” HTTP ํ—ค๋”, body ์ •๋ณด๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

์š”์ฒญ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‘๋‹ต์—์„œ๋„ HttpEntity๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํ”„๋ง MVC๋Š” ๋‹ค์Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • HttpEntity: HTTP header, body ์ •๋ณด๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒ
    • ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์ •๋ณด๋ฅผ ์ง์ ‘ ์กฐํšŒ
    • ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๊ด€๊ณ„ ์—†์Œ @RequestParam X, @ModelAttribute X
  • HttpEntity๋Š” ์‘๋‹ต์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์ •๋ณด ์ง์ ‘ ๋ฐ˜ํ™˜
    • ํ—ค๋” ์ •๋ณด ํฌํ•จ ๊ฐ€๋Šฅ
    • view ์กฐํšŒX

RequestEntity, ResponseEntity๋Š” HttpEntity๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด๋กœ 

RequestEntity๋Š” HttpMethod, url ์ •๋ณด๊ฐ€ ์ถ”๊ฐ€๋˜์–ด , request์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ResponseEntity๋Š” HTTP ์ƒํƒœ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , response์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

@RequestBody๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์กฐํšŒ

/**
 * @RequestBody ์‚ฌ์šฉ - ์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹
 * @param messageBody
 * @return
 */
@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody)
{
    log.info("message body = {}",messageBody);
    return "OK";
}

@RequestBody๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ํ—ค๋” ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด HttpEntity๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ @RequestHeader๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

์ด๋ ‡๊ฒŒ ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์ง์ ‘ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” @RequestParam, @ModelAttribute์™€๋Š” ์ „ํ˜€ ๊ด€๊ณ„๊ฐ€ ์—†๋‹ค๋Š” ์ ์„ ์•Œ์•„๋‘ก์‹œ๋‹ค.

 

์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ : @RequestParam, @ModelAttribute

๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์กฐํšŒ : @RequestBody

 

3. HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ - JSON

๋‹จ์ˆœ ํ…์ŠคํŠธํ˜•์‹์˜ ๋ฉ”์‹œ์ง€๋ฐ”๋””์™€ Jsonํ˜•์‹์˜ ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์กฐํšŒ๋Š” ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์šฐ์„  MVC ์ ์šฉ ์ด์ „์˜ Json ํ˜•์‹์˜ ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์กฐํšŒ ๋ฐฉ๋ฒ•์€

@PostMapping("/request-body-json-v1")
public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException
{
    ServletInputStream inputStream = request.getInputStream();
    String messagebody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

    log.info("messageBody={}",messagebody);
    HelloData data = objectMapper.readValue(messagebody,HelloData.class);
    log.info("username = {} , age = {}", data.getUsername(), data.getAge());

    PrintWriter writer = response.getWriter();
    writer.write("Ok");
}

 ์ด๋ ‡๊ฒŒ inputStream์œผ๋กœ messagebody๋ฅผ ์ฝ์–ด ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค ๋ฌธ์ž๋กœ ๋œ json ๋ฐ์ดํ„ฐ๋ฅผ jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ objectMapper๋ฅผ ์‚ฌ์šฉํ•ด ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ์—ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋‹จ์ˆœ ํ…์ŠคํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ JSON์—์„œ๋„ @RequestBody๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

HttpServletRequest โ–ถ๏ธŽ @RequestBody 

// V2
// @RequestBody (์ƒ๋žต ๋ถˆ๊ฐ€๋Šฅ, ์ƒ๋žต ์‹œ @ModelAttribute๊ฐ€ ์ ์šฉ๋˜์–ด ๋ฒ„๋ฆผ)
@ResponseBody
@PostMapping("/request-body-json-v2")
public String requestBodyJsonV2(@RequestBody String messagebody) throws IOException
{
    HelloData data = objectMapper.readValue(messagebody, HelloData.class);
    log.info("username = {} , age = {}", data.getUsername(), data.getAge());
    return "Ok";
}

๋‹จ์ˆœ ํ…์ŠคํŠธ์ฒ˜๋Ÿผ @RequestBody๋ฅผ ์‚ฌ์šฉํ•ด HTTP ๋ฉ”์‹œ์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๊ณ  messagebody์— ์ €์žฅ.

๋ฌธ์ž๋กœ ๋œ json ๋ฐ์ดํ„ฐ์ธ messagebody๋ฅผ objectMapper๋ฅผ ํ†ตํ•ด ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜.

 

messgae body -> ๋ฌธ์ž ๋ณ€ํ™˜ -> json ๋ณ€ํ™˜ -> ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ 

 

๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๋‹ค์‹œ json์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ์ข€ ๊ท€์ฐฎ์€๋ฐ ์ค„์ผ ์ˆ˜ ์—†์„๊นŒ?

์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โ—๏ธ@RequestBody๋Š” ์ƒ๋žต์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง์€ @ModelAttribute, @RequestParam๊ณผ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒ๋žตํ•  ๋•Œ ์•„๋ž˜ ๊ทœ์น™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • String , Integer, int ์™€ ๊ฐ™์€ ๋‹จ์ˆœ ํƒ€์ž… = @RequestParam
  • ๊ทธ ์™ธ์˜ ํƒ€์ž… = @ModelAttribute ( argument resolver๋กœ ์ง€์ •ํ•ด๋‘” ํƒ€์ž…์„ ์ œ์™ธํ•œ ๋ชจ๋“  ํƒ€์ž…)

๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ HelloData์— @RequestBody๋ฅผ ์ƒ๋žตํ•˜๋ฉด @ModelAttribute๊ฐ€ ์ ์šฉ๋˜์–ด ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๊ฐ€ ์•„๋‹Œ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค!

@RequestBody์— String์ด ์•„๋‹Œ ๊ฐ์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ

// V3
// @RequestBody์— ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData data)
{
    log.info("username = {}, age = {}",data.getUsername(),data.getAge());
    return "OK";
}

@RequestBody์— ์ง์ ‘ ๋งŒ๋“  ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

HttpEntity๋‚˜ @RequestBody๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๊ฐ€ HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋‚ด์šฉ์„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฌธ์ž๋‚˜ ๊ฐ์ฒด ๋“ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.

 

HttpEntity๋ฅผ ์‚ฌ์šฉํ•œ ver.

@ResponseBody
@PostMapping("/request-body-json-v4")
public String requestBodyJsonV4(HttpEntity<HelloData> dataHttpEntity)
{
    HelloData data = dataHttpEntity.getBody();
    log.info("username = {}, age = {}",data.getUsername(),data.getAge());
    return "OK";
}

 

@ResponseBody์— String์ด ์•„๋‹Œ ๊ฐ์ฒด ๋ฆฌํ„ดํ•  ๊ฒฝ์šฐ

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

๊ฐ์ฒด ์ •๋ณด๊ฐ€ JSON ํ˜•ํƒœ๋กœ ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋ฆฌํ„ด๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ HttpEntity๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

 

@RequestBody ์š”์ฒญ : JSON ์š”์ฒญ -> HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ -> ๊ฐ์ฒด

@ResponseBody ์‘๋‹ต : ๊ฐ์ฒด -> HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ -> JSON ์‘๋‹ต

 

 

 

 

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Request ๋งคํ•‘์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” Response ๋งคํ•‘๊ณผ HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.


<์ฐธ๊ณ  ์ž๋ฃŒ>

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ  - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“  ์›น ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC์˜ ํ•ต์‹ฌ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., -

www.inflearn.com

https://rlaehddnd0422.tistory.com/45

 

HTTP ํ‘œํ˜„ ํ—ค๋”

message body(ํŽ˜์ด๋กœ๋“œ)๋ฅผ ํ†ตํ•ด ํ‘œํ˜„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ‘œํ˜„ ๋ฐ์ดํ„ฐ๋Š” ์š”์ฒญ์ด๋‚˜ ์‘๋‹ต์—์„œ ์ „๋‹ฌํ•  ์‹ค์ œ ๋ฐ์ดํ„ฐ ํ‘œํ˜„ ํ—ค๋”๋Š” ํ‘œํ˜„ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณต ํ•ด์„ ์ •๋ณด -> ๋ฐ์ดํ„ฐ ์œ ํ˜•,

rlaehddnd0422.tistory.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ