유효성 검사를 추가해보려고 한다.
조건은 아래와 같다.
내용
은 1글자 이상 1000글자 이하여야 한다.제목
은 공백으로만 이루어질 수는 없다.id
(PK, primary key)로 특정 게시글을 조회했을 때, 존재하지 않는 게시글일 경우 에러 메시지로 응답하기id
(PK, primary key)로 특정 게시글을 삭제하기 위해 조회했을 때, 존재하지 않는 게시글일 경우 에러 메시지로 응답하기검색 키워드
는 공백을 제외한 1글자 이상이어야 한다.마지막 검색 키워드 관련된 것은 나중에 보면 알겠지만 내가 조건을 좀 달리했다. 어차피 공부하려고 하는 거니까 이것저것 시도해보는 것은 좋은 것일 거다...(아마...)!
build.gradle에 아래와 같이 validation체크를 위해 의존성을 추가해준다.
implementation 'org.springframework.boot:spring-boot-starter-validation'
준비는 다 됬으니, BoardRequest.java에서 요구사항에 맞게 어노테이션을 사용해서 유효성 검사를 해보자.
@NotBlank(message = "제목은 NULL이 아니어야 합니다.")
private String title;
@NotNull
: 모든 타입에 대해 NULL을 허용하지 않는다.
@NotEmpty
: 아래 타입들에 한해서만 지원하며, NULL과 ""를 허용하지 않는다.
- CharSequence (length of character sequence is evaluated)
- Collection (collection size is evaluated)
- Map (map size is evaluated)
- Array (array length is evaluated)
@NotBlank
: NULL과 "", " "(whitespace)를 허용하지 않는다.
@Size(min = 1, max = 1000)
private String content;
@Size
: 문자열이나 배열ㅇ릐 크기를 검증하는데 사용된다.
먼저 BoardServiceImpl을 수정해주었다.
@Override
@Transactional
public Board update(int id, BoardRequest boardRequest) {
Optional<Board> board = repository.findById(id);
if(board.isPresent()) {
board.get().update(boardRequest.getTitle(), boardRequest.getContent());
return board.get();
} else {
return null;
}
}
해당 id값을 가진 게시글이 존재하면 수정을 거친 뒤 true를 반환해주고,
id값을 가진 게시글이 존재하지 않으면 바로 false를 반환해준다.
그 후, BoardController 에서 아래와 같이 반환해준다.
@PutMapping("/{id}")
public ResponseEntity<?> updateBoard(@PathVariable("id") int id, @Validated @RequestBody BoardRequest boardRequest) {
Board board = boardService.update(id, boardRequest);
if(board == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body("Invalid Board Id.");
}
return ResponseEntity.status(HttpStatus.OK)
.body(board);
}
수정과 마찬가지로 BoardService와 BoardSerivceImpl 로직들을 수정해주었다.
@Override
public boolean delete(int id) {
Optional<Board> board = repository.findById(id);
if(board.isPresent()) {
repository.deleteById(id);
return true;
} else {
return false;
}
}
id를 통해 조회했을 때 값이 있으면 해당 게시글을 삭제하고 true를 반환해준다.
id를 통해 조회했을 때 값이 없으면 바로 false를 반환해준다.
그러면 BoardController.java에서는 아래와 같이 리턴 값을 이용해 유효성 검사를 해준다.
@DeleteMapping("/{id}")
public ResponseEntity<?> deleteBoard(@PathVariable int id) {
boolean isDeleted = boardService.delete(id);
if(!isDeleted) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body("Invalid Board Id.");
}
return ResponseEntity.status(HttpStatus.OK)
.build();
}
이는 같은 BoardRequest 를 사용하기 때문에 따로 수정하지 않아도 똑같이 적용된다!
드디어 내가 좀 생각을 바꿔서 추가했다는 기능에 도착했다.
나는 공백이 글자의 좌,우에 존재하면 지워주고 공백이어도 검색이 가능하도록 바꾸어보았다.
그 이유는, 어차피 게시판에서 빈 칸인 상태에서 검색하는 케이스도 있다고 생각했기 때문이다.
그래서 나는 아래와 같이 그냥 title에 trim()메소드를 이용해서 whitespace를 지워주었다.
@GetMapping()
public ResponseEntity<?> findAllBoards(@RequestParam("title") String title, Pageable pageable) {
List<Board> boards = boardService.findAll(title.trim(), pageable); //title.trim()
return ResponseEntity.status(HttpStatus.OK)
.body(boards);
}
끝-*