Springboot MVC 파헤치기(6) @ModelAttribute
Controller에서 사용되는 @ModelAttribute에 대해서 알아보겠습니다.
@ModelAttribute는 클라이언트가 전달하는 값을 객체로 맵핑해주는 역할을 합니다. HTTP Body 데이터 혹은 HTTP 파라미터를 주입합니다. 이때 생성자나 Setter로 주입하기 때문에 Setter혹은 생성자가 있어야 합니다.
@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ModelAttribute { @AliasFor("name") String value() default ""; @AliasFor("value") String name() default ""; boolean binding() default true; }
@ModelAttribute name, value 속성
name과 value는 Alias입니다. 둘 중 하나를 골라서 사용합니다. value가 default니 value를 생략하고 이름을 줄 수 있습니다. Html에서 사용하는 이름을 맵핑해줘야 합니다.
현재 Html을 눌렀을 때 Post로 객체 이름을 Test로 서버에게 보냅니다.
<form role="form" action="/members/new" th:object="${Test}" method="post"> <div class="form-group"> <label th:for="name">크기</label> <input type="text" th:field="*{name}" class="form-control" placeholder="크기를 입력하세요" </div> <div class="form-group"> <label th:for="zipcode">설명</label> <input type="text" th:field="*{zipcode}" class="form-control" placeholder="설명를 입력하세요"> </div> <button type="submit" class="btn btn-primary">Submit</button> </form>
@ModelAttribute를 HTTP Body Data를 받는 형태로 사용하기 위해서는 Html에서 사용되는 변수명을 입력해줘야 합니니다.
@GetMapping("/model") public String modelAttribute(@ModelAttribute("Test") Test test) { return test.getSize()+" "+test.getDescription(); } @Data @NoArgsConstructor @AllArgsConstructor public static class Test{ int size; String description; }
Model에 데이터를 넘기기 위해서는 model.addAttribute를 이용하여 데이터를 담아서 보내야 하지만 @ModelAttribute를 사용할 경우 model.addAttribute를 사용하지 않아도 데이터가 넘어갑니다.
@ModelAttribute를 HTTP 파라미터 형태로 사용할 경우 변수명만 일치시키면 됩니다.
@GetMapping("/model") public String modelAttribute(@ModelAttribute Test test) { // "/model?size=10&description=hi return test.getSize()+" "+test.getDescription(); // 10 hi 반환 } // ModelAttribute가 아닌 RequestParam으로 받았을 때 @GetMapping("/requestParam") public String requestParam(@ReqestParam("size") int size, @RequestParam("description") String description){ return size + " " + description; } @Data @NoArgsConstructor @AllArgsConstructor public static class Test{ int size; String description; }
HTTP 파라미터를 이용할 때는 @RequestParam을 이용해서 받을 수 있지만 값들이 많아질 경우 @ModelAttribute를 이용해서 받으면 깔끔해집니다.
@ModelAttribute binding 속성
binding 속성은 default가 true입니다. 이것은 넘어온 값을 맵핑할지 안 할지 정하는 역할을 합니다.
@GetMapping("/model") public String modelAttribute(@ModelAttribute(binding = false) Test test) { // "/model?size=10&description=hi return test.getSize()+" "+test.getDescription(); // 0 null 반환 binding = false이므로 맵핑x } @GetMapping("/model") public String modelAttribute(@ModelAttribute Test test) { // "/model?size=10&description=hi return test.getSize()+" "+test.getDescription(); // 10 hi 반환 } @Data @NoArgsConstructor @AllArgsConstructor public static class Test{ int size; String description; }
binding = false를 주면 binding을 하지 않기 때문에 0과 null이 반환됩니다.
지금까지 @ModelAttribute에 대해서 알아봤습니다. 감사합니다.
'SpringBoot > spring mvc' 카테고리의 다른 글
Springboot MVC 파헤치기(5) @RequestParam (0) | 2022.03.15 |
---|---|
Springboot MVC 파헤치기(7) @RequestBody, @ResponseBody (0) | 2022.03.15 |
Springboot MVC 파헤치기(4) @PathVarialbe (0) | 2022.03.02 |
Springboot MVC 파헤치기(3) @RequstMapping (0) | 2022.03.02 |
SpringBoot MVC 파헤치기(1) (0) | 2022.02.28 |
댓글
이 글 공유하기
다른 글
-
Springboot MVC 파헤치기(5) @RequestParam
Springboot MVC 파헤치기(5) @RequestParam
2022.03.15Controller에서 사용되는 @RequestParam 대해서 알아보겠습니다. @RequestParam: 클라이언트가 전달하는 HTTP 요청 Parameter 혹은 HTTP Body의 정보를 전달받기 위해서 사용됩니다. @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestParam { @AliasFor("name") String value() default ""; @AliasFor("value") String name() default ""; boolean required() default true; String defaultValue() default ValueCons… -
Springboot MVC 파헤치기(7) @RequestBody, @ResponseBody
Springboot MVC 파헤치기(7) @RequestBody, @ResponseBody
2022.03.15Controller에서 사용되는 @RequestBody와 @ResponseBody에 대해서 알아보겠습니다. @RequestBody: HTTP Body에 담겨온 정보를 JSON 형식으로 변환하여 객체와 맵핑해주는 역할을 합니다. @ResponseBody: HTTP Body에 정보를 전달하기 전에 객체를 JSON 형식으로 변환하여 보내주는 역할을 합니다. @RequestBody를 사용한 코드를 보겠습니다. { "size": 10, "description": "hi" } 위와 같은 JSON 형식의 데이터를 서버에게 전송했을 때 @RequestBody를 붙인 객체와 맵핑을 진행합니다. (단 JSON과 맵핑되기 위해선 필드명이 같아야 합니다. 다르면 맵핑되지 않습니다.) @GetMapping("/requestBo… -
Springboot MVC 파헤치기(4) @PathVarialbe
Springboot MVC 파헤치기(4) @PathVarialbe
2022.03.02Controller에서 사용되는 @PathVariable에 대해서 알아보겠습니다. @RequestMapping의 URI의 경로 변수를 넣어주는 역할을 합니다. @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface PathVariable { @AliasFor("name") String value() default ""; @AliasFor("value") String name() default ""; boolean required() default true; } @PathVariable name, value 속성 name과 value는 서로 Alias입니다. 따라서 둘 중 하나를 골라서 사… -
Springboot MVC 파헤치기(3) @RequstMapping
Springboot MVC 파헤치기(3) @RequstMapping
2022.03.02Controller에서 사용되는 @RequestMapping에 대해서 알아보겠습니다. @RequestMapping RequestHandlerMappingHandler에서 컨트롤러를 선택할 때 사용되는 어노테이션입니다. 메서드 단위까지 세분화하여 적용할 수 있습니다. Get, Post, Put 등 HTTP 메서드와 관계없이 매핑됩니다. @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping { String name() default ""; @AliasFor("path") String[] value() default {…
댓글을 사용할 수 없습니다.