inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

FieldError, ObjectError

bindingResult

해결된 질문

574

모깅

작성한 질문수 55

1

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

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

     

  2. @ModelAttribute Item파라미터를 받을 때 바인딩이 실패할 경우 스프링에서 bindingResult에 BindFailure가 true 로 한 후 FieldError를 저장하는 건가요?

바인딩을 정확히 받아드리지 못하고 있어서 이런저런 궁금증이 생기네요.. 감사합니다.

 4. 예를들어 Price의 경우 "qqq"등으로 바인딩이 실패하면 Null값으로 Item객체가 파라미터로 들어오나요?

5. 바인딩이 되는 시점이 정확히 궁금합니다.

spring mvc

답변 1

9

김영한

안녕하세요. 선목님

우선 데이터 바인딩과 데이터 검증에 대해서 분리해서 생각하면 이해하기 쉽습니다.

데이터 바인딩은 웹 요청 파라미터를 자바 객체에 매핑하는 과정을 의미합니다. 쉽게 이야기해서 컨트롤러에서 받는 모델 객체(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)가 넘어오게 됩니다.

감사합니다.

1

모깅

5번의 경우 argument resolver에서 바인딩이 된다는 의미 맞나요??

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

이미지 업로드와 db 트랜잭션 묶는법

0

42

1

Could not resolve org.springframework.boot:spring-boot-starter-validation:2.4.4

0

52

2

MessageSourceTest 코드

0

47

1

인터셉터 에러 설정

0

48

1

resolveArgument()메서드 질문

0

57

1

43강 검증1 에서 실패 로직 관련 질문있습니다.

0

55

2

타임리프 3.X 버전 rendering, serializer 에러 해결 방법

2

133

3

스프링 빈에 등록이 안되는거 같은데 어떻게 하면 좋을까요?ㅠㅠ

0

90

3

pdf 오타 문의

0

57

1

ItemUpdateForm 검증 관련 질문입니다.

0

48

1

22page 링크 주소 변경

0

59

2

특정 데이터와 파일을 함께 저장 시, 테이블 구조 질문

0

53

1

섹션3번 수업에 대한 질문입니다.

0

80

2

@Autowired 보다 더 좋은 방법이 어떤 걸까요?

0

85

2

타입컨버터 가 람다랑 비슷해 보이는데 저의 생각이 맞는지?.

0

65

1

자바스크립트 인라인에서 객체 직렬화 시 오류가 납니다

0

142

3

스프링부트 - 오류페이지2 에서 500.html 에서 쓰인 객체 질문

0

63

1

톰캣 에러 페이지가 안보입니다.

0

102

2

apiEceptionController에서 센드 에러 호출하면 안되는지?

0

81

1

세션 타임아웃시 쿠키 삭제 방법이 없나요?

0

118

2

ApiExceptionController 질문드립니다.

0

64

1

셀렉박스 챕터에서 option value에 ==배송 방식 선택== 이것을 넣은 이유가 궁금함, 이렇게 구상해도 되는지?

0

66

1

MemberRepository 필드의 fianl 선언 유무

0

85

2

혹시 index.html 에서는 fragment 사용이 안되는건가요

0

58

1