728x90
Entity 클래스에 @Id, @Size, @NotBlank 등을 붙여주고 Controller 클래스에서 @Valid 어노테이션을 추가적으로 사용함으로써 기본적인 검증은 가능하다.
1. 기본 form 입력값 검증하기
@Data
@Entity
@DynamicUpdate
@DynamicInsert
@Table(name = "tb_userinfo")
@IdClass(MemberID.class)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Id
@NotNull
@Pattern(regexp = "^[a-z0-9]*$", message = "username은 영문(소문자)과 숫자만 가능합니다.")
@Size(min = 5, max = 20, message = "username은 5자 이상 20자 이하입니다.")
private String username;
@NotNull
@Size(min = 6, max = 100, message = "암호는 6자 이상 100자 이하 입니다.")
private String password;
@NotNull
@Size(min = 6, max = 45, message = "올바른 이메일을 입력하세요.")
@Email(message = "이메일 형식을 맞춰주세요.")
private String email;
@Column
private String role;
}
- 각 필드별로 제약조건 어노테이션을 추가해준다.
@GetMapping("/joinForm")
public String joinForm(Model model) {
model.addAttribute("member", new Member());
return "/account/joinForm";
}
@PostMapping("/join")
public String join(@Valid Member member, BindingResult bindingResult){ // view의 form->input 의 name과 매핑됨.
if(bindingResult.hasErrors()) {
return "/account/joinForm";
}
String encPwd = memberService.pwdEncoding(member.getPassword());
member.setPassword(encPwd);
memberService.join(member);
return "redirect:/loginForm";
}
- GetMapping으로 처음 회원가입 화면으로 진입할 때 Member 객체를 만들어서 member라는 키값으로 전달해준다.
- PostMapping에서는 View에서 데이터를 담아 전달해준 member 객체에 @Valid 어노테이션을 달아준다.
- BindingResult.hasErrors()를 통해 기본적인 에러 유무를 알아 낼 수 있고, 다시 회원가입 화면으로 돌려보낸다.
<form th:action="@{/join}" method="post" th:object="${member}">
<div class="form-floating mt-4">
<input type="text" class="form-control" th:field="*{username}" th:classappend="${#fields.hasErrors('username')} ? 'is-invalid'" id="floatingInput" placeholder="Username">
<label for="floatingInput">Username</label>
<div th:if="${#fields.hasErrors('username')}" th:errors="*{username}" id="validationServer03Feedback" class="invalid-feedback text-start">
Username Error
</div>
</div>
<div class="form-floating">
<input type="password" class="form-control mt-2" th:field="*{password}" th:classappend="${#fields.hasErrors('password')} ? 'is-invalid'" id="floatingPassword" placeholder="Password">
<label for="floatingPassword">Password</label>
<div th:if="${#fields.hasErrors('password')}" th:errors="*{password}" id="validationServer03Feedback" class="invalid-feedback text-start" style="margin-bottom: 8px;">
Password Error
</div>
</div>
<div class="form-floating">
<input type="email" class="form-control" th:field="*{email}" th:classappend="${#fields.hasErrors('email')} ? 'is-invalid'" id="floatingPassword" placeholder="Email">
<label for="floatingPassword">example@board.com</label>
<div th:if="${#fields.hasErrors('email')}" th:errors="*{email}" id="validationServer03Feedback" class="invalid-feedback text-start" style="margin-top: 8px;">
Email Error
</div>
</div>
<div class="checkbox mb-3">
</div>
<button class="w-100 btn btn-lg btn-primary mt-2" type="submit">Get started!</button>
<a type="button" class="w-100 btn btn-lg btn-primary mt-2" th:href="@{/}">exit</a>
</form>
- 타임리프의 th:if가 달린 3개의 div 태그에서 에러를 출력해준다.
- th:if=${#fields.hasErrors('필드명')} : 에러가 발생한 경우 true 값을 반환하여 div태그를 표시해준다.
- form 태그의 th:object="{member}" : GetMapping 때 전달받은 Member의 키 값을 넣어 전달 받은 객체
- "*{username}" : 위 설명을 참고해서 Member.getUsername()을 View에서 사용할 수 있도록 한 값이다. -> ${member.username} 과 같다고 생각!
- th:errors="*{password}" : password에 대한 에러 내용을 표시해준다.
'Web > SpringBoot' 카테고리의 다른 글
[Spring Boot] JPA 복합키에 따른 repository (0) | 2021.12.20 |
---|---|
[Spring Boot] 커스텀 Validator로 폼 입력값 검증하기 (0) | 2021.12.19 |
[Spring Boot] JPA 복합키 조인 및 식별자 클래스 - @ManyToOne, @IdClass (0) | 2021.12.18 |
[SpringBoot] 4. Spring Security 로그인 객체 가져오기 (+ 로그인 초기화) (0) | 2021.12.18 |
[Spring Boot] 3. Spring Security 권한 설정 (0) | 2021.12.17 |