Spring - @ModelAttribute

박민수·2023년 11월 14일

Spring

목록 보기
1/46
post-thumbnail

@ModelAttribute

해당 포스팅에서는 @ModelAttribute에 대해 간략하게 정리해 보고자 한다.

특징

자동 Model 추가

@ModelAttribute가 있으면 Model 객체에 해당 이름으로 데이터를 자동으로 추가한다. 즉, model.addAttribute("item", item); 로직이 자동으로 붙는다.

@PostMapping("/add")
public String addItem(@ModelAttribute Item item) {
    // model.addAttribute("item", item);
    ...
}

이름 지정

@ModelAttribute 괄호 안에 입력한 문자열의 이름으로 Model 객체에 저장된다. 만약 괄호를 생략할 시에는 객체 이름 그대로 앞 글자만 소문자로 바꿔서 Model 객체에 저장된다.

public String Ex1(@ModelAttribute ItemSaveForm form) {
    // model.addAttribute("itemSaveForm", form)
}
public String Ex2(@ModelAttribute("test") ItemSaveForm form) {
    // model.addAttribute("test", form)
}

생략 가능

@ModelAttribute도 @RequestParam과 같이 생략할 수 있는데, @RequestParam도 생략이 가능하기 때문에 혼란이 발생할 수 있다. 생략 시 스프링은 다음과 같은 규칙을 적용한다:

  • String, int, Integer 같은 단순 타입 -> @RequestParam 적용
  • 그 외 -> @ModelAttribute 적용 (argument resolver로 지정해둔 타입 외)

추가 내용

폼 데이터를 객체로 바인딩

@ModelAttribute는 폼 데이터를 객체로 바인딩하는 데 유용하다. 이를 통해 복잡한 폼 데이터를 쉽게 처리할 수 있다.

@PostMapping("/register")
public String registerUser(@ModelAttribute UserForm userForm) {
    // model.addAttribute("userForm", userForm);
    userService.save(userForm);
    return "registrationSuccess";
}

초기값 설정

@ModelAttribute 메서드를 사용하여 컨트롤러 메서드 호출 전에 모델에 데이터를 추가할 수 있다. 이를 통해 뷰에서 폼 초기값을 설정할 수 있다.

@Controller
public class UserController {
    
    @ModelAttribute("user")
    public UserForm setUpUserForm() {
        return new UserForm();
    }

    @GetMapping("/register")
    public String showRegistrationForm() {
        return "registerForm";
    }
}

뷰와의 데이터 공유

@ModelAttribute는 컨트롤러의 여러 메서드에서 공통적으로 사용되는 데이터를 뷰와 공유할 때 유용하다. 이를 통해 중복 코드를 줄일 수 있다.

@Controller
public class GlobalController {

    @ModelAttribute("categories")
    public List<String> populateCategories() {
        return List.of("Category1", "Category2", "Category3");
    }

    @GetMapping("/products")
    public String showProducts() {
        return "productList";
    }

    @GetMapping("/services")
    public String showServices() {
        return "serviceList";
    }
}

@ModelAttribute와 @RequestParam 차이

  • @ModelAttribute
    • 주로 객체에 폼 데이터를 바인딩할 때 사용된다.
    • 객체를 생성하고 자동으로 모델에 추가한다.
public String addItem(@ModelAttribute Item item) {
    // model.addAttribute("item", item);
    ...
}
  • @RequestParam:
    • 주로 단순한 타입의 요청 파라미터를 받을 때 사용된다.
    • URL 쿼리 파라미터 또는 폼 데이터를 변수에 바인딩한다.
public String addItem(@RequestParam String name, @RequestParam int quantity) {
	...
}
profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글