본문 바로가기

개발(합니다)/Java&Spring

Spring 유효성 검사(hibernate)

반응형

회원가입 유효성 검사를 위해 정리한 내용입니다.



1. pom.xml 설정

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.10.Final</version>
        </dependency>


2. MemberVO 유효성 설정

public class MemberVO extends LoginVO {

    @Pattern(regexp = "^[a-z | A-Z]{3,6}[0-9]{3,6}$")
    private String user_id;
    
    @Pattern(regexp="^.*(?=.{6,20})(?=.*[0-9])(?=.*[a-zA-Z]).*$")
    private String password;
    
    private String sign_date;

    @Email()
    private String email;

    private String ip;

    @Pattern(regexp = "^(01[1|6|7|8|9|0])-(\\d{3,4})-(\\d{4})$")
    private String phone;

    @Pattern(regexp = "^[가-힣]{2,6}$")
    private String name;

    private String birth_day;

    private String solar_birth_yn;

    @Pattern(regexp = "^[가-힣]+[가-힣\\s]*$")
    private String address;
    private String write_date;




기타 제약 사항

아노테이션

설명

@AssertFalse값이 false 인지 확인합니다.
@AssertTrue값이 true 인지 확인합니다.
@DecimalMax(value=, inclusive=)inclusive=false일때 지정된 최대값 보다 작은지 확인합니다.
inclusive=true 이면 값이 지정된 최대값보다 작거나 같은지 확인합니다. 매개변수 값은 BigDecimal 문자열 표현에 따라 최대값의 문자열 표현입니다.
@DecimalMin(value=, inclusive=)값이 inclusive=false일때 지정된 최소값 보다 큰지 확인합니다.
inclusive=true 이면 값이 지정된 최소값보다 크나 같은지 확인합니다.
매개변수 값은 BigDecimal 문자열 표현에 따라 최소값의 문자열 표현입니다.
@Digits(integer=, fraction=)값이 integer=와 fraction=에 의해 지정된 자리수의 숫자인지 확인합니다.
@Email지정된 문자 시퀀스가 유효한 전자 메일 주소인지 여부를 확인합니다.
선택적 매개 변수 regexp 및 flags를 사용하면 전자 메일과 일치해야하는 추가 정규 표현식 (정규식 플래그 포함)을 지정할 수 있습니다.
@Future날짜가 미래인지 확인합니다.
@FutureOrPresent날짜가 현재 또는 미래인지 확인합니다.
@Max(value=)값이 지정된 최대값보다 작거나 같은지 확인합니다.
@Min(value=)값이 지정된 최소값보다 크거나 같은지 확인합니다.
@NotBlank값이 null이 아니고, 트림 된 길이가 0보다 큰지 확인합니다.
@NotEmpty와의 차이점은 이 제약은 CharSequence에만 적용되고 트림된다는 것입니다.
@NotEmpty값이 null도 빈것도 아닌지 확인합니다.
@NotNull값이 null이 아닌지 체크합니다.
@Negative값이 음수인지 확인합니다.
@NegativeOrZero값이 음수이거나 0인지 확인합니다.
@Null값이 null인지 확인합니다.
@Past값이 과거일자인지 확인합니다.
@PastOrPresent값이 과거 또는 현재인지 확인합니다.
@Pattern(regex=, flags=)주어진 플래그 매치를 고려하여 값이 정규식 regex와 일치하는지 검사합니다.
@Positive값이 양수 인지 확인합니다.
@PositiveOrZero값이 양수이거나 0인지 확인합니다.
@Size(min=, max=)값이 min=과 max= 사이에 있는지 확인합니다.(경계 포함)




3. message-context.xml

폴더 구성




<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- Encoding 설정 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- Reload Cache 설정 -->
<property name="cacheSeconds" value="5"/>
<!-- basenames 설정: 아래처럼 하면 WEB-INF 밑의 message 폴더 아래의 labels로 시작하는 모든 Property-->
<property name="basenames">
<list>
<value>/WEB-INF/message/message</value>
</list>
</property>
</bean>


message_ko_KR.properties

<!-- MemberVo Valid -->
Pattern.memberVo.user_id="아이디는 영문 3글자 + 숫자 3글자 조합으로 6~8자리로 입력주세요."

Email.memberVo.email="이메일 형식이 아닙니다."

Pattern.memberVo.phone="폰 번호 형식이 아닙니다."

Pattern.memberVo.name="이름은 한글 2~6자리로 입력해주세요."

Pattern.memberVo.address="한글로 작성해주세요."

Pattern.memberVo.password="영문 숫자 조합으로 6자리 이상 20자리 이하로 비밀번호를 만들어주세요."

4. Contoller에서 @Valid 설정

