Spring MVC에서 @ModelAttribute
이해하기
Spring MVC의 @ModelAttribute
주석은 메소드 인수 또는 메소드 반환 값을 명명된 모델 속성에 바인딩하여 웹 뷰에 노출하는 데 사용됩니다.
@ModelAttribute
주석은 다음 두 가지 주요 시나리오에서 사용할 수 있습니다:
1. 메소드 인자
이 시나리오는 주로 양식 처리와 관련이 있으며, 여기서 객체가 요청 매개 변수로 채워진 후 메소드로 전달됩니다. 채워진 객체는 자동으로 모델에 추가됩니다.
예를 들어 사용자가 개인 정보를 제출할 수 있는 양식 페이지를 만들고 있는 상황입니다
우리는 다음과 같은 User
클래스를 가지고 있습니다
public class User {
private String name;
private String email;
// getters and setters...
}
@ModelAttribute
어노테이션을 메소드 인자에서 다음과 같이 사용할 수 있습니다:
@Controller
public class UserController {
@PostMapping("/submit")
public String submitForm(@ModelAttribute("user") User user) {
// 여기서 "user"는 form 데이터로부터 자동적으로 설정된
// User의 인스턴스입니다.
// user 객체를 사용합니다...
String name = user.getName();
String email = user.getEmail();
// 데이터를 가지고 무언가를 합니다...
return "success"; // view의 이름을 반환합니다.
}
}
이 경우, submitForm
메소드는 “/submit” URL에서 POST 요청을 기다립니다.
그 요청이 발생하면, 스프링은 자동적으로 User
의 새 인스턴스를 만들고 그 필드를 form 데이터와 일치하도록 채웁니다.
@ModelAttribute("user")
어노테이션은 스프링에 이러한 작업을 수행하도록 지시하는 역할을 합니다.
@ModelAttribute("user")
의 이름은 모델 속성 이름에 해당합니다.
양식에서 아래 HTML 코드에서 볼 수 있듯 이 이름으로 양식 필드를 user 객체 속성에 바인딩합니다.
<form action="/submit" method="post">
<label>Name: <input name="user.name" /></label>
<label>Email: <input name="user.email" /></label>
<input type="submit" value="Submit" />
</form>
이 양식에서 입력 필드의 name
속성은 User
객체의 속성 이름과 일치합니다(모델 속성 이름인 "user."으로 시작합니다).
2. 메소드
@ModelAttribute
를 메소드에 붙이면 Spring MVC는 이를 핸들러 메소드 앞에서 호출합니다.
모델을 일부 속성으로 초기화 할 수 있고, 반환 값을 가질 수 있으며 이 값들은 모델에 추가됩니다.
이 메소드는 일반적으로 여러 컨트롤러 메소드에서 사용해야하는 공통 데이터를 로드하는 데 사용됩니다.
예를 들어, java class User
가 주어지면 다음과 같이 @ModelAttribute
메소드를 정의할 수 있습니다
이 클래스가 정의되면 Spring MVC는 인스턴스를 생성하고 필드를 해당 요청 매개변수에 바인딩할 수 있습니다
@ModelAttribute("user")
public User populateUser() {
return new User(); // user 객체를 채웁니다
}
위의 예에서 populateUser
메소드는 요청 핸들러 메소드 앞에서 호출됩니다.
그것은 User
객체를 반환하고 이 객체는 자동으로 "user"라는 속성 이름 아래의 모델에 추가됩니다.
그런 다음 양식 제출을 처리하는 메소드에서 @ModelAttribute
없이 User
객체를 직접 참조할 수 있습니다:
@PostMapping("/register/add")
public String save(User user, Model m) {
// user 데이터를 처리합니다
return "viewname";
}
이 save
메소드에서 Spring MVC는 모델의 “user” 모델 속성 (있는 경우)을 사용하여 user
매개 변수에 대한 값을 제공합니다.
모델에 “user” 속성이 존재하지 않으면 Spring은 기본 생성자를 사용하여 새 User
객체를 인스턴스화합니다.
이것은 메소드 수준에서 @ModelAttribute
로 주석이 달린 명령이나 양식 객체의 인수인 경우에만 작동합니다.
이 접근 방식은 동일한 모델 속성이 여러 핸들러 메소드나 컨트롤러에서 사용되는 경우 특히 컨트롤러 코드를 깔끔하게 만들 수 있습니다.
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Java' 카테고리의 다른 글
DispatcherServlet (0) | 2023.05.19 |
---|---|
Spring은 어떻게 매개변수만 적으면 라우팅을 해주는걸까 (0) | 2023.05.19 |
Servlet filter (0) | 2023.05.19 |
Expression Language(EL) (0) | 2023.05.19 |
Servlet의 상태 정보 저장 (0) | 2023.05.19 |