๐Ÿ“—Spring MVC Study [ HTTP ์š”์ฒญ ]

Caruhยท2025๋…„ 3์›” 20์ผ

Spring MVC

๋ชฉ๋ก ๋ณด๊ธฐ
14/17
post-thumbnail

๊ธฐ๋ณธ, ํ—ค๋” ์กฐํšŒ

  • ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์Šคํ”„๋ง ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋‹ค์–‘ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์›ํ•œ๋‹ค.
@Slf4j
@RestController
public class RestHeaderController {

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

    }
}
  • HttpServletRequest
  • HttpServletResponse
  • HttpMethod : HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์กฐํšŒํ•œ๋‹ค. org.springframework.http.HttpMethod
  • Locale : Locale ์ •๋ณด๋ฅผ ์กฐํšŒํ•œ๋‹ค.
  • @RequestHeader MultiValueMap<String, String> headerMap
    • ๋ชจ๋“  HTTP ํ—ค๋”๋ฅผ MultiValueMap ํ˜•์‹์œผ๋กœ ์กฐํšŒํ•œ๋‹ค.
  • @RequestHeader("host") String host
    • ํŠน์ • HTTP ํ—ค๋”๋ฅผ ์กฐํšŒํ•œ๋‹ค.
    • ์†์„ฑ
      • ํ•„์ˆ˜ ๊ฐ’ ์—ฌ๋ถ€ : required
      • ๊ธฐ๋ณธ ๊ฐ’ ์†์„ฑ : defaultValue
  • @CookieValue(value = "myCookie", required = false) String cookie
    • ํŠน์ • ์ฟ ํ‚ค๋ฅผ ์กฐํšŒํ•œ๋‹ค.
    • ์†์„ฑ
      • ํ•„์ˆ˜ ๊ฐ’ ์—ฌ๋ถ€ : required
      • ๊ธฐ๋ณธ ๊ฐ’ : defaultValue

MultiValueMap

  • Map๊ณผ ์œ ์‚ฌํ•œ๋ฐ, ํ•˜๋‚˜์˜ ํ‚ค์— ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • HTTP header, HTTP ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๊ฐ™์ด ํ•˜๋‚˜์˜ ํ‚ค์— ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • keyA=value1&keyA=value2 > key A์— 2๊ฐœ์˜ value๊ฐ€ ๋‹ด๊น€
 MultiValueMap<String, String> map = new LinkedMultiValueMap();
 map.add("keyA", "value1");
 map.add("keyA", "value2");
 //[value1,value2]
 List<String> values = map.get("keyA");

@Slf4j

  • ์ด์ „ ํฌ์ŠคํŠธ์—์„œ ์ž์„ธํžˆ ์ž‘์„ฑํ–ˆ์—ˆ์ง€๋งŒ ์‰ฝ๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ํŽธ๋ฆฌํ•˜๊ธฐ log๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋„์™€์ค€๋‹ค.
  • ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์„ ์–ธํ•ด์ค€๋‹ค.
private static final org.slf4j.Logger log = 
org.slf4j.LoggerFactory.getLogger(RequestHeaderController.class);

์ฐธ๊ณ 


์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ, HTML Form

HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ ์กฐํšŒ - ๊ฐœ์š”

  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” ์ฃผ๋กœ ๋‹ค์Œ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ
    • /url?username=hello&age=20
    • ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์—†์ด, URL์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์„œ ์ „๋‹ฌ
    • EX) ๊ฒ€์ƒ‰, ํ•„ํ„ฐ, ํŽ˜์ด์ง•๋“ฑ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹
  • POST - HTML Form
    • content-type : application/x-www-form-urlencoded
    • ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ username=hello&age=20
    • ์˜ˆ) ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, HTML Form ์‚ฌ์šฉ
  • HTTP message body์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋‹ด์•„์„œ ์š”์ฒญ
    • HTTP API์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ, JSON, XML, TEXT
    • ๋ฐ์ดํ„ฐ ํ˜•์‹์€ ์ฃผ๋กœ JSON ์‚ฌ์šฉ
    • POST, PUT, PATCH

HttpServletRequest์˜ request.getParameter()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ ๋‘๊ฐ€์ง€ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.


GET, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ „์†ก

  • http://localhost:8080/request-param?username=hello&age=20

