제목 글자 제한 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";
}
```
Author And Source
이 문제에 관하여(제목 글자 제한 validation check [ 다른 포스팅으로 추가 예정 ]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ynoolee/제목-글자-제한저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)