[Practice] 공지사항 게시판 목록에 대한 요청 API 만들기 (22)

2021. 4. 12. 18:30Spring/Practice

1. 문제

  • 공지사항의 내용을 등록한 후 바로 동일한 제목과 내용의 공지사항을 등록하는 경우 등록을 막는 API
  • 중복의 경우 (조건: 동일 제목, 동일 내용과 등록일이 현재 시간 기준 1분 이내의 경우는 중복으로 판단)
  • 예외발생 (DuplicateNoticeException)

 

 

 

2. 풀이

- DuplicateNoticeException.java

package com.example.jpa.sample.notice.exception;

public class DuplicateNoticeException extends RuntimeException {
    public DuplicateNoticeException(String message) {
        super(message);
    }
}

- NoticeRepository.java

package com.example.jpa.sample.notice.repository;

import com.example.jpa.sample.notice.entity.Notice;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

@Repository
public interface NoticeRepository extends JpaRepository<Notice, Long> {


    Optional<List<Notice>> findByIdIn(List<Long> idList);

    Optional<List<Notice>> findByTitleAndContentsAndRegDateIsGreaterThanEqual(String title, String contents, LocalDateTime regDate);

    int countByTitleAndContentsAndRegDateIsGreaterThanEqual(String title, String contents, LocalDateTime regDate);
}

- ApiNoticeController.java

@RequiredArgsConstructor
@RestController
public class ApiNoticeController {

    private final NoticeRepository noticeRepository;

    ...

    @ExceptionHandler(DuplicateNoticeException.class)
    public ResponseEntity<String> handlerDuplicateNoticeException(DuplicateNoticeException exception) {
        return new ResponseEntity<>(exception.getMessage(), HttpStatus.OK);
    }

    // 문제 26
    @PostMapping("/api/notice")
    public void addNotice(@RequestBody NoticeInput noticeInput) {

        // 증복 확인 (제목, 내용, 등록시간이 1분 이내일 경우)
        LocalDateTime checkDate = LocalDateTime.now().minusMinutes(1); // 현재 시간 1분 전
//        Optional<List<Notice>> noticeList = noticeRepository.findByTitleAndContentsAndRegDateIsGreaterThanEqual(
//                noticeInput.getTitle(),
//                noticeInput.getContents(),
//                checkDate
//        );
//
//        if(noticeList.isPresent()) {
//            if(noticeList.get().size() > 0) {
//                throw new DuplicateNoticeException("1분 이내의 등록된 동일한 공지사항이 존재합니다.");
//            }
//        }
        int noticeCount = noticeRepository.countByTitleAndContentsAndRegDateIsGreaterThanEqual(
                noticeInput.getTitle(),
                noticeInput.getContents(),
                checkDate
        );
        
        if(noticeCount > 0) {
            throw new DuplicateNoticeException("1분 이내의 등록된 동일한 공지사항이 존재합니다.");
        }

        noticeRepository.save(Notice.builder()
                .title(noticeInput.getTitle())
                .contents(noticeInput.getContents())
                .regDate(LocalDateTime.now())
                .hits(0)
                .likes(0)
                .build()
        );
    }
}
728x90