• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • Spring MVC 마스터하기 Validation 10
        2022년 05월 28일
        • starryeye
        • 작성자
        • 2022.05.28.:55
        반응형

        지금까지는 클라이언트에서 HTML Form POST 형식 또는 HTTP 쿼리파라미터 GET 방식를 통한 요청에 대한

        검증 방법론에 대하여 알아봤다.

         

        Bean Validation (LocalValidatorFactorBean) 방법은 HttpMessageConverter에도 적용할 수 있다.

        정확하게는 .. @Valid, @Validated 는 HttpMessageConverter(@RequestBody)에도 적용할 수 있다.

         

        이전 포스팅에서 알 수 있지만, @ModelAttribute는 HTTP 요청 파라미터(URL 쿼리, POST Form)를 다룰 때 사용한다.

         

        하지만, HTTP Message Body 데이터를 객체로 변환할 때는 @RequestBody를 사용해야 한다.(주로 Json)

         

         

        코드로 더 자세하게 알아보자

        위 코드를 보면...

        @RestController 를 사용하여 객체(json)로 응답을 할 수 있게 하였다.

        -> return 타입이 Object이다.

        -> return bindingResult.getAllErrors() 를 사용하여, 모든 에러에 대하여 List로 에러 객체(Field, Object 모두)를 응답으로 내린다.

        -> return form 을 사용하여, 검증에 성공할 시 요청 json 그대로를 응답으로 내려준다.

         

        @RequestBody @Validated ItemSaveForm form 을 사용하여...

        -> ItemSaveForm 객체로 요청 message body를 바인딩 하며.. 검증 할 수 있도록 하였다.

         

        BindingResult 를 파라미터에 사용하여...

        -> 요청데이터의 객체 바인딩에 실패할 경우에도 컨트롤러를 호출 할 수 있게 하였다.

         

        여기서 문제는.. 볼드체로 표시한 부분을 기대하였지만.. 타입에러가 발생할 때는 컨트롤러 호출이 안된다.

        이유를 알아보자..

        (물론 개발자의 검증 오류(Validator 사용한 검증 단계에서 오류) 일 경우는 당연히 호출된다.)

        (검증 오류는 바인딩이 끝난 이후, 동작됨)

         

        타입에러가 발생 될 경우

        @ModelAttribute를 사용했을 땐...

        각각의 필드 단위로 적용된다. 따라서 특정 필드 타입이 안맞는 오류가 발생해도 다른 필드들은 정상 처리 됨.

        BindingResult 가 있으면.. 바인딩이 성공한 걸로 되는듯..

        (에러 발생한 필드에는 null을 넣고, Field Error를 BindingResult에 넣고 계속 진행)

         

        @RequestBody는...

        HttpMessageConverter가 동작되며.. 각각의 필드 단위로 적용되지 않고 전체 객체 단위로 적용된다.

        HttpMessageConverter가 성공하여 객체 바인딩이 모두 끝나야(객체 만들기) @Valid, @Validated가 적용된다.

        Json 데이터를 객체로 변경하지 못할 경우(HttpMessageConverter 단계가 정상처리 되지 않음)..

        이후 단계가 진행되지 않으며.. 예외가 발생한다. -> 예외 발생하여 리턴 리턴 리턴 ...

        (BindingResult가 파라미터에 있어도 바인딩이 실패한 걸로 되는듯..)

        그래서 컨트롤러 호출 및 Validator에 의한 검증이 되지않는다. 

         

        <해결>

        예외를 발생시켜 WAS까지 다시 리턴 되기 때문에 예외처리를 하여 원하는 방향으로 진행되게끔 해결해야한다.

        -> 예외 처리 포스팅에서 알아볼 예정

        -> 예외처리 9번 포스팅 확인

         

        시간날때.. 

        @ModelAttribute를 사용할 때는 계속 진행되지만..

        @RequestBody를 사용할 때는 왜... 예외를 발생시켜서 리턴하게 만드는지 직접 코드로 알아보자..

         

        반응형

        'Spring > MVC' 카테고리의 다른 글

        Spring MVC 마스터하기 쿠키, 세션 2  (0) 2022.05.29
        Spring MVC 마스터하기 쿠키, 세션 1  (0) 2022.05.29
        Spring MVC 마스터하기 Validation 9  (0) 2022.05.26
        Spring MVC 마스터하기 Validation 8  (0) 2022.05.26
        Spring MVC 마스터하기 Validation 7  (0) 2022.05.26
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바