• 티스토리 홈
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 8
        2022년 05월 26일
        • starryeye
        • 작성자
        • 2022.05.26.:58
        반응형

        Validation 7번까지는 검증을 위해.. 아직도 코드를 쳐야할게 많아보인다.. 더 줄여보자..

        그리고 검증하는 로직이 ... 개발자 대부분이 다 사용할 거 같은 검증 로직이다..

        (min max 지정, null인지 체크하는 로직 등)

         

        Bean Validator

        하나의 기술표준이다. (JSR-380)

        (단순히 하나의 인터페이스나 구현체가 아님, 검증 어노테이션과 여러 인터페이스의 모음)

        스프링 부트가 spring-boot-starter-validation 라이브러리를 넣으면 자동으로 Bean Validator를 인지하고 스프링에 통합한다.

        -> 스프링 부트는 LocalValidatorFactorBean을 글로벌 Validator(모든 컨트롤러에 적용되는 검증기)를 자동으로 등록한다.

        -> 검증이 필요한 메서드 컨트롤러에는 검증 대상 객체 파라미터에 @Validated나 @Valid만 적용하면 된다.

        (Validation 7번에서 했던 .. init 메서드나.. WebDataBinder는 필요가 없다)

        -> 검증 대상 클래스에는 맴버 변수에 검증을 위한 어노테이션을 적용한다.(@NotNull 등)

         

        검증이 필요한 메서드 컨트롤러에 @Validated가 적용된 모습을 볼 수 있다.

         

        이전 포스팅에서 언급했지만 다시 정리 해보자면..

        -> BindingResult는 타입 에러와 같이 컨트롤러가 호출 되기도 전에 예외가 터져서 컨트롤러가 호출이 되지않는 케이스를 방지하기 위함이다. (해당 파라미터가 있으면 위의 메서드 컨트롤러가 정상 호출 됨)

        -> 하나의 필드 검증이 아닌.. 여러 필드가 복합적으로 섞인 검증오류를 처리하기 위한 로직은 위와 같이 따로 빼준다.

        -> 검증에 실패하는 케이스 처리에 대한 로직도 구현 해줘야 한다.

         

        검증 순서

        검증 순서를 다시 한번 정리 해보자.

        1. 쿼리파라미터(GET) 또는 HTML 폼(POST) 요청이 WAS로 들어왔다.

        2. @ModelAttribute 어노테이션에 의해 Item 객체를 생성한다.

        3. 각각의 필드에 타입 변환 시도 및 값 넣어 주기 시도.. (Binding)

        -> 타입이 안 맞아서 binding이 실패

        -> 메서드 컨트롤러에 BindingResult 파라미터가 존재한다.

        (존재 하지 않으면 400 HttpStatus로 클라이언트에 응답)

        -> BindingResult에 typeMismatch 로 FieldError 가 추가된다.

        -> 컨트롤러 호출

        (타입오류가 발생된 필드는 null이다.)

         

        3번에서 바인딩 성공을 했다면...

        -> 글로벌 Validator(LocalValidatorFactorBean)이 작동된다. (개발자가 의도한 검증)

        -> 각 필드에 적용한 검증 어노테이션에 따라 검증이 된다.

         

         

        참고로.. 메세지코드는 어떻게 적용할까...

        타입 에러의 메세지 코드 처리와 같이.. 이미 정해져있다.

        MessageCodeResolver가 아래와 같이 메세지코드를 만들어준다.

        개발자는 아래를 활용하여 에러 프로퍼티를 만들어 주기만 하면된다.

         

        Item객체의 itemName필드에 @NotBlank를 적용했을 때의 경우

        @NotBlank

        NotBlank.item.itemName

        NotBlank.itemName

        NotBlank.java.lang.String

        NotBlank

         

        Item객체의 price필드에 @Range를 적용했을 때의 경우

        @Range

        Range.item.price

        Range.price

        Range.java.lang.Integer

        Range

         

        반응형

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

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

        티스토리툴바