게시판 공통 데이터와 콘텐츠 유형별 확장 테이블 설계 방향

잘나스 · 2026-09-19 07:32:28

1. 검토 배경

ZALNAS에서 성격이 서로 다른 여러 게시판을 하나의 board_data 테이블로 관리하면 특정 게시판에서만 사용하는 컬럼이 계속 늘어나게 됩니다. 그 결과 대부분의 게시물에서는 불필요한 컬럼이 비어 있고, 새로운 콘텐츠 유형을 추가할 때마다 공용 게시판 구조와 기존 기능에 영향을 줄 가능성이 커집니다.

이를 해결하기 위해 게시물의 공통 정보는 기본 테이블에 유지하고, 게시판 또는 콘텐츠의 성격에 따른 전문 정보는 별도의 확장 테이블로 분리하는 구조를 적용하는 것이 적절합니다.

2. 권장 결론

공통 게시물 테이블 + 콘텐츠 유형별 확장 테이블 구조를 장기 기준으로 사용합니다.

다만 현재 운영 중인 board_data를 즉시 축소하거나 교체하지 않고, 보드게임·이벤트처럼 새롭게 연계되는 콘텐츠부터 확장 구조를 적용한 뒤 기존 게시판을 점진적으로 전환합니다.

3. 전체 구조

board_data                     게시물 공통 정보
├─ board_post_seo              SEO 정보
├─ boardgame_post_details      보드게임 게시물 전용 정보
├─ event_post_details          행사·공연 게시물 전용 정보
├─ board_post_tags             태그 연결
├─ board_post_media            이미지·첨부파일
└─ content_board_links         포스팅봇 원본과 게시물 연결

4. board_data에 둘 공통 항목

board_data에는 대부분의 게시판에서 공통으로 사용하는 최소 항목을 둡니다.

  • 게시물 번호와 게시판 ID
  • 제목과 본문
  • 작성자 식별값과 표시 이름
  • 발행 상태: draft, review, published, archived
  • 공개 여부와 공지 여부
  • 작성·수정·발행·삭제 일시

5. 확장 테이블에 둘 전문 항목

  • 보드게임: 디자이너, 출시연도, 플레이 인원, 소요시간, 난이도, 테마 등
  • 이벤트: 행사 기간, 장소, 지역, 주최자, 예매 정보 등
  • SEO: 슬러그, 메타 제목, 메타 설명, 대표 이미지, canonical URL 등
  • 판매 정보: 판매처, 판매가격, 통화, 가격 확인일 등
  • 미디어: 대표 이미지, 본문 이미지, 첨부파일과 표시 순서 등

6. 확장 테이블의 구분 기준

확장 테이블은 개별 게시판 ID마다 만드는 것이 아니라 콘텐츠 유형 또는 업무 도메인별로 만듭니다. 보드게임 게시판이 여러 개 생기더라도 보드게임 전문 정보는 하나의 구조를 공동으로 사용해야 테이블 증가와 중복 개발을 방지할 수 있습니다.

7. 보드게임 데이터의 특별한 구분

보드게임의 제작자, 출시연도, 인원, 시간, 난이도 같은 정보는 단순한 게시물 부가정보가 아니라 보드게임 자체를 설명하는 구조화된 정보입니다. 따라서 boardgame_games를 보드게임 정보의 원본 도메인 테이블로 유지하고, 리뷰·전략·가이드·게임 소개 게시물이 해당 게임을 참조하는 방식이 적절합니다.

boardgame_games
      │
      ├─ 게임 소개 게시물
      ├─ 리뷰 게시물
      ├─ 전략 게시물
      └─ 가이드 게시물

8. 중앙 콘텐츠 플랫폼과 게시판의 관계

  • content_items / content_versions: 포스팅봇이 생성한 원본 콘텐츠와 변경 버전 관리
  • boardgame_games: 보드게임 자체의 구조화된 정보
  • board_data: ZALNAS 사용자 사이트에서 실제로 표시되는 게시물
  • content_board_links: 원본 콘텐츠 UUID·버전과 board_data의 게시물 번호 연결
  • 유형별 확장 테이블: 해당 콘텐츠에만 필요한 추가 속성 저장

9. 포스팅봇 게시 절차

포스팅봇 초안 생성
        ↓
content_items / content_versions 저장
        ↓
검토 및 발행 승인
        ↓
board_data에 공통 게시물 생성
        ↓
유형별 확장 테이블 저장
        ↓
content_board_links에 원본-게시물 연결

공통 게시물, 확장 정보, 원본 연결 정보는 하나의 트랜잭션으로 저장해 일부 데이터만 등록되는 상황을 방지합니다.

10. 피해야 할 구조

  • 게시판 ID마다 별도의 확장 테이블을 생성하는 방식
  • 모든 추가 정보를 field_name / field_value로 저장하는 범용 EAV 방식
  • 검색·정렬해야 하는 전문 필드까지 하나의 거대한 JSON에 저장하는 방식
  • 현재 board_data를 한 번에 교체하거나 기존 컬럼을 즉시 삭제하는 방식

EAV와 대형 JSON 구조는 초기에는 유연해 보이지만 자료형 검증, 검색, 정렬, 인덱스 설계와 데이터 정합성 유지가 어려워집니다. JSON은 검색 대상이 아닌 비정형 부가정보에만 제한적으로 사용합니다.

11. 단계적 적용안

  1. 기존 board_data와 기존 게시판 동작은 그대로 유지합니다.
  2. 보드게임·이벤트 연계 게시판부터 원본 연결 테이블과 유형별 확장 테이블을 적용합니다.
  3. 새 게시물 저장은 공통 서비스 계층을 통해 board_data와 확장 테이블을 함께 처리합니다.
  4. 기존 게시판의 직접 DB 접근을 점진적으로 공통 서비스로 전환합니다.
  5. 모든 스킨과 서비스에서 사용하지 않는 것이 확인된 기존 컬럼만 마지막 단계에서 정리합니다.

12. 최종 방향

장기적으로는 board_data를 공통 게시물 표현 계층으로 두고, 전문 데이터는 도메인 테이블과 유형별 확장 테이블에서 관리합니다. 포스팅봇의 원본은 중앙 콘텐츠 플랫폼에서 버전과 상태를 관리하고, 게시판에는 발행 결과를 연결합니다.

운영 안정성을 위해 전체 게시판을 동시에 개편하지 않고, 1차 보드게임과 2차 이벤트 연계 기능부터 신규 구조를 적용한 후 검증된 패턴을 기존 게시판으로 확대합니다.