POST, HTML Form ์ „์†ก

  • POST /request-param ...
     content-type: application/x-www-form-urlencoded
     username=hello&age=20 

GET ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ „์†ก ๋ฐฉ์‹์ด๋“ , POST HTML Form ์ „์†ก ๋ฐฉ์‹์ด๋“  ๋‘˜๋‹ค ํ˜•์‹์ด ๊ฐ™์œผ๋ฏ€๋กœ ๊ตฌ๋ถ„์—†์ด ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

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

์ด์ œ๋ถ€ํ„ฐ ์Šคํ”„๋ง์œผ๋กœ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•ด ๋ณด์ž.


/**
 * ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ์—†์œผ๋ฉด์„œ ์ด๋ ‡๊ฒŒ ์‘๋‹ต์— ๊ฐ’์„ ์ง์ ‘ ๋„ฃ์œผ๋ฉด, view ์กฐํšŒ X
 */
@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);

    response.getWriter().write("ok");
}
  • request.getParameter()
    • ์—ฌ๊ธฐ์„œ๋Š” ๋‹จ์ˆœํžˆ HttpServletRequest๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒ

/**
 * @RequestParam ์‚ฌ์šฉ
 * - ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์œผ๋กœ ๋ฐ”์ธ๋”ฉ
 * @ResponseBody ์ถ”๊ฐ€
 * - View ์กฐํšŒ๋ฅผ ๋ฌด์‹œํ•˜๊ณ , HTTP message body์— ์ง์ ‘ ํ•ด๋‹น ๋‚ด์šฉ ์ž…๋ ฅ
 */

@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(@RequestParam("username") String memberName, @RequestParam("age") int memberAge) {
        log.info("username={}, age={}", memberName, memberAge);
        return "ok";
    }
  • @RequestParam : ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์œผ๋กœ ๋ฐ”์ธ๋”ฉ
  • @ResponseBody : View ์กฐํšŒ๋ฅผ ๋ฌด์‹œํ•˜๊ณ , HTTP message body์— ์ง์ ‘ ํ•ด๋‹น ๋‚ด์šฉ ์ž…๋ ฅ

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

  • @RequestParam("username") String memberName
  • -> request.getParameter("username")

/**
 * @RequestParam ์‚ฌ์šฉ
 * HTTP ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์ด ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๊ฐ™์œผ๋ฉด @RequestParam(name="xx") ์ƒ๋žต ๊ฐ€๋Šฅ
*/
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
    @RequestParam String username,
    @RequestParam int age) {
	log.info("username={}, age={}", username, age);
    return "ok";
}
  • HTTP ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์ด ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๊ฐ™์œผ๋ฉด @RequestParam(name="xx")์ƒ๋žต ๊ฐ€๋Šฅ

/**
 * @RequestParam ์‚ฌ์šฉ
 * String, int ๋“ฑ์˜ ๋‹จ์ˆœ ํƒ€์ž…์ด๋ฉด @RequestParam ๋„ ์ƒ๋žต ๊ฐ€๋Šฅ
 */
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username, int age) {
    log.info("username={}, age={}", username, age);
    return "ok";
}
  • String, int, Integer ๋“ฑ์˜ ๋‹จ์ˆœ ํƒ€์ž…์ด๋ฉด @RequestParam ๋„ ์ƒ๋žต ๊ฐ€๋Šฅ

์ฃผ์˜

  • @RequestParam ์• ๋…ธํ…Œ์ด์…˜์„ ์ƒ๋žตํ•˜๋ฉด ์Šคํ”„๋ง MVC๋Š” ๋‚ด๋ถ€์—์„œ required=false๋ฅผ ์ ์šฉํ•œ๋‹ค.

์ฐธ๊ณ 

  • ์• ๋…ธํ…Œ์ด์…˜์„ ์™„์ „ํžˆ ์ƒ๋žตํ•ด๋„ ์ƒ๊ด€์€ ์—†์ง€๋งŒ, ๋„ˆ๋ฌด ์—†๋Š” ๊ฒƒ๋„ ์•ฝ๊ฐ„ ๊ณผํ•˜๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์—ˆ๋‹ค.
  • @RequestParam์ด ์žˆ์œผ๋ฉด ๋ช…ํ™•ํ•˜๊ฒŒ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๋‹ค๋Š” ๊ฒƒ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์Šคํ”„๋ง์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ์ผ ๊ฒฝ์šฐ ๋ณด์ž๋งˆ์ž ์ดํ•ด๋ฅผ ํ•˜์ง€๋ชปํ•  ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž.

