해결된 질문
작성
·
469
·
수정됨
1
1. itemName이 존재하지 않을 때 bindingFailure를 false로 하고 bindingResult에 FieldError를 넣어줍니다. 궁금한 부분은 값이 들어오지 않는 경우도 binding 자체는 성공적으로 이루어졌다는 이야기인가요?
데이터 바인딩이라는 것에 대해 자세히 설명해주시면 감사하겠습니다.
@ModelAttribute Item파라미터를 받을 때 바인딩이 실패할 경우 스프링에서 bindingResult에 BindFailure가 true 로 한 후 FieldError를 저장하는 건가요?
바인딩을 정확히 받아드리지 못하고 있어서 이런저런 궁금증이 생기네요.. 감사합니다.
4. 예를들어 Price의 경우 "qqq"등으로 바인딩이 실패하면 Null값으로 Item객체가 파라미터로 들어오나요?
5. 바인딩이 되는 시점이 정확히 궁금합니다.
답변 1
8
안녕하세요. 선목님
우선 데이터 바인딩과 데이터 검증에 대해서 분리해서 생각하면 이해하기 쉽습니다.
데이터 바인딩은 웹 요청 파라미터를 자바 객체에 매핑하는 과정을 의미합니다. 쉽게 이야기해서 컨트롤러에서 받는 모델 객체(ModelAttribute)에 웹 요청 데이터를 넣어주는 과정입니다. 이 과정에서 잘못되면 예를 들어서 int형에 qqq라는 웹 요청이 넘어오게 되면 데이터 바인딩에 실패하게 됩니다. 이때는 바인딩 자체가 실패한 것이므로 bindingFailure를 true로 하는 것이 맞습니다.
그 다음으로 데이터 검증 과정이 있습니다.
여기서 검증은 바인딩 된 데이터가 우리가 원하는 데이터 범위에 맞게 왔는지 검증하는 것입니다.
예를 들어서 100이라는 숫자가 넘어왔는데 최소값이 1000이라면 검증에 실패해야 합니다. 이 경우 데이터 바인딩은 되었지만 검증에서 실패한 것이므로 bindingFailure를 false로 하는 것이 맞습니다.
스프링에서 자동으로 처리해주는 경우에도 이와 같이 동작합니다.
이와 같은 내용을 기반으로 하나씩 답변을 드리겠습니다.
1. itemName이 존재하지 않을 때 bindingFailure를 false로 하고 bindingResult에 FieldError를 넣어줍니다. 궁금한 부분은 값이 들어오지 않는 경우도 binding 자체는 성공적으로 이루어졌다는 이야기인가요?
- 웹 요청에서 문자 값이 ""(빈문자)로 넘어오더라도 문자 타입에 ""(빈문자)는 넣을 수 있습니다. 따라서 바인딩 실패는 아닙니다. 심지어 null 값이 넘어오더라도 문자 타입에는 null 값이 들어오므로 바인딩은 성공했다 볼 수 있습니다. 이런 경우에는 바인딩이 아니라 검증 과정으로 처리해야 합니다.
2. 데이터 바인딩이라는 것에 대해 자세히 설명해주시면 감사하겠습니다.
- 앞의 내용을 참고해주세요.
3. @ModelAttribute Item파라미터를 받을 때 바인딩이 실패할 경우 스프링에서 bindingResult에 BindFailure가 true 로 한 후 FieldError를 저장하는 건가요?
바인딩을 정확히 받아드리지 못하고 있어서 이런저런 궁금증이 생기네요.. 감사합니다.
- 앞의 내용을 참고해주세요.
4. 예를들어 Price의 경우 "qqq"등으로 바인딩이 실패하면 Null값으로 Item객체가 파라미터로 들어오나요?
- 내 맞습니다. 하지만 스프링 MVC(FieldError.rejectedValue)에서 qqq라는 값은 가지고 있어서 이 값을 활용해서 화면에 다시 출력할 수는 있습니다.
5. 바인딩이 되는 시점이 정확히 궁금합니다.
스프링 MVC에서 요청이 들어오면 DispatcherServlet이 해당 요청을 처리하는 적절한 컨트롤러 메서드를 찾습니다. 이 메서드를 호출하기 전에 메서드의 파라미터와 웹 요청의 데이터를 매핑하는 바인딩 과정이 발생합니다. 따라서 컨트롤러 메서드가 실행되기 전 시점에 바인딩이 완료됩니다. 이후에 컨트롤러가 호출되고 바인딩이 완료된 모델 객체(ModelAttribute)가 넘어오게 됩니다.
감사합니다.
5번의 경우 argument resolver에서 바인딩이 된다는 의미 맞나요??
친절한 답변 감사드립니다.!!