Home > Spring > πŸƒ[Spring] `@ModelAttribute` μ• λ…Έν…Œμ΄μ…˜

πŸƒ[Spring] `@ModelAttribute` μ• λ…Έν…Œμ΄μ…˜
Spring Framework

πŸƒ[Spring] @ModelAttribute μ• λ…Έν…Œμ΄μ…˜.

1️⃣ @ModelAttribute

  • @ModelAttributeλŠ” Spring Frameworkμ—μ„œ 주둜 μ‚¬μš©λ˜λŠ” μ• λ…Έν…Œμ΄μ…˜μœΌλ‘œ, Spring MVCμ—μ„œ λͺ¨λΈ 데이터와 μš”μ²­ 데이터λ₯Ό λ°”μΈλ”©ν•˜κ±°λ‚˜, μ»¨νŠΈλ‘€λŸ¬μ—μ„œ λ°˜ν™˜λœ 데이터λ₯Ό 뷰에 μ „λ‹Ήν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • @ModelAttributeλŠ” 두 가지 μ£Όμš” μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

1️⃣ λ©”μ„œλ“œ νŒŒλΌλ―Έν„°μ—μ„œ μ‚¬μš©(@ModelAttribute νŒŒλΌλ―Έν„° 바인딩)

  • @ModelAttributeλ₯Ό λ©”μ„œλ“œ νŒŒλΌλ―Έν„°μ— μ μš©ν•˜λ©΄, Spring은 μš”μ²­ νŒŒλΌλ―Έν„° λ˜λŠ” 폼 λ°μ΄ν„°λ‘œλΆ€ν„° 객체λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³ , κ·Έ 객체의 ν•„λ“œλ₯Ό μš”μ²­ νŒŒλΌλ―Έν„° κ°’μœΌλ‘œ λ°”μΈλ”©ν•©λ‹ˆλ‹€.
    • μ΄λ ‡κ²Œ μƒμ„±λœ κ°μ²΄λŠ” 컨트둀러 λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ.

@Controller
public class UserController {
    
    @PostMapping("/register")
    public String registerUser(@ModelAttribute User user) {
        // User κ°μ²΄λŠ” 폼 λ°μ΄ν„°λ‘œλΆ€ν„° μžλ™μœΌλ‘œ μƒμ„±λ˜κ³  λ°”μΈλ”©λ©λ‹ˆλ‹€.
        // 이제 user 객체λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
        System.out.println("User Name: " + user.getName());
        return "registrationSuccess";
    }
}
  • μœ„ μ˜ˆμ‹œμ—μ„œ @ModelAttributeλŠ” User 객체λ₯Ό 폼 λ°μ΄ν„°λ‘œλΆ€ν„° μƒμ„±ν•˜κ³ , name, email λ“±μ˜ ν•„λ“œ μš”μ²­ νŒŒλΌλ―Έν„° κ°’μœΌλ‘œ λ°”μΈλ”©ν•©λ‹ˆλ‹€.

2️⃣ λ©”μ„œλ“œμ— μ‚¬μš©(@ModelAttribute λ©”μ„œλ“œ)

  • @ModelAttributeλ₯Ό λ©”μ„œλ“œ λ ˆλ²¨μ— μ μš©ν•˜λ©΄, ν•΄λ‹Ή λ©”μ„œλ“œλŠ” 컨트둀러의 λͺ¨λ“  μš”μ²­ 전에 μ‹€ν–‰λ˜μ–΄, λ°˜ν™˜λœ 객체λ₯Ό λͺ¨λΈμ— μΆ”κ°€ν•©λ‹ˆλ‹€.
    • 이 κ°μ²΄λŠ” 이후 λ·°μ—μ„œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.
      ```java
      @Controller
      public class UserController {

    @ModelAttribute(β€œuserTypes”)
    public List populateUserTypes() { // 이 λ©”μ„œλ“œλŠ” 컨트둀러의 λͺ¨λ“  μš”μ²­ 전에 μ‹€ν–‰λ©λ‹ˆλ‹€. // 이 λ¦¬μŠ€νŠΈλŠ” λͺ¨λΈμ— μΆ”κ°€λ˜μ–΄ λ·°μ—μ„œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. return Arrays.asList("Admin", "User", "Guest"); }

    @GetMapping(β€œ/register”)
    public String showRegistrationForm(Model model) {
    model.addAttribute(β€œuser”, new User());
    return β€œregister”;
    }
    }
    ```

  • μœ„ μ˜ˆμ‹œμ—μ„œ populateUserTypes() λ©”μ„œλ“œλŠ” @ModelAttribute("userTypes")둜 μ„ μ–Έλ˜μ–΄, 이 λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•˜λŠ” λ¦¬μŠ€νŠΈλŠ” userTypesλΌλŠ” μ΄λ¦„μœΌλ‘œ λͺ¨λΈμ— μΆ”κ°€λ©λ‹ˆλ‹€.
    • 이 값은 λ·°(예: JSP, Thymeleaf ν…œν”Œλ¦Ώ λ“±)μ—μ„œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ @ModelAttribute 의 μ£Όμš” κΈ°λŠ₯ μš”μ•½.

  • 1. νŒŒλΌλ―Έν„° 바인딩 : ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­ 데이터λ₯Ό 객체둜 λ³€ν™˜ν•˜κ³ , 이 객체λ₯Ό 컨트둀러 λ©”μ„œλ“œμ—μ„œ μ‚¬μš©ν•˜λ„λ‘ ν•΄μ€λ‹ˆλ‹€.
  • 2. λͺ¨λΈ μΆ”κ°€ : λ©”μ„œλ“œμ˜ λ°˜ν™˜ 값을 λͺ¨λΈμ— μΆ”κ°€ν•˜μ—¬, ν•΄λ‹Ή 데이터가 λͺ¨λ“  λ·°μ—μ„œ μ‚¬μš©λ  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
    • 이 두가지 κΈ°λŠ₯을 톡해 @ModelAttributeλŠ” Spring MVCμ—μ„œ 데이터 바인딩과 뷰에 μ „λ‹Ήλ˜λŠ” λ°μ΄ν„°μ˜ 관리λ₯Ό κ°„μ†Œν™”ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.