IT/SpringFramework
스프링 Validator를 이용한 서버내 유효성 검사
주현태
2019. 11. 29. 20:41
폼으로 부터 입력받은 데이터를 DB에 저장하기 전에 데이터가 맞는지 검사하는 작업을 유효성 검사라고하는데 유효성 검사의 방법은 대체로 아래와 같이 두가지 방법이 있다.
유효성 검사의 방법 두가지
-
서버에 전달하기 전에 자바스크립트에서 하는 유효성 검사
-
클라이언트로 부터 받은 데이터에 대해 서버에서 하는 유효성 검사
스프링에서의 유효성 검사
스프링에서는 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));
}
}
결과