์คํ๋ง์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๊ฒ์ฆ ์ด๋ ธํ ์ด์ (@NotNull, @Size ๋ฑ)๋ง์ผ๋ก๋
๋ณต์กํ ๋น์ฆ๋์ค ๊ฒ์ฆ ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๐ก ์์
- ์ฌ์ฉ์ ID๊ฐ ํน์ ํจํด์ ๋ฐ๋ผ์ผ ํ๋ค.
- DB์ ์กด์ฌํ์ง ์๋ ๊ฐ์ธ์ง ํ์ธํด์ผ ํ๋ค.
- ๋ ์ง ๋ฒ์ ๊ฒ์ฆ ๋ฑ.
์ด๋ด ๋ ์ปค์คํ Validator๋ฅผ ํตํด ์ง์ ๊ฒ์ฆ ๋ก์ง์ ์ ์ํ ์ ์์ต๋๋ค.
@Documented
@Constraint(validatedBy = UsernameValidator.class)
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidUsername {
String message() default "์ ํจํ์ง ์์ ์ฌ์ฉ์ ์ด๋ฆ์
๋๋ค.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class UsernameValidator implements ConstraintValidator<ValidUsername, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value != null && value.matches("^[a-zA-Z0-9]{5,12}$");
}
}
๊ฒ์ฆ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ท์น์ ์ ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค.
์์)
- ํ์๊ฐ์ (Create) ์ ๋น๋ฐ๋ฒํธ ํ์
- ํ์์ ๋ณด ์์ (Update) ์ ๋น๋ฐ๋ฒํธ๋ ์ ํ์
public interface CreateGroup {}
public interface UpdateGroup {}
public class PersonDto {
@NotNull(groups = CreateGroup.class)
private String name;
}
@PostMapping("/create")
public String create(@Validated(CreateGroup.class) PersonDto dto, BindingResult result) { ... }
๊ณตํต ๊ฒ์ฆ ๋ก์ง์ ๋ชจ๋ ์ปจํธ๋กค๋ฌ์ ์๋ ์ ์ฉํ ๋ ์ฌ์ฉํฉ๋๋ค.
(์: ๋ชจ๋ ์์ฒญ์ ๋ํด ํน์ ํ ํฐ ๊ฒ์ฆ ๋ฑ)
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public Validator getValidator() {
return new LocalValidatorFactoryBean();
}
}
๐ก ๊ธ๋ก๋ฒ Validator๋ ๋ฐ๋ณต๋๋ ๊ฒ์ฆ ๋ก์ง์ ์ค์ ์ง์คํํ ๋ ์ ์ฉํฉ๋๋ค!
ValidUsername=์์ด๋๋ ์๋ฌธ๊ณผ ์ซ์ ์กฐํฉ 5~12์๋ฆฌ์ฌ์ผ ํฉ๋๋ค.
์คํ๋ง ์ค์ ์์:
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasename("messages");
return source;
}
์ด๋ฒ ์ฌํ ํ์ต์ ํตํด ๋จ์ํ ์ ๋ ฅ๊ฐ ์ฒดํฌ๋ฅผ ๋์ด,
์๋น์ค ์ ๋ฐ์ ์ ์ฉํ ์ ์๋ ๊ฒ์ฆ ์ ๋ต์ ๊ณ ๋ฏผํ๊ฒ ๋์๋ค.
ํนํ ์ปค์คํ Validator์ ๊ทธ๋ฃน ๊ธฐ๋ฅ์ ์ค๋ฌด์์ ๋ณต์กํ ๊ฒ์ฆ ์๊ตฌ์ฌํญ์ ๊น๋ํ๊ฒ ํด๊ฒฐํด์ค ๊ฐ๋ ฅํ ๋๊ตฌ์๋ค.