728x90
320x100
[참고]
김영한님 스프링 강의를 바탕으로 진행되는 토이프로젝트의 과정을 기록하는 글입니다.
둥근 피드백은 언제나 환영입니다.
[오늘의 개발내용]
1. Validation 설정하기 (서버검증)
각 폼의 Validation 설정이 필요한데 나는 보통 클라이언트 검증을 활용해 왔음.
그런데 이번에 서버 검증을 배웠으니 최대한 서버 검증을 활용하여 Validation 을 체크해볼 예정!
1. errors.properties 만들기
required=필수로 입력해야 합니다.
required.member.id=ID는 필수입니다.
required.member.nickName=별명은 필수입니다.
required.member.password=비밀번호는 필수입니다.
required.timeline.bookId=책 등록은 필수입니다.
required.timeline.content=내용은 필수입니다.
- 기존에 messages.properties에 작성해도 되나, 따로 작성하는게 관리에 용이할듯 해서 에러 관련 프로퍼티스를 새로 만들어 구분해줬음.
그런데 새로 프로퍼티스를 만들 경우 반드시 아래와 같이 설정파일에 추가해줘야 함.
난 이걸 안해줘서....계속 안되서...너무 힘들었다.....
(+) application.properties
logging.level.org.apache.coyote.http11=debug
spring.messages.basename=messages,errors //검증
2. 검증 로직 짜기
MemberValidator.java
package toyproject.bookbookclub.web.validation;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import toyproject.bookbookclub.domain.Members.Member;
@Component
public class MemberValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return Member.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Member member = (Member) target;
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "id", "required");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "nickName", "required");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "required");
}
}
- 먼저 검증 로직을 따로 짜줌. (관리에 용이하기 위해)
- @Component 로 빈으로 등록해주고 Validator를 implements받아 supports와 validate 함수를 구현해줌.
- supports : 어떤 클래스에 적용할 것인지 지정하는 것
- validate : 실제 검증 구현부.
- 검증은 일단 필수값 입력만 확인하도록 했다.
- @Component 로 빈으로 등록해주고 Validator를 implements받아 supports와 validate 함수를 구현해줌.
3. 컨트롤러에 검증부분 삽입하기
BasicMemberController.java
private final MemberValidator memberValidator;
@InitBinder
public void init(WebDataBinder dataBinder){
dataBinder.addValidators(memberValidator);
}
@PostMapping("/join")
public String join(@Validated @ModelAttribute Member member
, BindingResult bindingResult
, RedirectAttributes redirectAttributes ){
if (bindingResult.hasErrors()){ //검증된 것이 있으면
return "basic/joinForm";
}
Member savedMember = memberRepository.save(member);
// return "basic/member";
redirectAttributes.addAttribute("memberId", savedMember.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/basic/members/{memberId}";
}
- memberValidator만든 것을 주입해주고
- @InitBinder 어노테이션을 이용해 컨트롤러 돌때마다 먼저 검증 내역을 담아줌
- 그다음에 join 부분에서는 검증된 내역이 있냐 없냐만 따져서 걸린게 있으면 현재 폼을 리턴하고 걸린게 없으면 저장으로 넘어가게끔 구현.
- 반드시 BindingResult 는 @ModelAttribute 다음에 작성해줘야 함.
- @Validated 어노테이션 적용!
3. 회원가입 폼 타임리프 에러관련 내용 삽입하기
<div>
<label for="id" th:text="#{label.member.id}">회원 아이디</label>
<input type="text" id="id" th:field="*{id}" th:errorclass="field-error"
class="form-control" placeholder="회원 아이디를 입력하세요">
<div class="field-error" th:errors="*{id}">회원ID 오류</div>
</div>
- th:errorclass : 검증에 걸리면 해당 클래스를 삽입해줌.
- th:errors : 검증에 걸리면 해당 div를 보여줌. 안에 텍스트는 그대로 나오지 않고 error.pererties에서 치환됨.
[구현화면]
저장을 눌렀을 때 아무것도 입력하지 않으면 요러케 뜸!
728x90
320x100
'💻 뚝딱뚝딱 > (구) 북북클럽' 카테고리의 다른 글
[개발일지#026] 파일첨부 기능 만들기 (회원 프로필 이미지) (+) 피드백 반영 (2) | 2024.03.15 |
---|---|
[개발일지#024] 인터셉터를 활용하여 로그인 구현하기 (3) | 2024.03.11 |
[개발일지#022] 스프링 메시지화, 국제화 적용하기 (2) | 2024.03.07 |
[개발일지#021] 타임리프 th:object, th:field 적용하기 (0) | 2024.03.06 |
[개발일지#020] 타임리프 템플릿 레이아웃 이용하여 페이지마다 title 변경되도록 수정 (0) | 2024.03.05 |