221203 TIL 하위 게시판 생성하기

오늘의 작업 목표는 게시판을 생성하는 기능인데 게시판을 그냥 생성하는 게 아니라 게시판 하나를 선택하면 선택한 게시판의 하위 게시판이 생기는 기능이었다. 예를 들어 EPL 게시판이 존재하면 하위 게시판으로 토트넘, 아스날 등등 팀 게시판을 생성할 수 있고 또 토트넘 팀 게시판에 손흥민, 헤리케인 같은 선수 게시판을 생성하는 것이었다.

 

기존에 게시판 Entity를 만들 때 위와 같은 기능을 구현하기 위해 게시판 Entity를 설계할 때 게시판 필드에 상위 게시판 아이디 값을 참조하기 위한 parentId 값을 생성했었다.

 

그래서 관리자 페이지에서 게시판을 생성할 때 작업 설계를 아래와 같이 했다.

1. 관리자 페이지에 현재 게시판을 리스트 시킨다.

2. 현재 존재하는 게시판 중 하위 게시판을 생성할 게시판을 선택해서 선택한 게시판의 아이디와 새로 생성할 게시판의 이름을 입력해 해당 정보들을 백엔드로 전송한다.

3. 백엔드에서 전달받은 게시판 아이디와 이름으로 게시판을 선택하지 않았을 때, 이미 존재하는 이름의 게시판을 생상 하려 할 때 예외처리를 해준다.

4. 예외처리에 통과되었으면 상위 게시판의 아이디 값을 parentId에 추가하고 게시판을 생성한다.

5. 프론트엔드에서는 게시판 리스트를 전달받아 화면에 출력할 때 게시판 자신의 아이디와 다른 게시판들 중 parentId가 같은 게시판을 찾아 자신의 바로 아래에 위치시켜 자신의 하위 게시판임을 나타낸다.

 

게시판 생성에 대한 작업 설계는 위와 같이 하고 구현한 결과는 아래와 같다.

 

각각의 리그에 대해 팀 게시판과 선수 게시판을 성공적으로 생성할 수 있었다.

 

이제 게시판 삭제를 설계하던 찰나에 아샬 님이 어제 올린 TIL에 코멘트를 하나 남겨주셨다.

사용자 탈퇴 시 엔티티 연관관계 때문에 해당 사용자가 작성한 게시글, 댓글, 대댓글을 모두 지워야 하는 내용인데 아샬 님은 실제로 데이터들을 지우는 게 아니라 soft delete를 이용해 삭제했다고 표시만 하고 실제로 삭제시키지 않는 방법을 추천해주셨다.

그래서 이번에 게시판 삭제할 때는 해당 방법을 활용해보기로 했다.

 

Soft delete란 

데이터 칼럼에 해당 데이터의 삭제 여부를 알 수 있는 값을 넣어서 (예를 들어 true, false 같은 ) 표현하는 것을 말한다.

즉, 게시판을 지워도 실제로 지운 것이 아니라 게시판의 특정 상태 값을 변경해 지워진 것처럼 보이게 하는 것을 말한다.

 

게시판의 삭제 여부를 알기 위한 칼럼인 boolean값의 isDeleted 칼럼을 게시판 엔티티에 추가해주었다.

그리고 게시판을 삭제 버튼 눌렀을 때 해당 칼럼의 값을 true로 바꿔주고 프론트엔드에서는 게시판의 deleted 상태가 false인 게시판만 화면에 출력되도록 filter를 이용해 걸러주었다.

 

이렇게 했을 때 발생했던 문제는 삭제한 게시판의 이름으로 또 새로운 게시판을 생성하려고 할 때 이미 있는 게시판의 이름이라고 예외처리를 해버리는 문제가 있었다.

삭제된 게시판이 실제로 지워지지 않고 db에 저장이 되어있기 때문에 게시판 이름 중복 검사를 할 때 existsBy~ 메서드로 검사했기 때문에 통과하지 못하고 있었다.

 

그래서 해당 문제를 고려해 existsBy~ 메서드로 생성하려는 게시판의 이름이 존재할 때 해당 게시판을 findAllby~ 메서드(이름이 같은 게시판이 여러 번 삭제되었을 때를 대비해)로 찾아서 찾은 게시판의 deleted 상태가 true인지 false인지 검사해서 false일 때만(게시판이 삭제처리 안되었을 때) 예외처리 해도 록 해주었다. 

해당 코드는 아래와 같다.

if(boardRepository.existsByBoardName(boardName)) {
    List<Board> foundBoards = boardRepository.findAllByBoardName(boardName);

    foundBoards.forEach(foundBoard -> {
        if(!foundBoard.isDeleted()) {
            throw new AlreadyExistingBoardName();
        }
    });
}

 

위와 같은 방법으로 게시판 생성 / 삭제 기능도 구현을 완료했다.