ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링4.0 - @Valid / @InitBinder 검증 & 글로벌 Validator
    웹프로그래밍/spring 2018. 7. 17. 23:03

     @Valid / @InitBinder 검증



    JSR 303 표준에 정의된 @Valid으로 커맨드 객체를 검사하는 코드를 직접 호출하지 않고 스프링 프레임워크가 호출하도록 설정한다.



    1. 의존 설정 추가


    -pom.xml

        <dependency>

    <groupId>javax.validation</groupId>

    <artifactId>validation-api</artifactId>

    <version>1.0.0.GA</version>

    </dependency>



    2.컨트롤러 클래스에서 @Valid / @InitBinder 사용


    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpSession;

    import javax.validation.Valid;


    import org.springframework.stereotype.Controller;

    import org.springframework.validation.Errors;

    import org.springframework.web.bind.WebDataBinder;

    import org.springframework.web.bind.annotation.InitBinder;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RequestMethod;


    @Controller

    @RequestMapping("/auth/login")

    public class LoginController {


    private static final String LOGIN_FORM = "auth/loginForm";

    private Authenticator authenticator;


    @RequestMapping(method = RequestMethod.GET)

    public String loginForm(LoginCommand loginCommand) {

    return LOGIN_FORM;

    }


    @RequestMapping(method = RequestMethod.POST)

    //@Valid으로 validate()메서드 호출을 대신한다.

    public String login(@Valid LoginCommand loginCommand, Errors errors,

    HttpServletRequest request) {

    //Errors: Stores and exposes information about data-binding and validation errors for a specific object. 

    if (errors.hasErrors()) {

    return LOGIN_FORM;

    }

    try {

    //Auth 자바빈

    Auth auth = authenticator.authenticate(loginCommand.getEmail(), loginCommand.getPassword());

    //세션 객체 생성

    HttpSession session = request.getSession();

    //authenticate()에서 리턴 받은 id와 name을 세션에 저장

    session.setAttribute("auth", auth);

    return "redirect:/index.jsp";

    } catch (AuthenticationException ex) {

    errors.reject("invalidIdOrPassword");

    return LOGIN_FORM;

    }

    }

    //validation 클래스를 initBinder()의 setValidator()로 지정한다.

    //입력 폼과 커맨드 객체의 맵핑을 처리하는 WebDataBinder를 초기화한다.

    @InitBinder

    protected void initBinder(WebDataBinder binder) {

    binder.setValidator(new LoginCommandValidator());

    }

    //sample.xml에서 DI 프로퍼티 수동 연결되어 있으므로 set메서드로 Authenticator 객체를 가져온다.

    public void setAuthenticator(Authenticator authenticator) {

    this.authenticator = authenticator;

    }


    }



    3. 뷰 단에서 에러 메시지 출력


    <form:form commandName="loginCommand">

    <form:errors element="div" />

    <label for="email">이메일</label>: 

    <input type="text" name="email" id="email" value="${loginCommand.email}">

    <form:errors path="email"/> <br>



    글로벌 Validator




    한 개의 Validator로 모든 커맨드 객체를 검증한다.



    1. xml설정 추가


    <annotation-driven validator="validator"/>

    <bean id="" class=""/>


    2. 컨트롤러 클래스에서 @Vailid 추가

    글로벌 Validator는 @Vailid가 붙은 커맨드 객체만 검증한다.


    public String login(@Valid LoginCommand loginCommand, Errors errors,

    HttpServletRequest request) {




    a. 글로벌 Validator 대신 다른 Validator를 사용하려면 


    @InitBinder

    protected void initBinder(WebDataBinder binder) {

    binder.setValidator(new LoginCommandValidator());

    }



    b. 글로벌 Validator에 다른 Validator를 추가하려면 addValidator()


    @InitBinder

    protected void initBinder(WebDataBinder binder) {

    binder.addValidator(new LoginCommandValidator());

    }