게시판 기능 설계 - ttasjwi/board-system GitHub Wiki

개요

  • 우리 서비스의 이름은 "board-system(가칭)" 이다. 게시판을 중심으로 한 커뮤니티다.
    • 핵심 컨텐츠는 정확히는 게시판에 올려지는 게시글이다.
    • 다만 게시글이 존재하기 위해서는 게시판이 존재해야하므로, 그 기초가 되는 게시판 설계가 필요하다.
  • 사용자들은 누구나 게시판을 생성할 수 있고, 게시판을 생성한 사람은 게시판 매니저가 된다.
    • 향후 게시판 매니저는 자신의 업무를 보조할 부매니저들을 추가할 수 있는 것을 고려하고 있다.
  • 게시판은 다음 속성을 기본으로 가져야한다.
    • 슬러그 : 게시판의 주소가 있어야하는데 이를 식별하기 위한 영문자(중복 허용 x)
    • 이름 : 게시판의 이름(중복 허용 x)
    • 예) 웹페이지 -> https://board-system.com/b/animal -> 동물 게시판

데이터베이스 테이블 설계

CREATE TABLE IF NOT EXISTS boards(
    board_id    BIGINT             NOT NULL PRIMARY KEY,
    name        VARCHAR(30) UNIQUE NOT NULL,
    description VARCHAR(100)       NOT NULL,
    manager_id  BIGINT             NOT NULL,
    slug        VARCHAR(30) UNIQUE NOT NULL,
    created_at  DATETIME           NOT NULL
);
  • 테이블은 간단하게 위와 같이 생성할 수 있을 것이다.
    • board_id : 게시판
    • name : 이름 (유니크 제약)
    • description : 설명
    • manager_id : 매니저의 식별자
    • slug : 영어 주소 (유니크 제약)
    • created_at : 생성시점

도메인 엔티티 설계

package com.ttasjwi.board.system.board.domain.model

import com.ttasjwi.board.system.common.time.AppDateTime
import java.time.LocalDateTime

/**
 * 게시판
 */
class Board
internal constructor(
    val boardId: Long,
    name: String,
    description: String,
    managerId: Long,
    slug: String,
    val createdAt: AppDateTime,
) {

    var name: String = name
        private set

    var description: String = description
        private set

    var managerId: Long = managerId
        private set

    var slug: String = slug
        private set

    companion object {

        fun create(
            boardId: Long,
            name: String,
            description: String,
            managerId: Long,
            slug: String,
            currentTime: AppDateTime
        ): Board {
            return Board(
                boardId = boardId,
                name = name,
                description = description,
                managerId = managerId,
                slug = slug,
                createdAt = currentTime,
            )
        }

        fun restore(
            boardId: Long,
            name: String,
            description: String,
            managerId: Long,
            slug: String,
            createdAt: LocalDateTime,
        ): Board {
            return Board(
                boardId = boardId,
                name = name,
                description = description,
                managerId = managerId,
                slug = slug,
                createdAt = AppDateTime.from(createdAt),
            )
        }
    }

    override fun toString(): String {
        return "Board(boardId=$boardId, name=$name, description=$description, managerId=$managerId, slug=$slug, createdAt=$createdAt)"
    }
}
  • 일단 단순하게 정의된 게시판 도메인이다.
  • 현재는 복잡한 비즈니스 로직은 설계되지 않았다. (생성 기능, 복원기능만 존재)
    • 사실 대부분의 로직은 게시판 그 자체가 중심이라기보다 게시판에서 파생된 기능들이기 때문에 게시판 자체가 가진 비즈니스 로직은 그렇게 많지 않다.