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

        Validation 8에서 정말 간편한.. 스프링이 지원하는 글로벌 Validator(LocalValidatorFactorBean) 사용법을 알아봤다..

         

        추가로 개발 시, 고려 되어야 할 사항에 대해 알아보자.

         

        여러 페이지에 대한 컨트롤러를 개발하다보면.. 비슷한 필드가 존재하는 HTML Form이 사용될 수 있다.

        그래서 개발자는 여러페이지에 대해 동일하게 Binding할 객체를 하나만 생성해서 쓰려고 고려를 할 수 있다.

        (그래서 같은 객체를 사용)

        이는.. 잘못된 접근이다..

         

        각 페이지에 대해 개발을 지속적으로 진행하다보면..

        예를들면..

        사양이 처음보다 많이 바뀌어

        A페이지에서는 X객체의 a필드 값 범위가 1~100이고

        B페이지에서는 X객체의 a필드 값 범위가 없다고 치면..

        하나의 객체의 하나의 필드에 어노테이션을 각 컨트롤러에 따라 각기 다르게 적용해야되는 경우가 생긴다.

        이때.. 어떻게 해야할까..

         

         

        <방법>

        1. @Validated 의 groups 기능을 사용해야하거나.. (@Valid는 groups 기능 없음)

        -> 구분용 interface를 만들어 Item 객체의 어노테이션(@NotNull과 같은)에 요소로 각각 등록

        -> 결국 Item객체가 또 지저분 해지고 유지보수성이 떨어진다.(가독성 내려감)

        -> 그리고 실제 현업 코드에서는 서로 다른 페이지에서 넘어오는 데이터가 겹칠 일이 거의 없음

         

         

        2. Item 객체는 Repository에 넣기 직전의 객체로 놔두고.. 새로운 객체들(A페이지용, B페이지용)을 만들어 

        사용한다.

        -> Repository에 넣을 때는 Item 객체로 변환하여 Item 객체로 넣는다.

        -> Item 객체에는 결국 Validator가 보는 어노테이션이 모두 빠지고 새로 만든 바인딩용 객체에 각각 사양에 맞는 검증 어노테이션이 들어간다.

         

         

        2번 방법의 구현을 보자

         

        addItem Controller

        @Validated를 사용하여 검증을 수행한다.

        -> 새로 만든 ItemSaveForm 타입으로 바인딩 및 검증을 수행한다.

        뷰템플릿 코드를 건드리지 않기 위해.. @ModelAttribute에서 name요소을 "item" 으로 지정한다.

        ("item"으로 지정하지 않으면 뷰템플릿에 "itemSaveForm"으로 Model에 담기고.. th:object 이름 변경해야됨)

        기존의 Item 객체를 만들어 Repository에 넣어준다.

         

        ItemSaveForm

        Item 클래스에 있는 어노테이션을 다 지우고 새로 ItemSaveForm 클래스를 만들고..

        addItem Controller에서 검증하는 사양대로 어노테이션을 붙여줌.

         

        ItemUpdateForm

        edit Controller에 검증용으로 사용 할(다른페이지) 클래스이다.

        ItemSaveForm 과 다른 어노테이션이 적용되어있다..

         

        edit Controller

        edit 페이지에서 사용 될 controller이다.

        addItem Controller와 다른 ItemUpdateForm 검증용 클래스 타입이 파라미터에 보인다.

        addItem Controller와 동일하게 @ModelAttribute name 요소로 "item" 이 사용되고 있다.

        Repository에 저장하기 위한 Item 객체가 사용되고 있다.

        반응형

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

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

        티스토리툴바