인프런 커뮤니티 질문&답변

모깅님의 프로필 이미지
모깅

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

FieldError, ObjectError

bindingResult

해결된 질문

작성

·

472

·

수정됨

1

1. itemName이 존재하지 않을 때 bindingFailure를 false로 하고 bindingResult에 FieldError를 넣어줍니다. 궁금한 부분은 값이 들어오지 않는 경우도 binding 자체는 성공적으로 이루어졌다는 이야기인가요?

  1. 데이터 바인딩이라는 것에 대해 자세히 설명해주시면 감사하겠습니다.

     

  2. @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에서 바인딩이 된다는 의미 맞나요??

친절한 답변 감사드립니다.!!

모깅님의 프로필 이미지
모깅

작성한 질문수

질문하기