Loading...
Spring Framework Reference Documentation 7.0.2의 Model의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
ModelSee equivalent in the Servlet stack
@ModelAttribute 어노테이션을 사용할 수 있습니다:
@RequestMapping 메서드에서 메서드 인자에
사용하여 모델에서 객체를 생성하거나 접근하고, WebDataBinder를 통해 그것을 요청에
바인딩할 수 있습니다.@Controller 또는 @ControllerAdvice 클래스에서 메서드 레벨 어노테이션으로 사용하여,
어떤 @RequestMapping 메서드가 호출되기 전에 모델을 초기화하는 데 도움을 줍니다.@RequestMapping 메서드에 사용하여 그 반환 값을 모델 속성으로 표시합니다.이 섹션에서는 @ModelAttribute 메서드, 즉 앞의 목록에서 두 번째 항목에 대해 설명합니다.
컨트롤러는 임의의 개수의 @ModelAttribute 메서드를 가질 수 있습니다.
이러한 모든 메서드는
같은 컨트롤러에서 @RequestMapping 메서드보다 먼저 호출됩니다. @ModelAttribute
메서드는 @ControllerAdvice를 통해 컨트롤러 간에 공유될 수도 있습니다. 자세한 내용은
Controller Advice 섹션을 참조하십시오.
@ModelAttribute 메서드는 유연한 메서드 시그니처를 가집니다. 이들은 @RequestMapping
메서드와 동일한 인자 중 많은 것을 지원합니다 (@ModelAttribute 자체와 요청 본문과
관련된 것을 제외하고).
다음 예제는 @ModelAttribute 메서드를 사용합니다:
1@ModelAttribute 2public void populateModel(@RequestParam String number, Model model) { 3 model.addAttribute(accountRepository.findAccount(number)); 4 // add more ... 5}
1@ModelAttribute 2fun populateModel(@RequestParam number: String, model: Model) { 3 model.addAttribute(accountRepository.findAccount(number)) 4 // add more ... 5}
다음 예제는 하나의 속성만 추가합니다:
1@ModelAttribute 2public Account addAccount(@RequestParam String number) { 3 return accountRepository.findAccount(number); 4}
1@ModelAttribute 2fun addAccount(@RequestParam number: String): Account { 3 return accountRepository.findAccount(number); 4}
이름이 명시적으로 지정되지 않은 경우,<br>
Conventions의 javadoc에 설명된 대로 타입을 기반으로 기본 이름이 선택됩니다.<br> 오버로드된addAttribute메서드를 사용하거나<br>@ModelAttribute의 name 속성을 통해 (반환 값에 대해) 항상 명시적인 이름을 지정할 수 있습니다.
Spring WebFlux는 Spring MVC와 달리 모델에서 리액티브 타입을 명시적으로 지원합니다
(예: Mono<Account> 또는 io.reactivex.Single<Account>). 이러한 비동기 모델
속성은, 다음 예제에서 보듯이, 래퍼 없이 선언된 @ModelAttribute 인자가
있는 경우, @RequestMapping 호출 시점에 그 실제 값으로 투명하게 리졸브될 수 있고
(모델이 업데이트됨) 있습니다:
1@ModelAttribute 2public void addAccount(@RequestParam String number) { 3 Mono<Account> accountMono = accountRepository.findAccount(number); 4 model.addAttribute("account", accountMono); 5} 6 7@PostMapping("/accounts") 8public String handle(@ModelAttribute Account account, BindingResult errors) { 9 // ... 10}
1import org.springframework.ui.set 2 3@ModelAttribute 4fun addAccount(@RequestParam number: String) { 5 val accountMono: Mono<Account> = accountRepository.findAccount(number) 6 model["account"] = accountMono 7} 8 9@PostMapping("/accounts") 10fun handle(@ModelAttribute account: Account, errors: BindingResult): String { 11 // ... 12}
또한 리액티브 타입 래퍼를 가진 모든 모델 속성은 뷰 렌더링 직전에 그 실제 값으로 리졸브되고 (모델이 업데이트됨) 있습니다.
@ModelAttribute를 @RequestMapping 메서드의 메서드 레벨 어노테이션으로 사용할 수도
있으며, 이 경우 @RequestMapping 메서드의 반환 값은 모델 속성으로 해석됩니다.
이는 일반적으로 필요하지 않은데, HTML 컨트롤러에서의 기본 동작이기 때문입니다.
반환
값이 그렇지 않으면 뷰 이름으로 해석될 String인 경우는 예외입니다.
@ModelAttribute는 다음 예제에서 보듯이 모델 속성 이름을 커스터마이즈하는 데도
도움이 될 수 있습니다:
1@GetMapping("/accounts/{id}") 2@ModelAttribute("myAccount") 3public Account handle() { 4 // ... 5 return account; 6}
1@GetMapping("/accounts/{id}") 2@ModelAttribute("myAccount") 3fun handle(): Account { 4 // ... 5 return account 6}
Jackson JSON
DataBinder