bong-u/til

MVC 2 : Messages, Validate command object

수정일 : 2024-11-15

Messages

  • label.properties
member.register=회원가입
1<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
2<head>
3  <title><spring:message code="member.register" /></title>
4</head>
  • 사이트가 여러 언어를 지원해야할 때 label_ko.properties, label_en.properties와 같이 만든다고 한다
  • http헤더의 Accept-Launguage를 자동으로 인식한다고 하니까 편할 것 같다

Validate command object

Validation

  • RegisterRequestValidator
 1@Override
 2public void validate(Object target, Errors errors) {
 3    RegisterRequest regReq = (RegisterRequest) target;
 4
 5    if(regReq.getEmail() == null | regReq.getEmail().trim().isEmpty()) {
 6        errors.rejectValue("email", "bad");
 7    }
 8    else {
 9        Matcher matcher = pattern.matcher(regReq.getEmail());
10        if(!matcher.matches()) {
11            errors.rejectValue("email", "bad");
12        }
13    }
14
15    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required");
16    ValidationUtils.rejectIfEmpty(errors, "password", "required");
17    ValidationUtils.rejectIfEmpty(errors, "confirmPassword", "required");
18    if (!regReq.getPassword().isEmpty()) {
19        if (!regReq.isPasswordEqualToConfirmPassword()) {
20            errors.rejectValue("confirmPassword", "nomatch");
21        }
22    }
23}
1<form:errors path="email" />
  • 만약 errors.rejectValue(“email”, “requireed”) 코드로 에러코드를 추가했고 커맨드 객체가 registerRequest인 경우,
    1. required.registerRequest.eail
    2. required.email
    3. required.String
    4. required
  • 위와 같은 순서대로 메시지 코드를 검색한다.

Global scoped validate

  • MvcConfig.java
1@Override
2public Validator getValidator() {
3    return new RegisterRequestValidator();
4}
  • RegisterController.java
1@PostMapping("/register/step3")
2public String handleStep3(@Valid RegisterRequest regReq, Errors errors) {
3    if (errors.hasErrors())
4        return "register/step2";
  • global 범위 validator를 사용할 수 있다.

Controller scoped validate

  • RegisterController.java
1@InitBinder
2protected void initBinder(WebDataBinder binder) {
3    binder.setValidator(new RegisterRequestValidator());
4}
  • 우선순위
    • setValidator() : controller scoped validator 적용
    • addValidator() : global scoped validator 적용 후 controller scoped validator 적용

Bean validation

  • RegisterRequest.java
 1import javax.validation.constraints.Size;
 2
 3import org.hibernate.validator.constraints.Email;
 4import org.hibernate.validator.constraints.NotBlank;
 5import org.hibernate.validator.constraints.NotEmpty;
 6
 7public class RegisterRequest {
 8	@NotBlank
 9	@Email
10	private String email;
11	@Size(min = 6)
12	private String password;
13	@NotEmpty
14	private String confirmPassword;
15	@NotEmpty
16	private String name;
  • bean validation을 사용하기 위해

  • org.hiberante dependency를 추가해야한다

  • 기존에 있던 Validator를 없애두어야한다

  • 대부분의 경우 이거 써서 validator 직접 짤 일은 없을 것 같다.