스프링 게시판 API 만들기 5

🌎·2023년 5월 21일
0

스프링 공부

목록 보기
8/11

유효성 검사를 추가해보려고 한다.
조건은 아래와 같다.

  • 내용은 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)를 허용하지 않는다.


내용은 1글자 이상 1000글자 이하여야 한다.

    @Size(min = 1, max = 1000)
    private String content;

@Size : 문자열이나 배열ㅇ릐 크기를 검증하는데 사용된다.


게시글의 id(PK, primary key)로 특정 게시글을 조회했을 때, 존재하지 않는 게시글일 경우 에러 메시지로 응답하기

먼저 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);
    }

게시글의 id(PK, primary key)로 특정 게시글을 삭제하기 위해 조회했을 때, 존재하지 않는 게시글일 경우 에러 메시지로 응답하기

수정과 마찬가지로 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 를 사용하기 때문에 따로 수정하지 않아도 똑같이 적용된다!


검색 키워드는 공백을 제외한 1글자 이상이어야 한다.

드디어 내가 좀 생각을 바꿔서 추가했다는 기능에 도착했다.
나는 공백이 글자의 좌,우에 존재하면 지워주고 공백이어도 검색이 가능하도록 바꾸어보았다.

그 이유는, 어차피 게시판에서 빈 칸인 상태에서 검색하는 케이스도 있다고 생각했기 때문이다.
그래서 나는 아래와 같이 그냥 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);
    }

끝-*

profile
영차영차

0개의 댓글