개발군싹

[Spring]Hibernate? (Hibernate-validator document 참고) 본문

Spring

[Spring]Hibernate? (Hibernate-validator document 참고)

개발자군싹 2023. 12. 13. 17:11

hibernate-validator 6.2.5 ver pom.xml에 추가

- WAS에 Client로 요청받은 데이터가 입력되었을 때 클래스에 저장되는 데이터에 대해 필터링을 할 수 있다.

validator 처리할 객체에 어노테이션 방식으로 필요한 validator어노테이션을 설정할 수 있다.

 

예제 ) MemberController ⇒ enrollMember에서 객체를 Model에 저장 후 jsp화면으로 전환

@RequestMapping("/enrollMember.do")
public void enrollMember(@ModelAttribute("member") Member m) {}

 

 

 

JSP화면

➡️ JSTL prefix=”springform” 설정

<springform:form modelAttribute="member" action="${path }/member/enrollMemberEnd.do" name="memberEnrollFrm">

 

➡️ MemberController에서 ModelAttribute에 저장한 객체를 JSP화면에서 springform태그 선언부에 modelAttribute 속성을 선언하여 Validaotr 체크할 객체를 매칭한다.

 

 

 

EnrollMember.jsp

<springform:form modelAttribute="member" action="${path }/member/enrollMemberEnd.do" name="memberEnrollFrm">
    <springform:input path="userId" type="text" class="form-control" placeholder="아이디 (4글자이상)" name="userId" id="userId_" />
    <springform:errors path="userId" cssClass="error"/> 
    <springform:input path="password" type="password" class="form-control" placeholder="비밀번호" name="password"	id="password_" />
    <springform:errors path="password" cssClass="error"/> 
    <input type="password" class="form-control" placeholder="비밀번호확인" id="password2" />
    <springform:input path="name" type="text" class="form-control" placeholder="이름" name="name" id="userName" />
    <springform:errors path="name" cssClass="error"/> 
    <springform:input path="age" type="number" class="form-control" placeholder="나이" name="age" id="age"/>
    <springform:errors path="age" cssClass="error"/>  
    <springform:input path="email" type="text" class="form-control" placeholder="이메일" name="email" id="email" />
    <springform:errors path="email" cssClass="error"/>  
    <springform:input path="phone" type="tel" class="form-control"	placeholder="전화번호 (예:01012345678)" name="phone" id="phone" maxlength="11"  />
    <springform:errors path="phone" cssClass="error"/>  
    <springform:input path="address" type="text" class="form-control" placeholder="주소" name="address" id="address" />
    <springform:errors path="address" cssClass="error"/> 
    <springform:select path="gender" class="form-control" name="gender" >
        <springform:option value="" >성별</springform:option>
        <springform:option value="M">남</springform:option>
        <springform:option value="F">여</springform:option>
    </springform:select>
    <springform:errors path="gender" cssClass="error"/> 
    <div class="form-check-inline form-check">
        취미 : &nbsp; <springform:checkbox path="hobby" class="form-check-input"
            name="hobby" id="hobby0" value="운동"/><label for="hobby0"
            class="form-check-label">운동</label>&nbsp; 
            <springform:checkbox path="hobby" class="form-check-input" name="hobby" id="hobby1" value="등산"/>
            <label for="hobby1" class="form-check-label">등산</label>&nbsp; 
            <springform:checkbox path="hobby" class="form-check-input" name="hobby" id="hobby2" value="독서"/>
            <label for="hobby2" class="form-check-label">독서</label>&nbsp;
        <springform:checkbox path="hobby" class="form-check-input" name="hobby"	id="hobby3" value="게임"/>
        <label for="hobby3" class="form-check-label">게임</label>&nbsp; 
        <springform:checkbox path="hobby" class="form-check-input" name="hobby" id="hobby4" value="여행"/>
        <label for="hobby4" class="form-check-label">여행</label>&nbsp;
    </div>
    <br /> <input type="submit" class="btn btn-outline-success"
        value="가입">&nbsp; <input type="reset"
        class="btn btn-outline-success" value="취소">
</springform:form>

 

 

 

 MemberController에서 @Validated 어노테이션으로 JSP에서 설정한 Validator 유효성 검사를 실행 할 변수에 선언해주고 BindingResult로 선언한 변수로 Validator 결과에 대해 분기 처리 할 수 있다.

@RequestMapping("/enrollMemberEnd.do")
public String enrollMemberEnd(@Validated Member m, @RequestParam("userName")String name, BindingResult isResult, Model model) {
m.setName(name);

if(isResult.hasErrors()) {
    //validaotr 처리시 error 발생하면 비지니스로직 실행하지 않고
    // 본 다시 입력되는 페이지로 전환시킨다.
return "member/enrollMember";
}

 

 

 

Hibernate-Validator DTO에 적용하기

package com.bs.spring.member.model.dto;

import java.sql.Date;
import java.util.List;

import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Member {
    
    @NotEmpty(message="아이디는 반드시 입력하세요.")
    @Size(min=4, message="아이디는 4글자 이상 입력하세요.")
    private String userId;
    
    @NotEmpty(message="패스워드는 반드시 입력하세요.")
    /* @Size(min=8,message="패스워드는 8글자 이상입력하세요.") */
    @Pattern(regexp="(?=.*?[a-z](?=.*?[A-Z])(?=.*?[~!@#$%^&*()_+-=])[a-zA-Z~!@#$%^&*()_+-=]{8,}", message="비밀번호는 소문자,대문자,특수기호를 포함한 8글자 이상으로 작성하세요.")
    private String password;
    private String name;
    private String gender;
    
    @Min(value=14, message="나이는 14세 이상 입력하세요.")
    @Max(value=120, message="입력 가능한 최대나이는 120세 입니다.")
    private int age;
    
    @Email
    private String email;
    private String phone;
    private String address;
    private List<String> hobby;
    private Date enrollDate;
}

➡️ Hibernate-validator Document를 참고하여 Validator Annotation에 대해 공부하여 사용해볼 수 있다.