프로젝트

일반

사용자정보

Actions

기능 #281

완료됨
김정 김정

칸반보드 플러그인 개발 (redmine_kanban v1.0 MVP)

기능 #281: 칸반보드 플러그인 개발 (redmine_kanban v1.0 MVP)

김 정식이(가) 29일 전에 추가함. 28일 전에 수정됨.

상태:
완료
우선순위:
보통
담당자:
시작일:
2026-04-18
완료일:
진척도:

100%

추정시간:

설명

개요

Redmine 이슈를 칸반 보드로 시각화하고 드래그앤드롭으로 상태를 변경할 수 있는 플러그인 개발.

  • 플러그인 리포지토리: 로컬 /Users/joungsik/Workspace/joungsik/redmine_kanban (완료 후 GitHub public 공개 예정)
  • 통합 방식: 로컬 심볼릭 링크로 현 redmine 프로젝트 plugins/redmine_kanban에 연결
  • 설계서: 플러그인 리포 docs/plans/2026-04-18-redmine-kanban-design.md
  • 계획서: 플러그인 리포 docs/plans/2026-04-18-implementation-plan.md (승인 완료)

MVP 범위 (v1.0)

  • 프로젝트당 보드 1개
  • IssueStatus 직접 매핑 (별도 칸반 상태 테이블 없음)
  • IssueQuery 기반 이슈 소스 (글로벌 쿼리 사용 시 보드 프로젝트로 스코프 강제)
  • 드래그로 즉시 상태 변경 (워크플로/권한 기존 체계 활용)
  • 카드 세로 순서 수동 저장
  • 종료 상태 통합 '완료' 컬럼 + 최근 N일 노출 (프로젝트별 설정)
  • My Page 블록 '내 이슈 칸반': 담당 열린 이슈를 모든 활성 상태 컬럼에 표시 + 드래그로 상태 변경

주요 결정 사항 요약

영역 결정
컬럼 구성 IssueStatus 직접 매핑
이슈 소스 IssueQuery 재사용 (보드 프로젝트로 스코프)
카드 이동 즉시 저장, 실패 시 원위치 복구
카드 표시 번호+제목, 담당자, 우선순위, 트래커, 시작일, 마감일
접근 프로젝트 메뉴 탭 + My Page 블록
권한 view_kanban, manage_kanban + 기존 edit_issues
보드 갯수 프로젝트당 1개
카드 정렬 수동 드래그 위치 저장
종료 상태 통합 '완료' 컬럼 + 최근 N일
실시간 동기화 없음 (lock_version 충돌만 감지)

구현 Task 진행 현황

  • Task 1: 플러그인 스켈레톤 (init.rb, 라우트, 권한, 메뉴, placeholder)
  • Task 2: 데이터 모델 + 마이그레이션 (KanbanBoard, KanbanCardPosition) + 단위 테스트
  • Task 3: 심볼릭 링크 설정 + 로컬 통합 확인
  • Task 4: 보드 조회 화면 (show) + 카드 렌더링 + 기능 테스트
  • Task 5: 보드 설정 화면 (edit/update/destroy) + i18n
  • Task 6: 카드 이동 API (KanbanCardsController#move) + 워크플로/낙관적 잠금
  • Task 7: 프론트엔드 (Stimulus + SortableJS via importmap CDN)
  • Task 8: 스타일 (CSS + Open Color 변수로 라이트/다크 테마 대응)
  • Task 9: 시스템 테스트 (Capybara + Selenium, 드래그는 Stimulus 컨트롤러 직접 호출 방식)
  • Task 10: 릴리즈 준비 (README, CHANGELOG)
  • Task 12: 설정 페이지 버튼 컨벤션 정리 (submit_tag + sprite_icon cancel + delete_link)
  • Task 13: My Page '내 이슈 칸반' 블록 (모든 활성 상태 컬럼 + 드래그 상태 변경)
  • Task 11: GitHub public 리포 푸시

구현 후 수정된 버그

  • 칸반 설정 페이지의 라벨 중복 렌더링
  • 칸반 설정 페이지의 '취소/삭제'가 버튼이 아니라 UI가 어색하던 문제
  • My Page '내 이슈 칸반' 블록 레이블이 영문으로 표시되던 문제
  • My Page 미니 칸반에서 이슈가 있는 상태 컬럼만 렌더링되어 드래그가 불가능하던 문제
  • 이동 API가 보드 존재를 강제해 My Page 드래그가 404로 실패하던 문제
  • 글로벌 쿼리(project_id=nil)를 소스로 사용할 때 프로젝트 칸반 보드에 타 프로젝트 이슈가 섞여 표시되던 문제

테스트 체크리스트

  • 단위 테스트: 모델 + 프레젠터 케이스 전부 PASS
  • 기능 테스트: 컨트롤러 PASS
  • 시스템 테스트: 드래그 시나리오 PASS (프로젝트 보드 + My Page 블록)
  • RuboCop: 경고 0
  • Stylelint: 경고 0
  • 수동: 라이트/다크 테마 각각 보드 렌더 확인
  • 수동: view_kanban만 있는 사용자 → 보드 조회 가능, 설정 접근 403
  • 수동: 권한 없는 사용자 카드 이동 → 403 복구
  • 수동: 워크플로 불허 상태 이동 → 422 복구
  • 수동: 비공개 프로젝트에서 비멤버 접근 → 차단

해소된 열린 질문

  • Stimulus 컨트롤러 importmap 로드 방식: Redmine 코어 application.js에서 window.Stimulus를 노출하므로 그대로 사용 가능
  • HTML5 DnD Selenium 시뮬레이션: SortableJS 드래그가 합성 이벤트로 불안정하여, 테스트에서는 Stimulus 컨트롤러의 onEndexecute_async_script로 직접 호출하는 방식 채택
  • serialize + JSON 코덱 Rails 8.0 호환성: 단위 테스트 통과로 확인

관련 링크

  • 로컬 플러그인 리포: /Users/joungsik/Workspace/joungsik/redmine_kanban
  • 현 redmine 프로젝트: /Users/joungsik/Workspace/joungsik/redmine
  • 플러그인 리포 최근 커밋: ed005f1 (fix: 프로젝트별 칸반 보드가 타 프로젝트 이슈를 포함하는 문제 수정)
Actions

내보내기 PDF Atom