제목 글자 제한 validation check [ 다른 포스팅으로 추가 예정 ]

  • 유큐버 코딩의신 님의 강의를 보고 쓰는 글

  • Spring Boot의 validation check : 사용자가 실수로 잘못된 값을 입력 OR, 고의적으로 해킹을 위한 데이터를 입력할 수도 있다. 따라서 Server에서는, 이 값을 체크해주는 것이 필수적이다.
    • 강의에서는, Board에 바로 validation을 추가하고 있는데
    • 인프런 강의에서 배운 것에 의하면, Entity에 바로 validation을 넣는 것은 좋지 않다.
      • Presentation Matching을 위한 validation logic이 entity에 다 들어가는 것은 좋지 않다.
      • 예를들어, 이것이 API인 경우라면, 같은 기능을 하는 것이더라도 api spec은 매우 다양하다. - 어떤 api dptjsms @Notempty가 필요할수도 어떤 api에서는 필요하지 않을 수도 있다.
      • Entity를 직접 손대면, API spec 자체가 바뀌는 경우도 생긴다. Entity는 정말 여러 곳에서 사용하는 것이기 때문에, 사용처마다 원하는 조건이 다를 수 있다.
      • 따라서 Entity를 직접 사용하지 않고, 별도의 Object인 DTO를 만드는 것이 좋다.
      • 외부에서 json나 쿼리파라미터 등을 통해서 오는 것을 binding하여 Entity로 받아 쓰면 안된다!!
      • 특히 API를 만들 때에는, { Entity를 parameter로서 받으면 X!! } 그리고 { Entity를 외부에 노출해서도 X!! }
      • 그래서 Board 대신 BoardForm 이라는 DTO 객체를 생성하기로 함 —> 기존의 코드들을 수정
        • DTO를 생성 할 때 주의할 것 !! Please note that you will need a constructor accepting all internal variables as parameters..
        • board대신 boardForm을 사용

그런데 여기서 생기는 의문 ❓❓❓ 그래도 list를 표시하거나 할 때는 그냥 board 라는 Entity를 사용하는게 좋은가?? ❓❓❓ 잘 모르겠어서. 일단 그냥 둠 .

            ```html
            @GetMapping("/list")
                public String list(Model model){
                    List<Board> boards = boardRepository.findAll();
                    model.addAttribute("boards",boards);
                    return "board/list";
                }
            ```

        - Controller를 수정 : @ModelAttribute 사용하던 것을 —> ***@Valid와 BindingResult를 사용하는 것으로 변경 → BindingResult를 보고, 값을 체크***해 주면 된다. —> BoardForm에 설정해 놓은 @NotNull이나 @Size를 만족하지 않으면 BindingResult에 그러한 것이 저장되어있음
            - 기존

                ```java
                // form 내용을 저장
                    @PostMapping("/new-postform")
                    public String savePost(@ModelAttribute BoardForm boardForm){
                        Board board = new Board();
                        if(boardForm.getContent()!=null){
                            board.setId(boardForm.getId());
                        }
                        board.setTitle(boardForm.getTitle());
                        board.setContent(boardForm.getContent());
                        boardRepository.save(board);
                        System.out.println(board);
                        return "redirect:/board/list";
                    }
                ```

            - @Valid BoardForm boardForm 만 쓴 거는, @Valid @ModelAttribute("boardForm") BoardForm boardForm 이 생략된 것임.
            - 변경 : Error가 있으면
                - PostForm object marked with @Valid —> form 에 채워진 attributes를 gather
                - BindingResult object —> validation errors에 대해 테스트 해보고 결과를 얻을 수 있다.
                - form 으로부터 , PostForm object에 bound되어있는 모든 attributes들을 받아올 수 있다.
                - 보통 사용자가 @Valid 제약조건을 위반하는 title을 입력한다면, 에러메시지를 표시하면서, 이 페이지로 다시 돌아와야 한다.
                    - 따라서 error에 직면한다면, user에게 다시 원래의 form template를 보내준다.
                    - ❓❓❓ ❓❓❓ 어떻게 작성하던 내용이 담긴 form page가 뜨는 걸까?

                        ```java
                        <form action="#" th:action="@{/board/new-postform}" th:object="${boardForm}" method="post" >
                        ```

                        - 이 부분의 영향인 것 같다.
                        - Spring MVC 의 model에 key값이 "boardForm"인 객체에 , 현재 form page에 있던 정보들이 update 된 듯 하다. 따라서, return 된 String의 view를 렌더링 할 때는, Model에 있던 boardForm이 사용되어, 쓰던 글의 내용이 보이는 것.
                        - 마찬가지로 현재페이지에서 F5를 해도 같다.

                    @PostMapping("/new-postform")
                        public String savePost(@Valid BoardForm boardForm, BindingResult bindingResult){
                            if (bindingResult.hasErrors()) {
                                return "/board/new-postform";
                            }
                            Board board = new Board();
                            if(boardForm.getContent()!=null){
                                board.setId(boardForm.getId());
                            }
                            board.setTitle(boardForm.getTitle());
                            board.setContent(boardForm.getContent());
                            boardRepository.save(board);
                            System.out.println(board);
                            return "redirect:/board/list";
                        }
                    ```

좋은 웹페이지 즐겨찾기