    @GetMapping("/sign")
    public String memberSign(Model model) {
        logger.info("-------GET member sign");
        model.addAttribute("memberVo", new MemberVO());

        return "member/sign_form";
    }

스프링에서 제공하는 Form의 ModelAttribute에 담고자 하는 VO를 생성하여 전달합니다.
jsp form의 태그 중 modelAttribute를 확인


    @PostMapping(value = "")
    public String memberInsert(Model model, @ModelAttribute("memberVo") @Valid MemberVO memberVo,
            BindingResult bindingResult, RedirectAttributes rttr) {
        logger.info("--------------POST member-----");
        if (bindingResult.hasErrors()) {
            return "member/sign_form";
        }

        int count = loginService.checkSignLoginId(memberVo.getUser_id());
        if (count != 0) {
            model.addAttribute("MSG", MessageUtils.getMessage("fail.Sign"));
            return "member/sign_form";
        } else {
            memberService.loginAndMemberInsert(memberVo);
            rttr.addFlashAttribute("MSG", MessageUtils.getMessage("success.Sign"));
            return "redirect:/";
        }

    }


jsp form에서 저장해두었던 @ModelAttribute("memberVo")을 받아 @Valid MemberVO memberVo의 유효성 검사를 합니다.

BindingResult는 유효성 검사가 끝난 후 오류가 있으면 에러를 담아둡니다.


5. View - Form 체크(jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입</title>
</head>
<body onload="document.f.user_id.focus();">
    <f:form name="f" action="${pageContext.request.contextPath }/member"
        method="POST" modelAttribute="memberVo">
        <table>
            <tr>
                <td>아이디 (영문 3글자+숫자 3글자 조합)</td>
         <!-- <td><input type="text" id="user_id" name="user_id" onfocus="this.value=''"/></td> -->
                <td><f:input path="user_id" /></td>
                <td><input type="button" value="중복확인" onclick="check_id()" />
                <f:errors path="user_id" cssClass="error" /></td>
            </tr>
            <tr>
                <td>비밀번호(6~20자리)</td>
                <!-- <td><input type="password" id="password" /></td> -->
                <td><f:password path="password" /> </td>
                <td><f:errors path="password"
                        cssClass="error" /></td>
            </tr>
            <tr>
                <td>이름</td>
                <!-- <td><input type="text" id="name" /></td> -->
                <td><f:input path="name" /> </td>
                <td><f:errors path="name"
                        cssClass="error" /></td>
            </tr>
            <tr>
                <td>email</td>
                <!-- <td><input type="text" id="email" /></td> -->
                <td><f:input path="email" /> </td>
                <td><f:errors path="email"
                        cssClass="error" /></td>
            </tr>
            <tr>
                <td>핸드폰(010-1234-1234)</td>
                <!-- <td><input type="text" id="phone" /></td> -->
                <td><f:input path="phone" /> </td>
                <td><f:errors path="phone"
                        cssClass="error" /></td>
            </tr>
            <tr>
                <td>생년월일</td>
                <!-- <td><input type="date" id="birth_day" /></td> -->
                <td><f:input type="date" path="birth_day" /></td>
                <td></td>
            </tr>
            <tr>
                <td>양력/읍력 사용</td>
                <!-- <td><select name="solar_yn" id="solar_yn">
                        <option value="1">양력</option>
                        <option value="0">음력</option>
                </select></td> -->
                <td><f:select path="solar_birth_yn" id="solar_birth_yn">
                        <f:option value="1">양력</f:option>
                        <f:option value="0">음력</f:option>
                    </f:select></td>
            </tr>
            <tr>
                <td>주소</td>
                <!-- <td><input type="text" id="address" /></td> -->
                <td><f:input path="address" /> </td>
                <td><f:errors path="address"
                        cssClass="error" /></td>
            </tr>
        </table>

        <input type="button" value="가입" onclick="ip_pass()">
        <input type="reset" value="리셋">
        <input type="button" value="취소" onclick="cancel_sign()">
        <input type="hidden" id="client_id_sign" value="">
    </f:form>
    ${MSG }
</body>
</html>
<f:input>은 폼에서 제공하는 html input과 같습니다. path에는 modelAttribute에 해당하는 명칭을 작성합니다.
<f:errors>는 VO에 해당하는 전달 받은 에러를 출력합니다.



6. 실행 결과




반응형