Board Asset
Board Asset은 도큐먼트라이브러리(ARISAM)에 구현된 게시판의 기본 동작을 재사용 가능한 소스로 추출한 모듈이다. 이 디렉터리는 런타임 서비스나 중앙 데이터베이스가 아니라, 각 포털이 복사·적용한 뒤 자체 데이터 모델과 배포 정책에 맞게 소유하는 출발점이다.
제공 게시판 유형
| 유형 | 기본 목적 | 추가 동작 |
|---|---|---|
일반형(GENERAL) | 일반 업무 기록 | 댓글·첨부파일 |
공지형(NOTICE) | 공지사항 전달 | 상단 고정·읽기 중심 |
Q&A형(QNA) | 질문과 답변 | 답변 상태·비밀글 기반 확장 |
자료실형(ARCHIVE) | 파일 중심 자료 관리 | 첨부 버전 이력 |
갤러리형(GALLERY) | 이미지·콘텐츠 전시 | 썸네일 중심 레이아웃 |
getBoardVariant 또는 listBoardVariants로 유형을 선택할 수 있다. 유형은 화면을 완전히 별도 구현하는 복제본이 아니라, 공통 게시판 컴포넌트에 기본 라벨·페이지 크기·기능 플래그를 주입하는 프로파일이다. 포털은 프로파일을 그대로 사용하거나 필요한 기능만 확장한다.
제공 범위
| 영역 | 기본 제공 | 포털이 주입하거나 결정하는 부분 |
|---|---|---|
| 목록 | 검색, 상태 표시, 페이지 이동, 빈 상태, 첨부 개수 | 조회 API, 정렬·필터 확장, 목록 컬럼 |
| 상세 | 본문, 작성자·일시, 수정·삭제, 첨부 다운로드 | 상세 표현, 댓글·이력·승인 흐름 |
| 작성·수정 | 제목·본문 입력, 저장 상태, 오류 처리 | 저장 API, 리치 텍스트 편집기, 필드 확장 |
| 첨부파일 | 다중 선택, 개수·용량 검증, 기존 파일 표시, 제거·다운로드 슬롯 | 업로드 API, 저장소, MIME·보존·접근 정책 |
| 권한 | 읽기·작성·수정·삭제·업로드·다운로드·댓글 계약 | DirectoryService의 portalId 기반 권한 조회와 포털별 정책 |
적용 원칙
포털은 src/index.ts의 컴포넌트와 타입을 가져온 뒤 BoardDataSource와 BoardPermissionResolver를 구현한다. 모듈은 포털의 DB, 인증 세션, 저장소, API URL을 직접 참조하지 않는다. 따라서 적용이 완료되면 포털이 소스와 런타임을 독립적으로 소유한다.
import { BoardDetail, BoardEditor, BoardList } from "@/assets/board/src";
const permissions = {
resolve: (board, post) =>
directoryService.resolveBoardPermission({
portalId: "document-library",
boardId: board.id,
postId: post?.id,
}),
};
<BoardList
board={board}
dataSource={documentLibraryBoardDataSource}
permissions={permissions}
onCreate={() => setMode("create")}
onSelect={post => setSelectedPost(post)}
/>;ARISAM 적용 시 주의점
현재 ARISAM의 client/src/features/attachments/api/document-library-api.ts는 게시글 조회·생성·첨부 업로드·버전 업로드·다운로드 URL 발급을 한 API 어댑터로 묶고 있다. ASSET 모듈을 적용할 때 이 파일은 BoardDataSource 구현체로 유지하고, UI 컴포넌트에서 ARISAM 전용 API 경로를 직접 호출하지 않는다.
현재 ARISAM의 shared/upload-policy.ts와 서버 첨부파일 정책은 포털 보안 책임으로 남긴다. ASSET은 파일 개수·크기 검증의 기본값만 제공하므로 MIME 허용 목록, 파일명 정규화, 악성 파일 검사, 저장소 키 생성, 다운로드 권한과 보존 기간은 포털 서버에서 반드시 검증해야 한다.
DirectoryService 연동은 portalId 단위로 독립 적용한다. 권한 객체는 최소한 다음 기능을 포함해야 하며, 신규 포털은 중앙 계약 호환성 목록에 추가한 뒤 적용한다.
resolve({
portalId,
boardId,
postId,
action:
"read" | "create" | "edit" | "delete" | "upload" | "download" | "comment",
});버전 및 인계
ASSET 적용은 자동 런타임 의존성이 아니라 소스 인계다. 포털은 필요한 파일을 복사하거나 내부 패키지 경로로 가져온 뒤 자체 커밋으로 고정한다. ASSET 변경은 포털에 자동 반영되지 않으며, 포털 운영자가 변경 내용을 검토하고 선택적으로 이식한다.