<๊ฐ์>
์์ฒญ์ ํ๋ผ๋ฏธํฐ๊ฐ ์ปจํธ๋กค๋ฌ ๋งค์๋์ ์ธ์๋ก ๋ฐ์ธ๋ฉ ๋ ๋, ํ๋ผ๋ฏธํฐ๋ ํ ๋ณํ๊ณผ ๋ฐ์ดํฐ ๊ฒ์ฆ ์ ์ฐจ๋ฅผ ๊ฑฐ์น๋ค.
ํ ๋ณํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ธ๋ฉ๋ ๋งค์๋์ ์ธ์์ ๊ฐ์ ํ์ผ๋ก ๋ณํํ๋ ์ ์ฐจ์ด๊ณ , ๋ฐ์ดํฐ ๊ฒ์ฆ์ ํ๋ผ๋ฏธํฐ๊ฐ ์ธ์์ ๊ฐ์ผ๋ก์ ๋ง์ด ๋๋์ง ํ์ธํ๋ ์ ์ฐจ์ด๋ค. ์ด ๋์ ๋ชจ๋ ์๋ฌ ์์ด ๊ฑฐ์น๋ฉด ๋ฐ์ธ๋ฉ ๋๊ณ , ๊ณผ์ ์์ ์๋ฌ๊ฐ ๋๋ฉด ๋ฐ์ธ๋ฉ์ ์คํจํ๊ณ ์๋ฌ ๋ด์ฉ์ BindingResult์ ๊ฐ์ฒด์ ์ ์ฅ๋๋ค.
์ ๋ฒ ์๊ฐ์๋ ํ ๋ณํ ๋งค์๋๋ฅผ ๋ง๋ค์ด Binder์ ๋ฑ๋กํด์ WebDataBinder๊ฐ ์๋ ํ ์ ์์๋ ํ ๋ณํ์ ํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ ํ๋ค. ์ด๋ฒ์ ๊ฐ์ ๊ณผ์ ์ ๋ฐ์ดํฐ ๊ฒ์ฆ ์ชฝ์์ ํ ๊ฒ์ด๋ค. ๋ฐ์ดํฐ ๊ฒ์ฆ์ ๊ฒฝ์ฐ์๋, WDB์ ๊ธฐ๋ณธ ๋ด์ฅ๋ ๊ธฐ๋ฅ ๋ง๊ณ ์ฌ์ฉ์๊ฐ ๋ง๋ค์ด ํ๊ณ ์ถ์ ๊ฒ์ฆ ์ ์ฐจ๊ฐ ๋ฐ๋ก ์์ ์ ์๋ค. (1) ์ด ๊ฒ์ฆ ์ ์ฐจ๋ฅผ ๋ง๋ค์ด Binder์ ๋ฑ๋กํ์ง ์๊ณ , ์ฌ์ฉ์๊ฐ ์๋์ผ๋ก ์ฌ์ฉํ ์๋ ์๊ณ , ์ด๊ฑธ Binder์ ๋ฑ๋ก ์์ผ์ ์๋์ผ๋ก ์ฌ์ฉ๋๋๋ก ๋ง๋ค ์๋ ์๋ค.
๋ํ (2)ServletContext.xml์ ๋ฑ๋กํ์ฌ ๋ฒ ์ปจํธ๋กค๋ฌ์ ๋ฐ์ดํฐ ๊ฒ์ฆ์ ํ๋๋ก ๋ง๋ค ์๋ ์๊ณ , ์ปจํธ๋กค๋ฌ ๋ด๋ถ์์๋ง ๊ฒ์ฆ์ ์ํฅ๋ ฅ์ด ๋ฏธ์น๋๋ก ํ ์๋ ์๋ค.
(3)๋ง์ง๋ง์ผ๋ก ๋ฐ์ดํฐ ๊ฒ์ฆ ์ ๋ ์ค๋ฅ๋ฅผ ๋ฉ์ธ์ง๋ก ํ๋ฉด์ ๋์ฐ๋ ๊ฒ๋ ๋ ์ด์ Javascript๋ฅผ ์ฐ์ง ์๊ณ Spring ๋ด ์ค์ ๋ณ๊ฒฝ (Servletcontext์ ์ ์์ฑ ์ถ๊ฐ) ๋ฐ JSP์ ์ ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Form ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์จ์ ๋ํ๋ผ ์ ์๋ค.
์ด 3๊ฐ์ง ์ ์ฐจ์ ๋ํด ๋ฐฐ์๋ณด๊ฒ ๋ค.
1. Validator(๋ฐ์ดํฐ ๊ฒ์ฆ๊ธฐ) ์์ฑ ๋ฐ ์๋ ๊ฒ์ฆ, ์๋ ๊ฒ์ฆ
(1)Validator๋?
//Validator ์ธํฐํ์ด์ค
public interface Validator{
// ๊ฒ์ฆํ๋ ค๋ ๊ฐ์ฒด๊ฐ ์ด ๊ฒ์ฆ๊ธฐ๋ก ๊ฒ์ฆ ๊ฐ๋ฅํ ๊ฐ์ฒด์ธ์ง ์๋ ค์ฃผ๋ ๋งค์๋
// Class ํด๋์ค์ ๊ฐ์ฒด๋ก์ ํด๋น ๊ฐ์ฒด์ ํด๋์ค ์ ๋ณด(๋ฉํ ๋ฐ์ดํฐ)๋ฅผ ํ์ธํ๋ค.
boolean supports(class<?> clazz);
//๊ฐ์ฒด๋ฅผ ๊ฒ์ฆํ๋ ๋งค์๋, target์ด ๊ฒ์ฆํ ๊ฐ์ฒด, errors๊ฐ ๊ฒ์ฆ ์ ๋ฐ์ํ ์๋ฌ ์ ์ฅ์
void validate(Object target, Errors errors)
}
์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๋ง์ ๋ฐ์ดํฐ ๊ฒ์ฆ ๊ธฐ๋ฅผ ๋ง๋ค ๋, ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๋ผ๋๋ก ๊ตฌํํ์ฌ ๋ง๋ ๋ค.
์ฌ๊ธฐ์ ๊ฐ์ฒด ๊ฒ์ฆํ๋ Validate ์ถ์ํ ๋งค์๋๊ฐ errors๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. Errors๋ Spring์์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค๋ก์ ์๋ฌ๊ฐ ์ ์ฅ๋๋ ์ฅ์๋ก์์ ์ญํ ์ ํ๋ค. BindingResult ๋ํ Errors์ ์์ ์ธํฐํ์ด์ค์ด๋ค.
// errorCode๋ error์ ๋ด์ฉ์ด๋ค.
public interface Errors{
// Errors ๊ฐ์ฒด์์ ์ธ์๋ก ๋ค์ด์จ errorCode๋ฅผ ์ ์ฅ
void reject(String errorCode);
// Errors ๊ฐ์ฒด์์ error๊ฐ ์ผ์ด๋ ํ๋์ errorCode๋ฅผ ์ ์ฅ
void rejectValue(String field, String errorCode);
// ์์ ๋งค์๋ ์ค๋ฒ๋ก๋ฉ ๋ฒ์ ผ, errsArgs๋ errorcode๋ด์์ %s %n์ฒ๋ผ ์ง์ ๊ฐ ๋ฃ๊ณ ์ถ์ ๋ ์ฐ์.
// defaultMessage๋ ์๋ฌ ์ฝ๋์ ๋ง๋ ๋ฉ์ธ์ง๋ฅผ ๋ชป ์ฐพ์์ ๋ ๋์ ์ฐ์.
void rejectValue(String field, String errorCode, Object[] errorsArgs, String defaultMessage);
}
์ฒซ๋ฒ์งธ reject๋ ์ด๋์ ์๋ฌ๊ฐ ๋ฐ์ํ๋์ง ์ ์ ์๋ค. ๊ณผ์ ์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ฃผ๋ฉด ์คํ๋ ค ํดํน์ ์์ธ์ด ๋ ์ ์์ด์ id ๋๋ pwd ๊ฐ ํ๋ ธ๋ค๋ ๊ฒ์ฒ๋ผ ๋ชจํธํ๊ฒ ์ค ๋ ์ฌ์ฉํ๋ค.
์ด์ ์์ Validator ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ๋๋ง์ ๊ฒ์ฆ๊ธฐ๋ฅผ ๋ง๋ค์ด๋ณด์. ์ด๊ฑด ํ์๊ฐ์ ๋, ํด๋ผ์ด์ธํธ์ ์ ๋ ฅ ๊ฐ๋ค์ ์ ๋ถ๋ค ์ฐ๊ฒฐ ๋ฐ๋ User ๊ฐ์ฒด์ ๋ณ์๋ค์ ๊ฒ์ฆํ๋ ๊ฒ์ฆ๊ธฐ ์ด๋ค.
//1. Validator ๊ตฌํ
public class UserValidator implements Validator {
@Override
// Class ํด๋์ค๋ก ์ด๋ค ๊ฐ์ฒด์ ํด๋์ค ์ ๋ณด(๋ฉํ ๋ฐ์ดํฐ)๊ฐ ์ ์ฅ๋์ด ์๋ค.
// 1-1 ํด๋น ๊ฒ์ฆ๊ธฐ๋ก ๊ฒ์ฆํ ์ ์๋ ๊ฐ์ฒด์ธ์ง ํ์ธ
public boolean supports(Class<?> clazz) {
// (๋ ๋ค๊ฐ์ ๋ง) clazz๊ฐ User ๋๋ ๊ทธ ์์์ ํด๋์ค ์ ๋ณด์ธ์ง ํ์ธ
// return User.class.equals(clazz);
return User.class.isAssignableFrom(clazz);
}
//1-2 ์ง์ง ์ ํจ์ฑ ํ์ธ.
@Override
// Object๋ ๋ชจ๋ ํด๋์ค์ ์กฐ์์ด๋ผ, ๋คํ์ฑ์ ์๋ฆฌ์ ๋ฐ๋ผ Object ๊ฐ์ฒด๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ด์ ์ฌ์ฉ
public void validate(Object target, Errors errors) {
//1-2-1 ์๋ฃํ์ Object๋ก ๋ฐ์์ค๊ธฐ ๋๋ฌธ์ ํ ๋ณํ ํ์.
User user = (User)target;
String id = user.getId();
//trim์ ์ ๋ค ๋ถํธํ ๊ณต๋ฐฑ ์ ๊ฑฐ ํด์ฃผ๋ ํจ์
//if(id==null || "".equals(id.trim())) {
// errors.rejectValue("id", "required");
// }
// 1-2-2 ๋ง์ฝ id ํน์ pwd ์์ด ๋น์ด ์๊ฑฐ๋ ""๊ฐ์ ๊ณต๋ฐฑ์ผ๋ก ์ฑ์์ ธ ์์ผ๋ฉด
// ๊ฐ์ฒด errors์์ errorCode๋ก "required"๋ฅผ ์ ์ฅํด๋ผ
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "id", "required");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "pwd", "required");
// 1-2-3 id์ ๊ธธ์ด ๊ฒ์ฌ 5์ด์ 12์ดํ๊ฐ ์๋๋ผ๋ฉด invalidLength ์๋ฌ ์ฝ๋ errors์ ์ ์ฅํ๋ผ.
if(id==null || id.length() < 5 || id.length() > 12) {
errors.rejectValue("id", "invalidLength");
}
}
}
(2) ์๋ ๊ฒ์ฆ
์๋ ๊ฒ์ฆ์ ๋ณ ๊ฑฐ ์๋ค. ์์ Validator๋ฅผ ๊ตฌํํ UserValidator ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์, ํด๋น ๊ฐ์ฒด์ ์ ํจ์ฑ ๊ฒ์ฌ ๋งค์๋(validate)์ ๊ฐ์ ๋ฃ๊ณ ์ฌ์ฉํ๋ ๊ฒ ๋ฟ์ด๋ค.
์ด๋ Validate๋ ์ฒซ๋ฒ์งธ ์ธ์์ธ target์ ๊ฒ์ฌํด์ ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ฅผ errors์ ์ ์ฅํ๋ค.
์ฐ๋ฆฐ ์ด error๊ฐ ์๋ฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋ค์ ํ์๊ฐ์ ํผ์ผ๋ก ๋์๊ฐ๋๋ก ํ๋ฉด ๋๋ค.
์ฌ๊ธฐ์ BindingResult๊ฐ Errors์ ์์ ์ธํฐํ์ด์ค ์ด๋ฏ๋ก ์ฐ๋ฆฌ๋ BindingResult์ ๊ฐ์ฒด result๋ฅผ errors์๋ฆฌ์ ๋์ ๋ฃ์ ์ ์๋ค.
public String save(@Valid User user,BindingResult result ,Model m) throws Exception {
//์๋ ๊ฒ์ฆ - validator ๊ฐ์ฒด ์ง์ ์์ฑ, validate ํจ์ ์ง์ ํธ์ถ
UserValidator userValidator = new UserValidator();
userValidator.validate(user, result);
// ํธ์ถ ๊ฒฐ๊ณผ result์ error ์ ์ฅ๋ ์ ๋ค์ registerForm์ผ๋ก ๋์๊ฐ๋ผ.
if(result.hasErrors()) {
return "registerForm";
}
(3) ์๋ ๊ฒ์ฆ
์ ์ฐจ : Binder์ ๋ฑ๋ก / @Valid ์ด๋ ธํ ์ด์ ์ฌ์ฉ
a. Binder ์ถ๊ฐ ๋งค์๋์ ์๊น ๋ง๋ UserValidator์ ๊ฐ์ฒด๋ฅผ Local Validator๋ก์ ๋ฑ๋กํ๋ค.
Binder ์ถ๊ฐ ๋งค์๋๋ ์ปจํธ๋กค๋ฌ ๋ด๋ถ ๋งค์๋ ์ค @InitBinder ์ด๋ ธํ ์ด์ ์ด ๋ถ์ด ์๋ ๋งค์๋๋ฅผ ์๋ฏธํ๋ค.
ํด๋น ๋งค์๋ ๋ด๋ถ์์ ํ ๋ณํ ํด๋์ค์ ๊ฐ์ฒด๋ ๋ฐ์ดํฐ ๊ฒ์ฆ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ช ๋ น์ด๋ก binder์ ์ง์ด๋ฃ์ผ๋ฉด,
Web Data Binder์ ํด๋น ๊ธฐ๋ฅ๋ค์ด ์๋ก ๋ฑ๋ก๋๋ค.
// ์ ๋ฒ์ ํ๋ผ๋ฏธํฐ๋ฅผ Date ๊ฐ์ฒด๋ก ํ ๋ณํ ํ๊ธฐ ์ํด ๋ง๋ค์๋ Binder ์ถ๊ฐ ๋งค์๋๋ฅผ ์ฌ์ฉ
@InitBinder
// WDB๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค.
public void toDate(WebDataBinder binder){
//...
// UserValidator์ ๊ฐ์ฒด๋ฅผ ์๋ก์ด Local Validator๋ก Binder์ ๋ฑ๋ก
binder.setValidator(new UserValidator());
}
์ด์ UserValidator๊ฐ ์๋ก์ด Local Validator๋ก์ Binder์ ์ถ๊ฐ๊ฐ ๋๋ค. Local Validator์ธ ์ด์ ๋ ์ปจํธ๋กค๋ฌ ๋ด๋ถ์ ์ ์ธ๋์ด์ ํด๋น ๋ฐ์ดํฐ ๊ฒ์ฆ์ ์ํฅ๋ ฅ์ด ์ปจํธ๋กค๋ฌ ๋ด๋ถ์๋ง ๋ฏธ์น๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฒ ์ปจํธ๋กค๋ฌ ์ ์ผ๋ก ๋ฏธ์น๋ ๋ฐฉ๋ฒ์ ๋ค์ ์ฑํฐ์์ ๋ฐฐ์๋ณด์.
b.์ด์ ๋ฑ๋ก์ด ๋์์ผ๋, ์ฐ๋ฆฌ๊ฐ ๋ฐ์ดํฐ ๊ฒ์ฆํ๊ณ ์ถ์ ๋งค์๋์ ์ธ์ ์์ @Valid ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
@PostMapping("/add")
public String save(@Valid User user,BindingResult result ,Model m) throws Exception {
System.out.println("result="+result);
System.out.println("user="+user);
์ด๋ฌ๋ฉด save์ ์ธ์ user์ ๋ํด์ ์๋์ผ๋ก ๊ฒ์ฆ์ด ์ด๋ฃจ์ด์ง๋ค.
**์ฐธ๊ณ @Valid ๋ ์๋ฐ๋ ์คํ๋ง์ ๊ธฐ๋ณธ ์ด๋ ธํ ์ด์ ์ผ๋ก๋ ์๋ ๊ธฐ๋ฅ์ด๋ค. ์ด๊ฑด Maven์ ์ถ๊ฐ๋ ์ด๋ ธํ ์ด์ ์ธ๋ฐ
์ด๊ฑธ ์ด์ฉํ๋ ค๋ฉด MavenDependency์ ์ถ๊ฐ ํด์ค์ผ ํ๋ค.
2. GlobalValidator๋ง๋ค๊ธฐ
์ด๋ฒ์ ๋ฒ ์ปจํธ๋กค๋ฌ์ ์ผ๋ก ์ ๋ถ ์ ์ฉ๋๋ GlobalValidator๋ฅผ ๋ง๋ค์ด๋ณด์.
์ ์ฐจ๋ ๋ค์๊ณผ ๊ฐ๋ค.
(1) GlobalValidtor๋ก ์ธ Validator Class๋ฅผ ํ๋ ๋ง๋ค๊ธฐ
package com.fastcampus.ch2;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
public class GlobalValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
// return User.class.equals(clazz); // ๊ฒ์ฆํ๋ ค๋ ๊ฐ์ฒด๊ฐ Userํ์
์ธ์ง ํ์ธ
return User.class.isAssignableFrom(clazz); // clazz๊ฐ User ๋๋ ๊ทธ ์์์ธ์ง ํ์ธ
}
@Override
public void validate(Object target, Errors errors) {
System.out.println("GlobalValidator.validate() is called");
User user = (User)target;
String id = user.getId();
// if(id==null || "".equals(id.trim())) {
// errors.rejectValue("id", "required");
// }
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "id", "required");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "pwd", "required");
if(id==null || id.length() < 5 || id.length() > 12) {
errors.rejectValue("id", "invalidLength",new String[] {"0","5","12"}, null);
}
}
}
๋ด์ฉ์ ์์ UserValidator์ ๊ฐ๋ค. ์ด๊ฑธ Servlet-context์ Global Validator๋ผ๊ณ ๋ฑ๋ก ํด์ผํ๊ธฐ ๋๋ฌธ์ Local ๊ฐ ์ฐจ์ด๋ฅผ ๋๋ ค๊ณ ํ๋ ์๋ก ๋ง๋ค์๋ค.
(2) ํด๋น Global Validator๋ฅผ Servlet-context์ Bean์ผ๋ก ๋ฑ๋ก ๋ฐ annotaiton-driven ํ๊ทธ์๋ ๊ฒ์ฆ๊ธฐ๋ก์ ๋ฑ๋ก
Spring์ ๋ชจ๋ ์น ์ค์ ์ ๋ด๋นํ๋ Servlet-context์์ ํด๋น Class๊ฐ ์ ์ญ์ ์ํฅ์ ๋ผ์น๋ ๋์ด๋ผ๊ณ ๋ฑ๋ก ์ํค๋ ๊ฒ
<annotation-driven validator ="globalValidator" />
<beans:bean id = "globalValidator" class ="com.fastcampus.ch2.GlobalValidator"/>
<!--class๋ ์์ฑํ Validator ํด๋์ค๊ฐ ์ด๋ ์๋๊ฐ ์์น๋ฅผ ๋ํ๋ธ๋ค.
id๋ ํด๋น ํด๋์ค๋ฅผ ๋ถ๋ฅด๋ ์ด๋ฆ์ด๋ค.
์ด id๋ฅผ ์ฌ์ฉํด annotation-driven ํ๊ทธ์ validator๋ก์ ๋ฑ๋กํ ๊ฒ์ด๋ค.-->
(3) ๊ทธ ํ๋ ์๋ ๊ฒ์ฆ ์ฒ๋ผ ๊ฒ์ฆํ๊ณ ์ถ์ ๊ฐ์ฒด ์์ @Valid๋ฅผ ๋ถ์ด๋ฉด WDB๊ฐ ์ด Validator ์จ์ ์๋์ผ๋ก ๊ฒ์ฆํด์ค๋ค.
(์ฐธ๊ณ ) Global Validator๊ฐ ์๋ ์ํฉ์์ ํน์ ์ปจํธ๋กค๋ฌ ๋ด๋ถ์ Local Validator ๋ง๋ค์ด์ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ
์ด๋๋ Local Validator๋ฅผ Binder์ ์ถ๊ฐํ๋ ๊ณผ์ ๊ณผ ๋๊ฐ์ด Binder ์ถ๊ฐ ๋งค์๋์ Validator ํด๋์ค๋ฅผ ๋ฑ๋กํ๋ฉด ๋๋๋ฐ ๋ช ๋ น์ด๊ฐ ์ข ๋ค๋ฅด๋ค. ์ด๋ฒ์ binder.setValidator ๊ฐ ์๋๋ผ binder.addValidators์ด๋ค. ์ด๋ฏธ ์๋ Global Validator์ ๋ด์ฉ์ ์ถ๊ฐํ๋ ๊ฐ๋ ์ด๋ค.
@InitBinder
public void toDate(WebDataBinder binder) {
/...
//Global Validator ์์ ์ ์ Local Validator ๋ฑ๋ก
binder.setValidator(new UserValidator());
//Global Validator ์์ ์ ์ Local Validator ๋ฑ๋ก
binder.addValidators(new UserValidator());
}
3. JavaScript ์ฐ์ง ์๊ณ , ๋ฐ์ดํฐ ๊ฒ์ฆ ์ ํ์ธํ ์ค๋ฅ๋ฅผ view์ ๋์ฐ๋ ๋ฒ
(1) ์ฝ๋ ๋ฏ์ด๋ณด๊ธฐ
๋จผ์ ๋ค์ํ ๋ฆฌ์์ค์์ ํ์ด์ง๋ฅผ ์ฝ๊ธฐ ์ํ MessageSource๋ผ๋ ๊ฒ์ด ์๋ค.
์ฐ๋ฆฌ๋ Error์ ์ ์ฅ๋ ์๋ฌ ์ ๋ณด๋ฅผ ์๋ง์ ๋ฉ์ธ์ง๋ก ๋ณํํ์ฌ view์ ๋์ฐ๊ธฐ ์ํด ํด๋น ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ธ ResourceBundleMessageSource๋ผ๋ ํด๋์ค๋ฅผ ์ด๋ค.
ํด๋น ํด๋์ค๋ Servlet-Context์ Bean์ ๋ฑ๋กํด์ผ์ง ์ธ ์ ์๋ค.
Bean์ ๋ฑ๋กํ ๋ error_message๋ฅผ value๋ก ์ ์ฅํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด value์ ์ ์ฅ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ฐ์ ์๋ฌ ์ฝ๋์ ๊ทธ์ ์๋ง์ ๋ฉ์ธ์ง๊ฐ map ํ์์ผ๋ก ์ ์ฅ๋ ํ์ผ์ ์ด๋ฆ์ด๋ค.
RBMS๋ ๋ฐ์ ์๋ฌ ์ฝ๋๋ฅผ ํด๋น error_message.properties๋ฅผ ์ด์ฉํด ์๋ง๋ ๋ฉ์ธ์ง๋ก ๋ณํํ๋ค.
a.ResouceBundleMessageSource์์ getMessage๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋๊ฐ?
RBMS์์ ๊ตฌ์ฒดํ๋ getMessage๋ ์ธ์ ๋ณ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋ค์ ๋ฐํํ๋ค.
ใฑ. String code๋ errors์ ์ ์ฅ๋ errorCode๊ฐ ๋ค์ด๊ฐ๋ ๊ณณ์ด๋ค.
RBMS๋ ์ด์ ๋ง๋ ๋ฉ์ธ์ง๋ฅผ ๋ฐํํ๋ค.
ใด. Object[]args๋ ๋ฉ์ธ์ง์ ์ฐ์ผ ์ฌ์ฉ์ ์ง์ ๊ฐ๋ค์ด ๋ค์ด๊ฐ๋ ๊ณณ์ด๋ค.
errors.rejectValue("id", "invalidLength",new String[] {"0","5","12"}, null);
์์ ๊ฐ์ ํ์์ผ๋ก error์ ์ ์ฅ๋๋ฉด getMessage๊ฐ ์ฐจ๋ก๋๋ก ๊ฐ๋ค์ ๊ฐ์ ธ์ค๋๋ฐ,
error_message.properties ์์ invalidLength ์๋ฌ์ฝ๋๋ ํด๋น ๋ฉ์ธ์ง์ ๋์๋จ์ ์ ์ ์๋ค.
์ด๋ {1} {2}๋ ํ๋ฆฐํธ๋ฌธ์์ ์ฐ์ด๋ %n %s ์ฒ๋ผ ์ฌ์ฉ์๊ฐ ์ง์ ํ ๊ฐ์ด ๋ค์ด๊ฐ๋ ์์น์ด๋ค.
{1} {2}๋ ๋ฐฐ์ด์ 1๋ฒ๊ณผ 2๋ฒ ์์๋ฅผ ์ฐ๊ฒ ๋ค๋ ์๋ฆฌ์ด๋ค. (๋ฐฐ์ด์ 0๋ถํฐ ์์ํด์ ์ผ๋ถ๋ฌ 0๋ฒ๋ ์ฑ์ ๋ค.)
ใท. defaultMessage๋ ์๋ฌ ์ฝ๋์ ๋์ํ๋ ๋ฉ์ธ์ง๋ฅผ ์ฐพ์ ์ ์์ ๋ ๋์ view ๋์ค๋ message์ด๋ค.
ใน. Locale์ ํด๋น ์์ฒญ์ ํ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ๊ตญ๊ฐ ์์น๋ฅผ ๊ฐ์ ธ์จ๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ด์ฉํด ๋ฏธ๋ฆฌ error_message๋ฅผ ๊ตญ๊ฐ๋ณ๋ก ๋ง๋ค์ด ๋์ ๋ค Locale์ ๊ฐ์ ๋ณด๊ณ ๊ตญ๊ฐ๋ณ ์ธ์ด๋ก ๋ error_message๋ฅผ ๋ง๋ค ์ ์๋ค.
(2)์ผ์ด ํํด์ง๋ ์๋ฆฌ
error ๊ฐ์ฒด์ rejectValue๋ก์ ์ ์ฅ๋ ๊ฐ๋ค์ RBMS์์ ๋ชจ๋ ๋ฐ์์ ์ ์ฅ.
์ด์ ๋ง๋ ์ฒ๋ฆฌ๋ฅผ error_message.properties๋ฅผ ์ฌ์ฉํ๋ฉฐ ํ๊ณ view์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋.
view๊ฐ ๊ฒฐ๊ณผ ๋ด์ฉ์ ์ฒ๋ฆฌ
์ด๋ ์ฒ๋ฆฌ๋ฅผ ์ํด ์๋ก์ด ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ form ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์.
(3) error_message.properties์์ ์๋ฌ์ฝ๋์ ๋ง๋ ๋ฉ์ธ์ง๋ฅผ ์ฐพ๋ ์ฐ์ ์์
๋ง์ฝ ์๋ฌ์ฝ๋"requried"๊ฐ "id"๋ผ๋ ์๋ฌ ํ๋์ ํจ๊ป ์จ๋ค๋ฉด
RBMS๋ ์ผ๋จ ํด๋น ์ ๋ณด์ ๊ด๋ จํด์ "์ ์ผ ๊ตฌ์ฒด์ "์ธ ์๋ฌ์ฝ๋์ ์๋ฌ๋ฉ์ธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ๋ค.
์ฌ๊ธฐ์ id๋ user ๊ฐ์ฒด์ id ์ด๋ฏ๋ก ๋จผ์ required.user.id๋ผ๋ ์๋ฌ์ฝ๋์ ๋์ํ๋ ๋ฉ์ธ์ง๋ฅผ ์ฐพ๋๋ค.
์ด๊ฒ ์๋ค๋ฉด, ํ๋ ๊ฐ์ด ๊ฐ์ ์๋ฌ์ฝ๋๊ฐ ์๋์ง ์ฐพ๊ณ ๊ทธ ๋ ์์ ๋ฉ์ธ์ง๋ฅผ ๋ด๋ณด๋ธ๋ค. requried.id
์ด๊ฑฐ๋ ์๋ค๋ฉด, ์๋ฌ์ฝ๋์ ํ์ ์ด ๊ฐ์ด ์ ํ ์๋ฌ์ฝ๋๊ฐ ์๋์ง ์ฐพ๋๋ค. requried.java.lang.string
์ด๊ฒ๋ ์์ผ๋ฉด ๊ทธ๋ฅ ์๋ฌ์ฝ๋ ์์ฒด๋ฅผ ์ฐพ๊ณ ๋งคํ๋ ๋ฉ์ธ์ง๋ฅผ ์ฐพ๋๋ค. requried
์ด๊ฒ๋ ์์ผ๋ฉด defaultmessage๋ฅผ ๋ด๋ณด๋ธ๋ค.
์๋ฌ์ฝ๋ | ํด๋น ์๋ฌ์ฝ๋๊ฐ ์์ ๋ error_message์์ ์ฐพ๋๊ฒ |
"required" | requried.user.id |
requried.id | |
required.java.lang.string | |
requried | |
defaultMessage |
(4)View์ ๋์ฐ๋ ค๋ฉด?
์คํ๋ง์์ ์ ๊ณตํ๋ form ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
<!--form ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ jsp์ import ๋งจ ์ด๋ฐ๋ถ์ ์ ์ด์ฃผ๋ฉด ๋จ.-->
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
์๋ฅผ ์ ์ด์ฃผ๋ฉด ์ด์ ํด๋น jsp์์ form ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ธ ์ ์๋ค.
์ฐ๋ฆฌ๋ ์ด์ ์ผ๋ฐ์ ์ผ๋ก ์ ๊ณต๋๋ <form> ํ๊ทธ๊ฐ ์๋ form ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ form <form:form>์ ์ธ ๊ฒ์ด๋ค.
ํด๋น ๋ด์ฉ์ ํ ๋๋ก form ํ๊ทธ๋ฅผ ์์ ํด๋ณด์.
<!-- modleAttribute="๊ฒ์ฆํ ๊ฐ์ฒด"๋ฅผ ์จ์ค๋ค.
form:error๋ ์๋ฌ ๋ฉ์ธ์ง๋ฅผ ๋์ฐ๋ ๋ถ๋ถ์ผ๋ก path="ํ๋์ด๋ฆ"์ ์ ์ด์ฃผ๋ฉด
ํด๋น ํ๋์์ ์ผ์ด๋ ์๋ฌ๋ฅผ ๋ฉ์ธ์ง๋ก ๋ณํํด ํ๋ฉด์ ๋์ด๋ค.-->
<!-- ๋ฐ๊พธ๊ธฐ ์ !
<form action="<c:url value="/register/save"/>" method = "POST" onsubmit="return formCheck(this)">
๋ฐ๊พผ ํ!-->
<form:form modelAttribute="user">
<div class="title">ํ์๋ฑ๋ก</div>
<div id="msg" class="msg"><form:errors path="id"/></div>
<!-- ๋ด์ฉ ์๋ต -->
</form:form>
ํด๋น form ํ๊ทธ๋ค์ html๋ก ๋ณํ๋ ๋ ๋ฐ๊ณผ ๊ฐ์ด ๋ณํ๋๋ค.
<form:form modelAttribute="user">
<!----------------๋ณํ--------------------->
<form id="user" action="/ch2/register/add" method="post">
<!--ํ์ฌ์ ๊ฐ์ ๊ฒฝ๋ก์ฃผ์๋ก postํ๋ form ํ๊ทธ๋ก ๋ณํ๋๋ค.-->
<form:errors path="id"/>
<span id="id.errors">length of id should be between 5 ~ 12 </span>
<!--๋์ํ๋ ์๋ฌ ๋ฉ์ธ์ง๋ก ๋ฐ๋๋ค.-->
4. ์ค์ค๋ก ํด๋ณด๊ธฐ
emali์ด @๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฉด ์ค๋ฅ ๋ฑ๋ ๋ก์ง ์ค๊ณ
//Global Validator ๋ด๋ถ
String email = user.getEmail();
if (!email.contains("@")) {
errors.rejectValue("email", "requried");
}
// properties ๋ด๋ถ
required=It's required item
required.user.pwd= User's password is required item
requried.user.email = email must have @
invalidLength.id=length of id should be between {1} ~ {2}
<div id="msg" class="msg"><form:errors path="email"/> <form:errors path="pwd"/></div>
<!--์ด๋ ๊ฒ ์ ์ผ๋๊น ๋ ์ค ์ค๋ฅ๋ ๊ฑฐ ํ๋ ์์ผ๋ฉด ๊ทธ๊ฑฐ ๋์ฐ๊ฒ ํ๋๋ผ ๊ตณ-->