ํŒŒ๋ผ๋ฏธํ„ฐ ํ•„์ˆ˜ ์—ฌ๋ถ€ - requestParamRequired

 /**
  * @RequestParam.required /request-param-required -> username์ด ์—†์œผ๋ฏ€๋กœ ์˜ˆ์™ธ
  * <p>
  * ์ฃผ์˜!
  * /request-param-required?username= -> ๋นˆ๋ฌธ์ž๋กœ ํ†ต๊ณผ
  * <p>
  * ์ฃผ์˜!
  * /request-param-required
  * int age -> null์„ int์— ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ, ๋”ฐ๋ผ์„œ Integer ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ(๋˜๋Š” ๋‹ค์Œ์— ๋‚˜์˜ค๋Š”
  * defaultValue ์‚ฌ์šฉ)
  */
  
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
    @RequestParam(required = true) String username,
    @RequestParam(required = false) Integer age) {
    log.info("username={}, age={}", username, age);
    return "ok";
}
  • @RequestParam.required
    • ํŒŒ๋ผ๋ฏธํ„ฐ ํ•„์ˆ˜ ์—ฌ๋ถ€
    • ๊ธฐ๋ณธ ๊ฐ’์ด ํŒŒ๋ผ๋ฏธํ„ฐ ํ•„์ˆ˜(true)์ด๋‹ค.
  • /request-param-required ์š”์ฒญ
    • username์ด ์—†์œผ๋ฏ€๋กœ 400์˜ˆ์™ธ ๋ฐœ์ƒ

์ฃผ์˜! ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๋งŒ ์‚ฌ์šฉ

  • /request-param-required?username=
  • ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๋งŒ ์žˆ๊ณ  ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ -> ๋นˆ ๋ฌธ์ž๋กœ ํ†ต๊ณผ

์ฃผ์˜! - ๊ธฐ๋ณธํ˜•(primitive)์— null ์ž…๋ ฅ

  • /request-param์š”์ฒญ
  • @RequestParam(required = false) int age
  • null์„ int์— ์ด๋ณ…ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ (500 ์˜ˆ์™ธ ๋ฐœ์ƒ) ๋”ฐ๋ผ์„œ null์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” Integer๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ๋˜๋Š” defaultValue๋ฅผ ์‚ฌ์šฉํ•˜์ž.
/**
 * @RequestParam
 * - defaultValue ์‚ฌ์šฉ
 *
 * ์ฐธ๊ณ : defaultValue๋Š” ๋นˆ ๋ฌธ์ž์˜ ๊ฒฝ์šฐ์—๋„ ์ ์šฉ
 * /request-param-default?username=
 */
 @ResponseBody
 @RequestMapping("/request-param-default")
 public String requestParamDefault(
        @RequestParam(required = true, defaultValue = "guest") String username,
        @RequestParam(required = false, defaultValue = "-1") int age) {
        
    	log.info("username={}, age={}", username, age);
 		return "ok";
 }

ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ defaultValue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ๊ฐ’์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ ๊ธฐ๋ณธ ๊ฐ’์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— required๋Š” ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. defaultValue๋Š” ๋นˆ ๋ฌธ์ž์˜ ๊ฒฝ์šฐ์—๋„ ์„ค์ •ํ•œ ๊ธฐ๋ณธ ๊ฐ’์ด ์ ์šฉ๋œ๋‹ค. /request-param-default?username ์ด๋Ÿฐ์‹์œผ๋กœ ๋ณด๋‚ด๋ฉด default๊ฐ’์ด ์ ์šฉ๋˜์–ด request๋ฅผ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Map์œผ๋กœ ์กฐํšŒํ•˜๊ธฐ - requestParamMap

 /**
 * @RequestParam Map, MultiValueMap
 * Map(key=value)
 * MultiValueMap(key=[value1, value2, ...]) ex) (key=userIds, value=[id1, id2])
 */
 @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";
 }
  • ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Map, MultiValueMap์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • @RequestParam Map,
      • Map(key=value)
    • @RequestParam MultiValueMap
      • MultiValueMap(key=[value1, value2, ... ] ex) (key=userIds, value=[id1, id2])

ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์ด 1๊ฐœ๊ฐ€ ํ™•์‹คํ•˜๋‹ค๋ฉด Map์„ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด MultiValueMap์„ ์‚ฌ์šฉํ•˜์ž. ํ•˜์ง€๋งŒ ๊ฑฐ์˜ 1๊ฐœ์ผ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— Map์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.


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

  • ์‹ค์ œ ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ์ฒด์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ์Šคํ”„๋ง์€ ์ด ๊ณผ์ •์„ ์™„์ „ํžˆ ์ž๋™ํ™” ํ•ด์ฃผ๋Š” @ModelAttribute ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

