웹 애플리케이션 개발에서 사용자 입력 폼을 처리하는 것은 중요한 기능입니다. 스프링 MVC는 간단한 어노테이션과 데이터 바인딩 기능을 통해 폼 데이터를 처리하고, 서버 측에서 필요한 로직을 적용하는 과정을 손쉽게 지원합니다. 여기서는 @ModelAttribute와 @RequestParam을 활용한 폼 데이터 처리 방법을 다룹니다.
1. 사용자 입력 폼과 데이터 바인딩
스프링 MVC는 사용자로부터 입력받은 데이터를 컨트롤러의 메서드로 전달하여 처리할 수 있도록 자동으로 데이터 바인딩을 수행합니다.
기본 흐름
- 사용자 입력: HTML 폼을 통해 데이터를 입력받습니다.
- 데이터 바인딩: 입력 데이터를 컨트롤러 메서드의 파라미터에 매핑합니다.
- 비즈니스 로직 실행: 매핑된 데이터를 활용하여 필요한 처리를 수행합니다.
- 결과 반환: 처리 결과를 View로 전달하거나 JSON 형태로 응답합니다.
2. @ModelAttribute를 활용한 데이터 바인딩
@ModelAttribute는 사용자 입력 데이터를 객체로 바인딩할 때 사용됩니다. 주로 폼 데이터를 처리하거나 View에 데이터를 전달하는 데 유용합니다.
사용 예제: 회원 가입 폼 처리
HTML Form:
<form action="/register" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username">
<label for="email">Email:</label>
<input type="email" id="email" name="email">
<button type="submit">Submit</button>
</form>
Controller:
@Controller
@RequestMapping("/register")
public class RegistrationController {
@GetMapping
public String showRegistrationForm(Model model) {
model.addAttribute("user", new UserForm());
return "register"; // HTML 폼 View
}
@PostMapping
public String processRegistration(@ModelAttribute UserForm userForm, Model model) {
// userForm 객체에 폼 데이터가 자동으로 바인딩됩니다.
model.addAttribute("user", userForm);
return "registrationResult"; // 결과 View
}
}
UserForm 객체:
public class UserForm {
private String username;
private String email;
// Getters and Setters
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
설명:
@ModelAttribute는 폼 데이터의 키-값 쌍을UserForm객체의 필드로 자동 매핑합니다.Model객체를 통해 바인딩된 데이터를 View로 전달할 수 있습니다.
3. @RequestParam을 활용한 단일 데이터 처리
@RequestParam은 URL의 쿼리 파라미터나 폼 필드의 단일 데이터를 컨트롤러 메서드로 바인딩할 때 사용됩니다.
사용 예제: 검색 기능
HTML Form:
<form action="/search" method="get">
<label for="keyword">Search:</label>
<input type="text" id="keyword" name="keyword">
<button type="submit">Search</button>
</form>
Controller:
@RestController
@RequestMapping("/search")
public class SearchController {
@GetMapping
public String search(@RequestParam String keyword) {
return "Searching for: " + keyword;
}
}
설명:
@RequestParam은 단일 요청 파라미터를 메서드의 매개변수로 바인딩합니다.- 기본값(
defaultValue) 설정이나 필수 여부(required)를 지정할 수도 있습니다.
@GetMapping
public String search(@RequestParam(defaultValue = "default") String keyword) {
return "Searching for: " + keyword;
}
4. @ModelAttribute와 @RequestParam의 비교
| 특징 | @ModelAttribute | @RequestParam |
|---|---|---|
| 사용 목적 | 복합 데이터 객체로 바인딩 | 단일 파라미터 값 처리 |
| 대상 | 클래스 객체 | 기본 데이터 타입(String, int 등) |
| 적용 상황 | 여러 필드가 있는 폼 데이터 처리 | 단일 입력값이나 쿼리 파라미터 처리 |
| 자동 View 전달 | 객체를 자동으로 View에 전달 가능 | 수동으로 View에 전달 필요 |
5. 데이터 검증 및 오류 처리
폼 데이터를 처리할 때는 데이터 유효성 검증이 필수적입니다. 스프링 MVC는 @Valid 또는 @Validated 어노테이션을 통해 검증을 지원하며, 검증 실패 시 BindingResult를 활용하여 에러를 처리할 수 있습니다.
사용 예제: 폼 데이터 검증
UserForm 클래스:
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotEmpty;
public class UserForm {
@NotEmpty(message = "사용자명을 입력하세요.")
private String username;
@Email(message = "유효하지 않은 이메일 주소입니다.")
private String email;
// Getters and Setters
}
Controller:
@Controller
@RequestMapping("/register")
public class RegistrationController {
@PostMapping
public String processRegistration(@Valid @ModelAttribute UserForm userForm, BindingResult bindingResult, Model model) {
if (bindingResult.hasErrors()) {
return "register"; // 에러가 있을 경우 다시 폼 페이지로
}
model.addAttribute("user", userForm);
return "registrationResult";
}
}
6. 주요 개념 요약
- @ModelAttribute를 사용해 사용자 입력 폼 데이터를 객체로 바인딩합니다.
- @RequestParam은 단일 데이터를 처리할 때 유용합니다.
- 데이터 유효성 검증은
@Valid와BindingResult를 활용해 처리합니다.
결론
스프링 MVC는 간단한 어노테이션을 통해 폼 데이터와 요청 파라미터를 효율적으로 처리할 수 있습니다. @ModelAttribute와 @RequestParam의 적절한 사용과 유효성 검증을 통해 사용자 입력 데이터를 안전하고 효과적으로 관리할 수 있습니다.
'SpringBoot' 카테고리의 다른 글
| Spring Boot: 로깅(Logging) 구현하기 (1) | 2024.11.21 |
|---|---|
| Spring Boot: @ExceptionHandler와 @ControllerAdvice를 활용한 예외처리 (0) | 2024.11.20 |
| Spring Boot: 스프링 MVC 패턴 (0) | 2024.11.18 |
| Spring Boot: CRUD 기능 구현 (1) | 2024.11.17 |
| Spring Boot: 데이터베이스 연동 (0) | 2024.11.16 |