게시판 기능 설계 - 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)"
}
}
- 일단 단순하게 정의된 게시판 도메인이다.
- 현재는 복잡한 비즈니스 로직은 설계되지 않았다. (생성 기능, 복원기능만 존재)
- 사실 대부분의 로직은 게시판 그 자체가 중심이라기보다 게시판에서 파생된 기능들이기 때문에 게시판 자체가 가진 비즈니스 로직은 그렇게 많지 않다.