์‹ค์Šต์— ์•ž์„œ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉ ๋ฐ›์„ ๊ฐ์ฒด ์ƒ์„ฑ

//HelloData
import lombok.Data;
@Data
public class HelloData {
	private String username;
	private int age;
 }
  • ๋กฌ๋ณต @Data
    • @Getter, @Setter,@ToString, @EqualsAndHashCode, @RequiredArgsConstructor ๋ฅผ ์ž๋™์œผ๋กœ ์ ์šฉํ•ด์ค€๋‹ค.

@ModelAttribute ์ ์šฉ - modelAttributeV1

/**
 * @ModelAttribute ์‚ฌ์šฉ
 * ์ฐธ๊ณ : model.addAttribute(helloData) ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ์ž๋™ ์ ์šฉ๋จ, ๋’ค์— model์„ ์„ค๋ช…ํ•  ๋•Œ ์ž์„ธํžˆ
 ์„ค๋ช…
 */
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
	log.info("username ={}, age={}", helloData.getUsername(), helloData.getAge());
	return "ok";
}
  • ์‹คํ–‰ํ•ด๋ณด๋ฉด ์ž๋™์œผ๋กœ HelloData ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’๋„ ๋ชจ๋‘ ๋“ค์–ด๊ฐ€ ์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

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

    • HelloData๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    • ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์œผ๋กœ HelloData๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐพ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ setter๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ์ž…๋ ฅ(๋ฐ”์ธ๋”ฉ)ํ•œ๋‹ค.
    • EX) ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์ด username์ด๋ฉด setUsername() ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์•„์„œ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๊ฐ’์„ ์ž…๋ ฅ

ํ”„๋กœํผํ‹ฐ

  • ๊ฐ์ฒด์— getUsername(), setUsername() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด, ์ด ๊ฐ์ฒด๋Š”username ์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.
  • username ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด setUsername()์ด ํ˜ธ์ถœ๋˜๊ณ , ์กฐํšŒํ•˜๋ฉด getUsername()์ด ํ˜ธ์ถœ๋œ๋‹ค.
class HelloData{
	getUsername();
    setUsername();
}

๋ฐ”์ธ๋”ฉ ์˜ค๋ฅ˜

  • age=abc ์ฒ˜๋Ÿผ ์ˆซ์ž๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ•  ๊ณณ์— ๋ฌธ์ž๋ฅผ ๋„ฃ์œผ๋ฉด BindException๋ฐœ์ƒ

@ModelAttribute ์ƒ๋žต - modelAttributeV2

/**
 * @ModelAttribute ์ƒ๋žต ๊ฐ€๋Šฅ
 * String, int ๊ฐ™์€ ๋‹จ์ˆœ ํƒ€์ž… = @RequestParam
 * argument resolver ๋กœ ์ง€์ •ํ•ด๋‘” ํƒ€์ž… ์™ธ = @ModelAttribute
 */
@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(HelloData helloData) {
	log.info("username={}, age={}", helloData.getUsername(), 
	helloData.getAge());
	return "ok";
}
  • @ModelAttribute๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ @RequestParam๋„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ํ˜ผ๋ž€์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šคํ”„๋ง์€ ํ•ด๋‹น ์ƒ๋žต์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ์ ์šฉ

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

๐Ÿ“ญ Reference

profile
Backend Developer

0๊ฐœ์˜ ๋Œ“๊ธ€