๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [Spring] '@ModelAttribute', 'Lombok' ํŽธ

ybkยท2024๋…„ 4์›” 11์ผ

spring

๋ชฉ๋ก ๋ณด๊ธฐ
8/55
post-thumbnail

๐Ÿ”” '@ModelAttribute', 'Lombok'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!


๐Ÿ’Ÿ Lombok

Lombok์€ @Getter, @Setter, @ToString, @EqualsAndHashCode, @NoArgsConstructor, @AllArgsConstructor ๋“ฑ๊ณผ ๊ฐ™์€ Annotation์„ ์ œ๊ณตํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์ž๋™์œผ๋กœ getter, setter, toString ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๊ฐ์†Œ: Lombok์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต์ ์ธ getter ๋ฐ setter ๋ฉ”์„œ๋“œ์™€ toString(), equals(), hashCode()์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • @Data : ์ž๋ฐ”๋นˆ(JavaBean) ํด๋ž˜์Šค์—์„œ ํ•„๋“œ, getter, setter, equals(), hashCode(), toString() ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
import lombok.*;

@Getter
@Setter
@EqualsAndHashCode
@ToString
@AllArgsConstructor
public class MyBean141 {
    private String city;
    private String country;
    private Integer age;
    private String name;

    // getters, setters
    // constructor
    // toString
    // hashCode, equals

}

๐Ÿ“ข JSP์—์„œ JavaBeans๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ attribute ์ด๋ฆ„ ์ƒ๋žต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์ž๋ฐ” ์ฝ”๋“œ์—์„œ attribute ์ด๋ฆ„์„ ์ƒ๋žตํ•˜๊ณ  jsp์—์„œ attribute ์ด๋ฆ„์„ ์ž๋ฐ” ํด๋ž˜์Šค๋ช…์œผ๋กœ lowerCamalCase๋กœ ๋ณ€๊ฒฝ๋œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ attribute์˜ ์ด๋ฆ„์„ ์ƒ๋žตํ•˜๋Š” ์Šต๊ด€์€ ์ข‹์ง€ ์•Š์œผ๋‹ˆ ์จ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@RequestMapping("sub2")
public void sub2(Model model) {
    MyBean142 o1 = new MyBean142();
    o1.setName("๊น€๋ฏผ์žฌ");

    MyBean142 o2 = new MyBean142();
    o2.setName("์ด์ •ํ›„");

    // attribute ๋ช… ์ƒ๋žต
    model.addAttribute(o1); //// myBean142
    model.addAttribute(List.of(o1, o2)); //myBean142List
}
<p>${myBean142.name}</p>
<%--๊น€๋ฏผ์žฌ--%>

<hr>
<p>${myBean142List[0].name}</p> <%--๊น€๋ฏผ์žฌ--%>
<p>${myBean142List[1].name}</p> <%--์ด์ •ํ›„--%>

๐Ÿ’Ÿ @ModelAttribute

  • ์ง์ ‘ ๋ชจ๋ธ(Model)์„ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๊ณ  ๋ฉ”์„œ๋“œ์— @ModelAttribute ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด๋Š” ์ž๋™์œผ๋กœ ๋ชจ๋ธ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌํ„ดํ•œ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ๋ชจ๋“  ๋ทฐ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ๋ฉ”์„œ๋“œ๋Š” ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•ด๋‹น ๋ชจ๋ธ ๊ฐ์ฒด์— ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„๊ณผ ๋ชจ๋ธ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์ด ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž๋ฐ”๋นˆ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉํ•  ๋•Œ๋Š” ์ž๋ฐ”๋นˆ ํด๋ž˜์Šค์— ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ์™€ ๋™์ผํ•œ ์ด๋ฆ„์˜ HTTP ๋งํฌ์— ๊ทธ ๊ฐ’์ด ๋ฌด์กฐ๊ฑด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŸฆ @ModelAttribute ์ƒ๋žต

MyBean142 ์ž๋ฐ”๋นˆ ํด๋ž˜์Šค

package com.study.domain;

import lombok.Data;

@Data
public class MyBean142 {
    private String id;
    private String name;
    private Integer age;
}

1. @ModelAttribute ์ƒ๋žต ์ „

@RequestMapping("sub3")
public void sub3(@ModelAttribute("player1") MyBean142 o1) {
    o1.setName("์˜คํƒ€๋‹ˆ");
}
<p>${player1.name}</p>
  • @ModelAttribute ์• ๋„ˆํ…Œ์ด์…˜ ์‚ฌ์šฉ๋˜๋ฉฐ ํŒŒ๋ผ๋ฏธํ„ฐ o1 ๊ฐ์ฒด๋ฅผ player1 ์ด๋ฆ„์œผ๋กœ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

2. @ModelAttribute ์ƒ๋žต ์ „ attribute ์ด๋ฆ„ ์ƒ๋žต

@RequestMapping("sub4")
public String sub4(@ModelAttribute MyBean142 o1) {
    o1.setName("๊น€๋ฏผ์žฌ");

    return "/main14/sub3";
}
<p>${myBean142.name}</p>
  • attribute์˜ ์ด๋ฆ„์ด ์ƒ๋žต๋˜์–ด 'myBean142' ์ด๋ฆ„์œผ๋กœ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

3. @ModelAttribute ์ƒ๋žต ํ›„

@RequestMapping("sub5")
public String sub5(MyBean142 o1) {
    o1.setName("์œ ์žฌ์„");

    // /WEB-INF/view/main14/sub3.jsp ๋กœ ํฌ์›Œ๋“œ
    return "/main14/sub3";
}
<p>${myBean142.name}</p>
  • @ModelAttribute ์ƒ๋žต๋˜์–ด๋„ Spring MVC๋Š” ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์Šคํ”„๋ง MVC๊ฐ€ ์•Œ์•„์„œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŸฆ Model๊ณผ @ModelAttribute ์ฐจ์ด

myBean145 ์ž๋ฐ”๋นˆ ํด๋ž˜์Šค

import lombok.Data;

@Data
public class MyBean145 {

    private String address;
    private String name;
    private Integer age;
}
  1. Model ์‚ฌ์šฉ
@RequestMapping("sub9")
public void sub9(String name, Integer age, String address,
                 Model model) {
    MyBean145 o1 = new MyBean145();
    o1.setName(name);
    o1.setAddress(address);
    o1.setAge(age);

    model.addAttribute("myBean145", o1);
}
<p>${myBean145.name}</p>
<p>${myBean145.address}</p>
<p>${myBean145.age}</p>

  1. @ModelAttribute ์‚ฌ์šฉ
// /main14/sub10?name=๊ฐ•์ธ&address=ํŒŒ๋ฆฌ&age=23
@RequestMapping("sub10")
public String sub10(MyBean145 o1) {
    return "/main14/sub9";
}
<p>${myBean145.name}</p>
<p>${myBean145.address}</p>
<p>${myBean145.age}</p>
  • Model์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ  Model ๊ฐ์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— @ModelAttribute๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๐ŸŸฆ @RequestParam๊ณผ @ModelAttribute

@RequestMapping("sub12")
public void sub12(
        Integer price, //@RequestParam
        String car, //@RequestParam
        MyBean147 o1, //@ModelAttribute
        MyBean146 o2 //@ModelAttribute
) {
    System.out.println("price = " + price);
    System.out.println("car : " + car);
    System.out.println(o1);
    System.out.println(o2);

}
  1. @RequestParam์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง์ ‘ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ๊ฐ๊ฐ์˜ ๋ณ€์ˆ˜์— ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. @ModelAttribute๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ์ฒด์— ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

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