🔥 Vamos/Spring

1228 | 스프링의 정석 :: 2-30 (데이터 변환기능)

unikue 2022. 12. 28. 23:58

데이터의 변환과 검증(1)

 

1. WebDataBinder

라우저를 통해서 요청 받은 값이 실제 객체에 바인딩 될 때 중간 역할을 해주는 것

: 1. 타입변환 2. 데이터 검증을 해서 결과를 BindingResult에 담아 컨트롤러의 Result에 전달해준다.

(예. String 10을 타입변환해서 int 로 바꾸고, month값은 1~12만 들어갈 수 있으므로 검증하여 값을 대입한다)

 

타입이 불일치일때 webDataBinder에서 적절히 변환해준다. 이 결과값을 BindingResult result로 매개변수를 선언함으로써 사용할 수 있음

 

 

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]으로 받게 됨.