1. 개요

가장 중요한 Spring-MVC 어노테이션 중 하나는 @ModelAttribute 어노테이션입니다.

@ModelAttribute는 명명 된 모델 속성에 메서드 매개 변수 또는 메서드 반환 값을 결합하는 어노테이션과 후 웹보기를 제공합니다.

다음 예에서는 회사 직원이 제출 한 양식이라는 공통 개념을 통해 어노테이션의 유용성과 기능을 보여줍니다.

2. 깊이 있는 @ModelAttribute

소개 단락에서 알 수 있듯이 @ModelAttribute 는 메서드 매개 변수 또는 메서드 수준에서 사용할 수 있습니다.

2.1 방법 수준에서

어노테이션이 메소드 레벨에서 사용되면 해당 메소드의 목적이 하나 이상의 모델 속성을 추가하는 것임을 나타냅니다. 이러한 메서드는 @RequestMapping 메서드 와 동일한 인수 유형을 지원 하지만 요청에 직접 매핑 할 수 없습니다.

이것이 어떻게 작동하는지 이해하기 위해 여기에서 간단한 예를 살펴 보겠습니다.

@ModelAttribute
public void addAttributes(Model model) {
    model.addAttribute("msg", "Welcome to the Netherlands!");
}

예제에서는 컨트롤러 클래스에 정의 된 모든 모델에 msg 라는 속성을 추가하는 메서드를 보여줍니다 .

물론이 기사의 뒷부분에서이 작업을 볼 수 있습니다.

일반적으로 Spring-MVC는 요청 핸들러 메소드를 호출하기 전에 항상 해당 메소드를 먼저 호출합니다. 즉, @RequestMapping 으로 어노테이션이 달린 컨트롤러 메서드가 호출되기 전에 @ModelAttribute 메서드가 호출 됩니다. 시퀀스의 논리는 컨트롤러 메서드 내에서 처리가 시작되기 전에 모델 개체를 만들어야한다는 것입니다.

각 클래스에 @ControllerAdvice 로 어노테이션을 추가하는 것도 중요합니다 . 따라서 글로벌로 식별 될 모델 에 값을 추가 할 수 있습니다 . 이것은 실제로 모든 요청에 ​​대해 응답 부분의 모든 메서드에 대해 기본값이 존재 함을 의미합니다.

2.2 메서드 인수로

메서드 인수로 사용되는 경우 모델에서 인수를 검색해야 함을 나타냅니다. 존재하지 않는 경우 먼저 인스턴스화 한 다음 모델에 추가하고 모델에 있으면 인수 필드는 이름이 일치하는 모든 요청 매개 변수에서 채워 져야합니다.

직원 모델 속성 을 따르는 코드 조각 에서 addEmployee 끝점에 제출 된 양식의 데이터로 채워집니다 . Spring MVC는 submit 메소드를 호출하기 전에 배후에서이를 수행합니다.

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
public String submit(@ModelAttribute("employee") Employee employee) {
    // Code that uses the employee object

    return "employeeView";
}

이 기사의 뒷부분에서 employee 개체를 사용 하여 employeeView 템플릿 을 채우는 방법에 대한 전체 예제를 살펴 보겠습니다 .

따라서 양식 데이터를 빈과 바인딩합니다. @RequestMapping 어노테이션이 달린 컨트롤러 @ModelAttribute 어노테이션이 달린 사용자 정의 클래스 인수를 가질 수 있습니다 .

이것은 일반적으로 Spring-MVC에서 데이터 바인딩으로 알려진 것으로, 각 양식 필드를 개별적으로 구문 분석하지 않아도되는 공통 메커니즘입니다.

3. 양식 예

이 섹션에서는 개요 섹션에 언급 된 예를 제공합니다. 사용자 (특정 예에서는 회사의 직원)에게 일부 개인 정보 (특히 이름ID) 를 입력하라는 메시지를 표시하는 매우 기본적인 양식입니다 . 제출이 완료되고 오류없이 사용자는 이전에 제출 된 데이터가 다른 화면에 표시되기를 기대합니다.

3.1보기

먼저 id 및 name 필드가있는 간단한 양식을 만들어 보겠습니다.

<form:form method="POST" action="/spring-mvc-basics/addEmployee" 
  modelAttribute="employee">
    <form:label path="name">Name</form:label>
    <form:input path="name" />
    
    <form:label path="id">Id</form:label>
    <form:input path="id" />
    
    <input type="submit" value="Submit" />
</form:form>

3.2 컨트롤러

다음은 앞서 언급 한 뷰에 대한 논리가 구현되는 컨트롤러 클래스입니다.

@Controller
@ControllerAdvice
public class EmployeeController {

    private Map<Long, Employee> employeeMap = new HashMap<>();

    @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
    public String submit(
      @ModelAttribute("employee") Employee employee,
      BindingResult result, ModelMap model) {
        if (result.hasErrors()) {
            return "error";
        }
        model.addAttribute("name", employee.getName());
        model.addAttribute("id", employee.getId());

        employeeMap.put(employee.getId(), employee);

        return "employeeView";
    }

    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("msg", "Welcome to the Netherlands!");
    }
}

제출 () 방법 우리는이 직원 우리에 바인딩 개체 보기를 . 이 어노테이션의 힘을 볼 수 있습니까? 간단하게 양식 필드를 개체 모델에 매핑 할 수 있습니다. 메서드에서 우리는 폼에서 값을 가져 와서 ModelMap으로 설정합니다 .

결국 우리는 employeeView 를 반환 하는데, 이는 각각의 JSP 파일이 View 대표 로 호출된다는 것을 의미합니다 .

또한 addAttributes () 메서드도 있습니다. 그 목적은 전 세계적으로 식별 될 모델 에 값을 추가 하는 것입니다. 즉, 모든 컨트롤러 메서드에 대한 모든 요청에 ​​대한 응답으로 기본값이 반환됩니다. 또한 특정 클래스에 @ControllerAdvice 로 어노테이션을 달아야 합니다.

3.3 모델

앞에서 언급했듯이 Model 개체는 매우 단순하며 "프런트 엔드"특성에 필요한 모든 것을 포함합니다. 이제 예제를 살펴 보겠습니다.

@XmlRootElement
public class Employee {

    private long id;
    private String name;

    public Employee(long id, String name) {
        this.id = id;
        this.name = name;
    }

    // standard getters and setters removed
}

3.4 마무리

@ControllerAdvice는 컨트롤러를 지원하고, 특히에서 @ModelAttribute 모두에 적용되는 방법 @RequestMapping의 방법. 물론, 우리의 addAttributes () 메소드는 나머지 @RequestMapping 메소드 보다 먼저 실행될 것 입니다.

이 점을 염두에두고 submit ()addAttributes ()를 모두 실행 한 후에는 $ 와 같이 달러화 중괄호 듀오 안에 주어진 이름을 언급 하여 Controller 클래스 에서 반환 된 View 에서 참조 할 수 있습니다. {name} .

3.5 결과보기

이제 양식에서받은 내용을 인쇄 해 보겠습니다.

<h3>${msg}</h3>
Name : ${name}
ID : ${id}

4. 결론

이 사용방법(예제)에서는 메서드 인수 및 메서드 수준 사용 사례 모두에 대해 @ModelAttribute 어노테이션 의 사용을 조사했습니다 .

이 간단한 예제의 구현은 github 프로젝트 에서 찾을 수 있습니다 .