본문 바로가기
Spring/Spring boot

BindingResult 와 rejectValue 스프링 회원가입 유효성 검사

by java나유 2022. 11. 3.

스프링 프레임워크로 사용자 회원가입과 로그인을 컨트롤할 controller 코드중에서 사용한 주요 메소드를 간략히 정리했다.

@PostMapping("/signup") // Post: 회원가입 진행
    public String signup(@Valid UserCreateForm userCreateForm, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "signup_form";
        }

        if (!userCreateForm.getPassword1().equals(userCreateForm.getPassword2())) {
            bindingResult.rejectValue("password2", "passwordInCorrect",
                    "📌패스워드가 일치하지 않습니다.");
            return "signup_form";
        }
        //중복 확인
        try {
            userService.create(userCreateForm.getUsername(),
                    userCreateForm.getEmail(), userCreateForm.getPassword1());
        }
        catch (DataIntegrityViolationException e){
            e.printStackTrace();
            bindingResult.reject("signupFailed","이미 등록된 사용자입니다.");
            return "signup_form";
        }

        catch (Exception e){
            e.printStackTrace();
            bindingResult.reject("signupFailed",e.getMessage());
            return "signup_form";
        }

        return "redirect:/";
    }

 

BindingResult 

검증오류를 보관하는 객체이다. 매개변수에서 자신이 검증할 객체 바로 다음에 위치해야한다.

 

@Valid UserCreateForm userCreateForm, BindingResult bindingResult

필드 오류 처리를 단순화 하는  

rejectValue rejectValue(필드명, 오류코드, 에러메시지)

를 사용한다. 

if (!userCreateForm.getPassword1().equals(userCreateForm.getPassword2())) {
            bindingResult.rejectValue("password2", "passwordInCorrect",
                    "📌패스워드가 일치하지 않습니다.");
            return "signup_form";
        }

패스워드1과 패스워드2가 일치하지않으면 

패스워드2 (필드명)에 passwordInCorrect (오류코드) 를 삽입하고 에러메시지 "패스워드가 일치하지않습니다" 하고 돌려준다.

html에서는 이 오류 메세지를 어떻게 처리하냐면 

 

공통으로 사용할 form_errors.html를 만들어주고

 

<div th:fragment="formErrorsFragment" class="alert alert-danger"
     role="alert" th:if="${#fields.hasAnyErrors()}" xmlns:th="http://www.w3.org/1999/xhtml">
  <div th:each="err : ${#fields.allErrors()}" th:text="${err}" />
</div>

 

해당 html들에

    <div th:replace="form_errors :: formErrorsFragment"></div>

를 삽입해주면된다.

728x90

댓글