본문 바로가기
💻 뚝딱뚝딱/북북클럽

[개발일지#023] Validation 설정하기 (서버검증)

by 뚜루리 2024. 3. 8.
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 : 실제 검증 구현부.
    • 검증은 일단 필수값 입력만 확인하도록 했다.

 

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}";
    }
  1. memberValidator만든 것을 주입해주고
  2. @InitBinder 어노테이션을 이용해 컨트롤러 돌때마다 먼저 검증 내역을 담아줌
  3. 그다음에 join 부분에서는 검증된 내역이 있냐 없냐만 따져서 걸린게 있으면 현재 폼을 리턴하고 걸린게 없으면 저장으로 넘어가게끔 구현.
  4. 반드시 BindingResult 는 @ModelAttribute 다음에 작성해줘야 함.
  5. @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