1228 | 스프링의 정석 :: 2-30 (데이터 변환기능)
데이터의 변환과 검증(1)
1. WebDataBinder
: 브라우저를 통해서 요청 받은 값이 실제 객체에 바인딩 될 때 중간 역할을 해주는 것
: 1. 타입변환 2. 데이터 검증을 해서 결과를 BindingResult에 담아 컨트롤러의 Result에 전달해준다.
(예. String 10을 타입변환해서 int 로 바꾸고, month값은 1~12만 들어갈 수 있으므로 검증하여 값을 대입한다)
2. RgisterController에 변환기능 추가하기
@PostMapping("/register/save")
public String save(User user, BindingResult result, Model m) throws Exception{
System.out.println("result="+result);
}
//BindingResult가 있는경우, 예외발생시 에러페이지로 넘어가는게 아니라 컨트롤러에게 바인딩 결과를 주고 컨트롤러가 처리하게 함.
// 즉 에러는 발생했으나 에러페이지로 이동만 안함.
변환에 실패했다는 에러 로그:birth라는 필드에 값이 들어왔으나 변환이 거절됐다. 이유는 type mixmatch
result=org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'user' on field 'birth': rejected value [2024/12/21]; codes [typeMismatch.user.birth,typeMismatch.birth,typeMismatch.java.sql.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.birth,birth]; arguments []; default message [birth]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.sql.Date' for property 'birth'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.sql.Date] for value '2024/12/21'; nested exception is java.lang.IllegalArgumentException]
@Controller
public class RegisterController {
@InitBinder
public void toDate(WebDataBinder binder) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(df,false));
// 스프링이 제공하는 CustomDateEditor class 사용 (false는 빈값을 허용할거냐, 안할거냐)
}
// 메서드를 추가하여 날짜를 date타입으로 적절히 변환해줌
* 근데 변환된 결과 화면이 선생님과 내꺼가 조금 달라서 이게 맞게 된건질 모르겠다...똑같이 util Date를 가져왔는데?👉 해결. 나는 util.Date를 import했는데 왜 sql이 들어가있었니.... ^^....
binder.registerCustomEditor(String[].class, new StringArrayPropertyEditor("#"));
// String에 대해 구분자#를 이용해서 값을 잘라서 배열로 나눠서 받는다
// tennis#swimming#running으로 웹에서 입력시 [tennis,swimming,running]으로 받게 됨.