스프링에서 http에서의 get, post등의 요청으로 들어온 데이터를 받아오는 방법으로 @RequestParam을 알아 본 적이 있다. 다른 방식인 Command Object를 알아보겠다.
Command Object는 Http를 통해 들어온 요청 파라미터들을 객체로 만든 DTO
다음을 회원가입 예시를 통해 알아보자
검증을 위해서 build.gradle에 다음을 추가하자
implementation 'org.springframework.boot:spring-boot-starter-validation'
UserCreateForm.java
@Getter
@Setter
public class UserCreateForm {
@Size(min = 3, max = 25)
@NotEmpty(message = "사용자ID는 필수항목입니다.")
private String username;
@NotEmpty(message = "비밀번호는 필수항목입니다.")
private String password1;
@NotEmpty(message = "비밀번호 확인은 필수항목입니다.")
private String password2;
}
signup_form.html
<form th:action="@{/user/signup}" th:object="${userCreateForm}" method="post">
<div th:replace="~{form_errors :: formErrorsFragment}"></div>
<div class="mb-3">
<label for="username" class="form-label">사용자ID</label>
<input type="text" th:field="*{username}" class="form-control">
</div>
<div class="mb-3">
<label for="password1" class="form-label">비밀번호</label>
<input type="password" th:field="*{password1}" class="form-control">
</div>
<div class="mb-3">
<label for="password2" class="form-label">비밀번호 확인</label>
<input type="password" th:field="*{password2}" class="form-control">
</div>
<button type="submit" class="btn btn-secondary">회원가입</button>
</form>
UserController.java
@GetMapping("/signup")
public String signup(UserCreateForm userCreateForm) {
return "signup_form";
}
@PostMapping("/signup")
public String signup(@Valid UserCreateForm userCreateForm, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "signup_form";
}
if (!userCreateForm.getPassword1().equals(userCreateForm.getPassword2())) {
bindingResult.rejectValue("password2", "passwordInCorrect",
"2개의 패스워드가 일치하지 않습니다.");
return "signup_form";
}
if (siteUserService.findByUsername(userCreateForm.getUsername())){
bindingResult.rejectValue("username", "usernameDuplicated",
"이미 사용중인 사용자ID입니다.");
return "signup_form";
}
return "redirect:/";
}