Skip to content

[DISCUSSION] BoardQueryAdapter의 findById 및 findAll 메서드에서 REMOVED 상태인 게시글 처리 논의 #29

Closed
@wowddok99

Description

@wowddok99

이슈 개요

BoardQueryAdapter(RDB Adapter)

// 기존 코드
@Override
    public Optional<Board> findById(Long id) {
        return boardEntityMapper.toOptionalDomain(
                getQuerydsl().createQuery()
                        .select(boardEntity)
                        .from(boardEntity)
                        .where(
                                boardEntity.id.eq(id),
                                boardEntity.status.ne(BoardStatus.REMOVED)
                        ).fetchOne()
        );
    }

현재 BoardQueryAdapter의 findById와 findAll 메서드는 상태가 REMOVED인 게시글을 조회하지 않도록 설계되어 있습니다. 2025년 1월 15일에 진행된 라이브 코드 리뷰에서 이 문제에 대한 논의가 필요하다는 의견이 있어, 이를 이슈로 등록하게 되었습니다.
아래의 관점 외에도 추가적으로 제시할 의견이 있다면 함께 논의해보면 좋겠습니다.

  • 관점 A : 메서드 명을 그대로 사용하고 REMOVED 필터를 사용하지 않습니다.
    • REMOVED 상태인 게시물을 DB에서 포함하여 조회하면, 사용자에게 해당 게시물이 삭제되었다는 정보를 제공할 수 있습니다.
  • 관점 B : 메서드 명에 REMOVED 상태를 제외한다고 명시하고 REMOVED 필터를 사용합니다.
    • REMOVED 상태인 게시물을 DB에서 제외하고 조회하면, 사용자에게 해당 게시물이 삭제되었다는 정보를 제공이 어렵습니다.
      • 게시물이 실제로 존재하지 않는 경우와 존재했던 게시물이 삭제된 경우는 명확한 차이가 있습니다.
      • 사용자의 실수나 악의적인 게시글 ID 입력에 대한 적절한 처리가 필요합니다. 이러한 처리는 사실상 비효율적이며 적합하지 않다고 생각합니다.

부연 설명

관점 A : 메서드 명을 그대로 사용하고 REMOVED 필터를 사용하지 않습니다.

    @Override
    public Optional<Board> findById(Long id) {
        return boardEntityMapper.toOptionalDomain(
                getQuerydsl().createQuery()
                        .select(boardEntity)
                        .from(boardEntity)
                        .where(
                                boardEntity.id.eq(id)
                        ).fetchOne()
        );
    }

관점 B : 메서드 명에 REMOVED 상태를 제외한다고 명시하고 REMOVED 필터를 사용합니다.

    @Override
    public Optional<Board> findByIdExcludingRemoved (Long id) {
        return boardEntityMapper.toOptionalDomain(
                getQuerydsl().createQuery()
                        .select(boardEntity)
                        .from(boardEntity)
                        .where(
                                boardEntity.id.eq(id),
                                boardEntity.status.ne(BoardStatus.REMOVED)
                        ).fetchOne()
        );
    }

Metadata

Metadata

Assignees

Labels

type: discussion질문 또는 논의. A question or discussion

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions