느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라
article thumbnail

폼으로 부터 입력받은 데이터를 DB에 저장하기 전에 데이터가 맞는지 검사하는 작업을 유효성 검사라고하는데 유효성 검사의 방법은 대체로 아래와 같이 두가지 방법이 있다.

 

유효성 검사의 방법 두가지

  1. 서버에 전달하기 전에 자바스크립트에서 하는 유효성 검사

  2. 클라이언트로 부터 받은 데이터에 대해 서버에서 하는 유효성 검사

 

스프링에서의 유효성 검사

 스프링에서는 Validator 인터페이스를 구현함으로써 클라이언트로 부터 받은 데이터에 대한 서버의 유효성 검사를 지원하고 있다. 이번 실습에서는 Validator 인터페이스를 구현한 클래스를 만들고 컨트롤러에 DI시켜서 검증과정이 제대로 이뤄지는지 살펴볼 계획이다.

 

 

 

 

Validator 인터페이스

supports() - 객체 타입 검증

validate() - 자바빈의 속성값 검증

 

ex)

[User.java]

@Data
@AllArgsConstructor
public class User {
       public User() {      
       }
       private int id;
       private String name;
       private int age;
       private Role role;
       
       @Override
       public String toString() {
              return "User [id=" + id + ", name=" + name + ", age=" + age + ", role=" + role + "]";
       }
       
}

 

[UserValidator.java]

@Component
public class UserValidator implements Validator {
       @Override
       public boolean supports(Class<?> clazz) {
              return (User.class.isAssignableFrom(clazz));
       }
       @Override
       public void validate(Object target, Errors errors) {
              User user = (User) target;
              ValidationUtils.rejectIfEmpty(errors, "name", "field.required");
              ValidationUtils.rejectIfEmpty(errors, "age", "field.required");
              if (errors.getFieldError("age") == null)
                     if (user.getAge() < 0)
                           errors.rejectValue("name", "field.min", new Object[] { 0 }, "min default");
       }
}

target : 검증할 객체

errors : 검증할 객체가 올바르지 않을경우 에러메시지를 저장한다.

 

 

[ValidateController.java]

@Controller
@RequestMapping("validator")
public class ValidateController {
       @Autowired
       UserValidator validator;
       @InitBinder
       public void initBind(WebDataBinder binder) {
              binder.setValidator(validator);
       }
       @RequestMapping(value = "/test")
       public String validateAnnotation(@ModelAttribute User user, BindingResult result, ModelMap map) {
              validator.validate(user, result);
              if (result.hasFieldErrors()) {
                     map.put("mappingResult", false);
              }
              else {
                     map.put("mappingResult", true);
              }
              return "validate";
       }
}

 

 

 

 

 

테스트 클래스 [ValidateControllerTest.java]

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = { "classpath:config/*-context.xml",
              "classpath:web-context.xml" })
public class ValidateControllerTest {
       @Test
       public void test() throws ServletException, IOException {
              ConfigurableDispatcherServlet servlet = new ConfigurableDispatcherServlet();
              servlet.setLocations("classpath:config/*-context.xml",
                           "classpath:web-context.xml");
              servlet.init(new MockServletConfig("appServlet"));
              
              MockHttpServletResponse res = new MockHttpServletResponse();
              MockHttpServletRequest req = new MockHttpServletRequest("GET", "/validator/test");
              
              servlet.service(req, res);
              ModelAndView mav = servlet.getModelAndView();
              boolean mappingResult=(boolean) mav.getModel().get("mappingResult");
              assertThat(mappingResult, is(false));
              
              req.addParameter("name", "ju");
              servlet.service(req, res);
              mav = servlet.getModelAndView();
              mappingResult=(boolean) mav.getModel().get("mappingResult");
              assertThat(mappingResult, is(false));
              
              
              req.addParameter("age", "30");
              servlet.service(req, res);
              mav = servlet.getModelAndView();
              mappingResult=(boolean) mav.getModel().get("mappingResult");
              assertThat(mappingResult, is(true));
       }
}

결과

profile

느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라

@주현태

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!