[Phase 2] PR 2-1: Blog 모델 (DB 레이어)

ID: c2c0da1d-9ccd-4358-a69a-f341c16b0b48

높음 완료

## 개요
Blog::Post, Category, Comment, Like 4개 모델 + 마이그레이션

## 스키마
- blog_categories: name, slug(unique), description
- blog_posts: author_id(FK→users), category_id(FK), title, slug(unique), content(text/HTML), excerpt, description, keywords, status(enum: draft/published/archived), view_count, published_at, featured_image(ActiveStorage)
- blog_comments: post_id(FK), author_id(FK→users), parent_id(self-ref 1단계), content
- blog_likes: post_id(FK), user_id(FK), unique(post_id, user_id)

## 완료 기준
- 마이그레이션 성공 + 롤백 + 재마이그레이션
- 모델 유효성 검사 테스트 통과
- slug 자동 생성, enum 동작, 연관관계 동작
- featured_image ActiveStorage 첨부

## 의존성
PR 1-1 (서브도메인 라우팅)

첨부 이미지

이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)

JPEG, PNG, GIF, WebP / 최대 10MB

담당자: 팀리드
생성일: 2026년 03월 11일 11:39

활동 로그

  • 팀리드 리뷰 완료 - 승인 [Phase 2] PR 2-1 + [Phase 4] PR 4-1

    2026년 03월 11일 13:07:02

    상세 보기

    ## 리뷰 결과
    - 상태: 승인
    - 테스트: 98 runs, 147 assertions, 0 failures

    ## 코드 품질
    - 판정: 조건부 승인 (Critical 0, High 4, Medium 6)
    - High 이슈는 모두 향후 관련 PR에서 처리:
    - Sluggable concern 추출 → PR 2-2/3-1
    - slug 중복 suffix → PR 2-2/3-1
    - 복합 인덱스 [status, published_at] → PR 3-1
    - counter_cache (comments_count, likes_count) → PR 3-3

    ## 보안
    - 판정: PASS (Critical 0, High 0, Medium 2)
    - Brakeman: 경고 0건
    - 의존성: 취약 Gem 0개
    - Medium: comment content 길이 제한, materials_url 형식 검증 권장

    ## UX/UI
    - P0/P1 이슈 5건 수정 완료
    - default_scope 제거, 한글 slug fallback, Finish 레슨 추가, visible scope, inverse_of

  • 팀리드 상태 변경: 리뷰 → 완료

    2026년 03월 11일 13:06:49

  • 팀리드 팀 작업 완료 - Blog 모델 + Study 모델 병렬 구현

    2026년 03월 11일 12:48:17

    상세 보기

    ## 구현 결과
    - Blog 모델 4개: Category, Post, Comment, Like (마이그레이션 + 테스트 + fixtures)
    - Study 모델 3개: Course, Chapter, Lesson (마이그레이션 + 테스트 + fixtures + 시드)
    - 테스트: 98 runs, 147 assertions, 0 failures

    ## P0/P1 수정 완료
    - default_scope 제거 → has_many ordering 람다로 이동
    - 한글 slug fallback 추가 (Blog::Post, Category)
    - Finish 레슨 시드 추가
    - visible scope + published_at 자동설정
    - Blog 모델 inverse_of 추가

    ## UX/UI 검토 결과
    - 모델 구조가 향후 UI 구현을 잘 지원
    - P2/P3 이슈는 컨트롤러 구현 시 함께 처리 예정

    ## 테스트/보안 검증 결과
    - brakeman: 경고 0건
    - FK/인덱스 모두 적절
    - bin/ci rubocop 실패는 기존 코드 문제 (새 코드는 OK)

  • 팀리드 상태 변경: 진행 중 → 리뷰

    2026년 03월 11일 12:48:03

  • 팀리드 UX/QA 리뷰 완료 - P0/P1 수정 진행

    2026년 03월 11일 12:44:21

    상세 보기

    ## UX 리뷰 결과
    - 평가: 개선 필요 (Minor~Medium)
    - P0: default_scope 제거, 한글 slug fallback
    - P1: Finish 레슨 누락, visible scope, published_at 자동설정

    ## QA 검증 결과
    - bin/ci: rubocop 실패 (기존 코드 문제, 새 코드는 OK)
    - 테스트: 91 runs, 0 failures
    - brakeman: 경고 0건
    - 종합: 리뷰 진행 가능

    ## 수정 계획
    P0/P1 이슈 5건을 developer로 수정 후 완료 처리

  • 팀리드 위임: qa-verifier에게 '테스트 및 품질 검증 (Blog + Study 모델)' 작업 배정

    2026년 03월 11일 12:27:46

  • 팀리드 위임: ux-reviewer에게 'UX/UI 디자인 검토 (Blog + Study 모델)' 작업 배정

    2026년 03월 11일 12:27:43

  • 팀리드 위임: developer-1에게 'Blog 모델 4개 + 마이그레이션 구현 (TDD)' 작업 배정

    2026년 03월 11일 12:27:32

  • 팀리드 작업 시작 - Blog 모델 + Study 모델 병렬 진행

    2026년 03월 11일 12:27:21

    상세 보기

    ## 작업 계획
    - PR 2-1 (Blog 모델)과 PR 4-1 (Study 모델) 병렬 구현
    - developer-1: Blog::Post, Category, Comment, Like 모델 + 마이그레이션
    - developer-2: Study::Course, Chapter, Lesson 모델 + 시드 데이터
    - 완료 후 UX/UI 리뷰 + QA 검증

    ## 접근 방식
    - 각 developer가 독립적인 테이블/모델을 담당하여 파일 충돌 없음
    - TDD 방식: 테스트 먼저 → 구현

  • 팀리드 티켓 클레임 완료

    2026년 03월 11일 12:27:11