최종 프로젝트의 전반적인 기능 구현을 완료 하고 포스트맨으로 테스트 해보았다.
보드 가입 신청 및 수락,거절 기능을 구현하였고 이를 해결하고 나니 보드에 탈퇴 기능이 필요할것 같아서 추가로 구현해주었다. 탈퇴 기능은 보드와 사용자 사이의 중간 테이블에서 보드에 참여 상태일 때 칼럼을 삭제해주는 방식으로 구현하였다. 다음은 해당 코드이다.
//BoardService.java
public void quitBoard(Long boardId, User user) {
Board board = findBoard(boardId);
List<AttendBoard> attendBoardList = attendBoardRepository.findByBoardId(boardId);
for (AttendBoard attendBoard : attendBoardList) {
if (attendBoard.getUser().getId() == user.getId()) {
if (attendBoard.getParticipation().equals(Participation.attend)) {
attendBoardRepository.delete(attendBoard);
}
}
}
}
또한 보드의 정원이 가득 차면 채팅방을 생성하는 것이 기존 목표였는데 참여한 보드가 많아지면 채팅방이 무수히 많이 생겨날 것을 고려하여 보드가 정해진 시간이 지나면 자동으로 삭제되도록 만들어 주었다. 이 기능을 만들기 위해 스케줄러라는 것을 사용해 보았다. 스케줄러를 사용하면 설정한 시간마다 함수를 실행시켜준다.
//BoardScheduler.java
@Component
@RequiredArgsConstructor
public class BoardScheduler {
private final BoardService boardService;
@Scheduled(fixedRate = 60000)//60초
public void deleteExpiredBoards(){
boardService.deleteExpiredBoards();
}
}
스케줄러에서 설정해둔 시간마다 아래 코드가 실행되어 기간이 만료된 보드를 삭제하는 쿼리문을 보내준다.
//BoardService.java
@Transactional
public void deleteExpiredBoards() {
Date currentDate = Date.from(Instant.now());
List<Board> boardsToDelete = boardRepository.findByPlayDateBefore(currentDate);
boardRepository.deleteAll(boardsToDelete);
}