반응형
이번 포스트에서는 @ModelAttribute를 활용한 데이터 바인딩 방식에 대해 알아보자
1. modelAttribute 방식으로 폼을 작성하고 전송하는 장점
- 데이터 바인딩의 용이성:
- modelAttribute 속성을 사용하여 폼 데이터를 모델 객체에 자동으로 바인딩할 수 있다.
- 이를 통해 컨트롤러에서 해당 모델 객체를 매개변수로 받아 데이터를 쉽게 처리할 수 있다.
- form 필드의 이름과 model 객체의 필드 이름이 일치하면 자동으로 데이터가 매핑되어 컨트롤러에서 별도의 데이터 추출 및 변환 과정 없이 데이터를 사용할 수 있다.
- 유효성 검증의 편의성:
- Spring MVC는 @Valid 어노테이션을 통해 데이터의 유효성을 검증할 수 있다.
- modelAttribute 방식을 사용하면 모델 객체에 @Valid 어노테이션을 적용하여 데이터의 유효성을 검사할 수 있다.
- 검증 결과는 BindingResult 객체를 통해 확인할 수 있고, 필요한 경우 에러 메시지를 생성하여 화면에 표시할 수 있다.
- 중복 코드 감소:
- modelAttribute 방식을 사용하면 반복적인 폼 필드 작성을 줄일 수 있다.
- 모델 객체의 필드를 자동으로 폼 필드에 매핑하므로 폼의 구조와 모델 객체의 구조가 일치하면 일일이 폼 필드를 작성할 필요가 없다. 이를 통해 코드의 중복을 줄이고 개발 생산성을 향상시킬 수 있다.
- 데이터 변환의 자동화:
- modelAttribute 방식은 데이터 변환을 자동으로 처리할 수 있다.
- 예를 들어, 폼 필드에 입력된 문자열을 자동으로 숫자나 날짜 형식으로 변환하여 모델 객체의 필드에 할당할 수 있다. 이는 데이터 유효성 검증 및 처리 과정에서 데이터 변환에 대한 번거로움을 줄여준다.
- 템플릿 엔진과의 통합:
- modelAttribute 방식은 뷰 템플릿 엔진과 통합하여 데이터를 렌더링하는 데 편리하다.
- 뷰 템플릿 엔진에서는 모델 객체에 접근하여 폼 필드의 초기값을 설정하거나 폼 필드의 값을 출력하는 등의 작업을 쉽게 수행할 수 있다.
- 유지보수 용이성:
- modelAttribute 방식은 코드의 가독성과 유지보수성을 높여준다.
- 폼 데이터의 구조와 모델 객체의 구조가 일치하므로 코드의 의도가 명확하게 드러난다. 또한, form 필드의 변경이 필요한 경우에도 모델 객체의 필드를 수정하면 되므로 유지보수 작업이 간편해진다.
위의 장점들은 modelAttribute 방식을 사용하여 form을 작성하고 전송할 때의 이점을 나타낸다.
이를 통해 개발자는 form 처리에 대한 번거로움을 줄이고 간결하고 효율적인 코드를 작성할 수 있다.
2. modelAttribute 방식을 사용하여 폼을 작성하고 전송하는 방법
도메인 클래스 작성
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class UserForm {
@NotNull
@Size(min = 2, max = 30)
private String name;
@NotNull
private Integer age;
// getters and setters
}
컨트롤러 클래스 작성
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.validation.Valid;
@Controller
public class UserController {
@GetMapping("/user")
public ModelAndView showForm() {
return new ModelAndView("userForm", "userForm", new UserForm());
}
@PostMapping("/user")
public String submitForm(@Valid @ModelAttribute("userForm") UserForm userForm, BindingResult result) {
if (result.hasErrors()) {
return "userForm"; // 에러가 있을 경우 다시 폼 페이지로
}
// 폼 데이터 처리 로직
return "success"; // 성공 페이지로 리다이렉트
}
}
뷰 템플릿 작성 - thymeleaf
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>User Form</title>
</head>
<body>
<form action="#" th:action="@{/user}" th:object="${userForm}" method="post">
<label for="name">Name:</label>
<input type="text" th:field="*{name}" id="name" />
<div th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</div>
<label for="age">Age:</label>
<input type="text" th:field="*{age}" id="age" />
<div th:if="${#fields.hasErrors('age')}" th:errors="*{age}">Age Error</div>
<button type="submit">Submit</button>
</form>
</body>
</html>
이 코드는 modelAttribute 방식을 사용하여 폼 데이터를 UserForm 객체에 자동으로 바인딩하고, 유효성 검사를 수행하며, 뷰 템플릿 엔진과 통합하여 데이터를 렌더링한다. 이를 통해 코드의 중복을 줄이고 개발 생산성을 향상시킬 수 있다.
2023.08.08 - [Spring 기초/spring 어노테이션] - Spring Boot 기초: 어노테이션 활용하기 (1편)
2023.08.08 - [Spring 기초/spring 어노테이션] - Spring Boot 심화: 커스텀 어노테이션 만들기 (2편)
반응형
'Spring 기초 > Spring 기초 지식' 카테고리의 다른 글
스프링에서의 데이터베이스 접근 방법: DAO, Mapper, 그리고 @Mapper 어노테이션 사용법 (0) | 2023.08.09 |
---|---|
스프링에서 데이터 전달의 핵심: VO와 DTO의 이해 및 활용 (0) | 2023.08.09 |
Spring Boot에서 REST 컨트롤러 활용하기: @RestController 어노테이션 이해하기 (0) | 2023.08.08 |
Spring Boot 심화: 커스텀 어노테이션 만들기 (2편) (0) | 2023.08.08 |
Spring Boot 기초: 어노테이션 활용하기 (1편) (0) | 2023.08.08 |