인프런 - 스프링 부트와 JPA 활용1 by 김영한 을 기반으로 작성된 글입니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
package jpabook.jpashop.controller;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotEmpty;
@Getter @Setter
public class MemberForm {
@NotEmpty(message = "회원 이름은 필수 입니다.")
private String name;
private String city;
private String street;
private String zipcode;
}
request parameter 의 null 체크하기
Bean Validation (Hibernate Validation) 에서 제공하는 표준 Validation
@NotEmpty
회원 이름을 필수적으로 사용하기 위해 Null, "" 허용하지 않는다.
" "은 허용한다
@NotNull
Null 만 허용 하지 않는다. ""과 " "은 허용한다.
@NotBlank
Null, "", " " 모두 허용하지 않는다.
package jpabook.jpashop.controller;
(생략)
import javax.validation.Valid;
@Controller
@RequiredArgsConstructor
public class MemberController {
private final MemberService memberService;
@GetMapping("/members/new")
public String createForm(Model model){
model.addAttribute("memberForm", new MemberForm());
return "members/createMemberForm";
}
@PostMapping("/members/new")
public String create(@Valid MemberForm form, BindingResult result){
if(result.hasErrors()){
return "members/createMemberForm";
}
Address address = new Address(form.getCity(), form.getStreet(), form.getZipcode());
Member member = new Member();
member.setName(form.getName());
member.setAddress(address);
memberService.join(member);
return "redirect:/";
}
}
유효성 검사, 데이터 검증 @Vaild, BindingResult
POST 요청 시 요청 값의 객체 검증
@Vaild
javax.validation 표준 어노테이션
데이터 값이 유효한지, 조건에 타당한지 확인해준다.
👉 MemberForm.java 에 있는 @NotEmpty
를 읽어 Validation 해준다
BindingResult
@Valid
객체 뒤에 BindingResult 작성하여야 한다!
결과를 담아 hasErrors() 함수를 사용해 에러 확인 후 createMemberForm.html 을 실행 시킨다
메인 화면에서 회원 가입을 선택하면
members/new controller를 통해서 템플릿(createMemberForm.html)을 가져와 렌더링한다
코드는 일부만 나타내도록 하겠다
<div class="container">
<div th:replace="fragments/bodyHeader :: bodyHeader"/>
<form role="form" action="/members/new" th:object="${memberForm}"
method="post">
<div class="form-group" >
<label th:for="name">이름</label>
<input type="text" th:field="*{name}" class="form-control"
placeholder="이름을 입력하세요"
th:class="${#fields.hasErrors('name')}? 'form-control
fieldError' : 'form-control'">
<p th:if="${#fields.hasErrors('name')}"
th:errors="*{name}">Incorrect date</p>
</div>
th:replace, th:object, th:field 처럼 th가 붙은 것은 모두 Thymeleaf 문법이다
*{name}
처럼 *
가 붙어있으면 th:object 를 참조 한다<input type="text" th:field="*{city}" class="form-control"
placeholder="도시를 입력하세요">
위의 코드를 html 로 확인해보자
<input type="text" class="form-control"
placeholder="도시를 입력하세요" id="city" name="city" value="서울">
th:field="*{city}"
가 id="city" name="city"
로 바뀐 것을 확인 할 수 있다
submit
insert 확인2) 실패 사례
이름 없이 submitWhitelabel Error
Validation failed for object='memberForm'. Error count: 1
...codes [NotEmpty.memberForm.name]
이렇게 에러 나지 않고 form 안에서 회원 이름은 필수 입니다. 라는 것을 알리고 싶다
👉 MemberController.java의 create 메소드에 BindingResult 작성 후 코드 추가 (위에서 내용 확인)
public String create(@Valid MemberForm form, BindingResult result){
if(result.hasErrors()){
return "members/createMemberForm";
}
다시 이름 없이 submit
createMemberForm의 이름 에러 발생시
th:class="${#fields.hasErrors('name')}? 'form-control fieldError' : 'form-control'"
MemberForm의 @NotEmpty message 출력
에러 발생 시 css fieldError 반영하기 위해 넣은 코드
<style>
.fieldError {
border-color: #bd2130;
}
</style>
에러가 있으면 name과 관련된 속성 에러 출력
<p th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Incorrect date</p>
해당 데이터를 다 작성하고 submit 클릭하면
입력한 값을 POST 방식으로 /members/new 페이지로 보낸다
Thymeleaft에서 error 발생 시 적용하는 방법을 쉽게 확인 가능하다
적용 방법 쉽게 확인 하기