-
Notifications
You must be signed in to change notification settings - Fork 3
[feature] 네이버 맵 클릭 이벤트 트래킹 및 누락 이벤트 전반 추가, /jira-task 대화형 커맨드 신규 생성 #1563
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
seongwon030
merged 14 commits into
develop-fe
from
feature/#1562-add-naver-map-event-tracking-MOA-868
May 18, 2026
Merged
Changes from all commits
Commits
Show all changes
14 commits
Select commit
Hold shift + click to select a range
97ae008
feat(club-detail): 네이버 맵 클릭 Mixpanel 이벤트 트래킹 추가
seongwon030 11e8b8f
chore(scripts): Jira-GitHub 이슈 자동화 스크립트 추가
seongwon030 8ad3284
feat(tracking): 누락된 Mixpanel 이벤트 트래킹 추가
seongwon030 0d82196
chore(commands): 이벤트 트래킹 감사 Claude 커맨드 추가
seongwon030 17a58fc
chore(commands): PRD 기반 하위 작업 일괄 생성 Claude 커맨드 추가
seongwon030 87aa639
feat(tooling): jira-task.sh 담당자 자동 지정 및 복수 라벨 지원
suhyun113 2328a18
chore(commands): /jira-task 대화형 Claude 커맨드 추가
suhyun113 9002c3c
fix(commands): /jira-task 브랜치명 형식을 GitHub Actions 규칙에 맞게 수정
suhyun113 f886fd7
feat(tooling): /jira-task 마감일 입력 및 브랜치명 형식 수정
suhyun113 9843ec4
fix(tooling): jq 오류 메시지 OS별 분기 및 payload 파일 전달로 Windows 호환성 개선
suhyun113 9f6b491
feat(tooling): 활성 스프린트 자동 배치 및 담당자 자동 지정
suhyun113 e490090
feat(tooling): 스토리 생성 시 에픽(상위항목) 자동 지정 지원
suhyun113 6cdc110
Merge pull request #1569 from Moadong/refactor/#1568-jira-story-scrip…
suhyun113 fcdaddd
fix(components): setState updater 내 트래킹 사이드 이펙트 분리 및 이벤트명 수정
seongwon030 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,87 @@ | ||
| # 이벤트 트래킹 감사 (Event Tracking Audit) | ||
|
|
||
| `src/constants/eventName.ts`의 정의와 실제 코드베이스 사용 현황을 비교해 Mixpanel 트래킹 누락을 점검합니다. | ||
|
|
||
| ## 분석 순서 | ||
|
|
||
| 아래 bash 명령을 순서대로 실행하고 결과를 수집하세요. | ||
|
|
||
| ### Step 1: 정의된 이벤트 목록 추출 | ||
|
|
||
| ```bash | ||
| grep -E "^\s+[A-Z_]+:" src/constants/eventName.ts | ||
| ``` | ||
|
|
||
| `USER_EVENT` 안의 키만 수집합니다 (`ADMIN_EVENT`, `PAGE_VIEW`는 제외). | ||
|
|
||
| ### Step 2: 실제 trackEvent 호출 현황 | ||
|
|
||
| ```bash | ||
| grep -rn "trackEvent(USER_EVENT\." src/ --include="*.tsx" --include="*.ts" | ||
| ``` | ||
|
|
||
| 어떤 파일의 몇 번째 줄에서 어떤 이벤트를 호출하는지 수집합니다. | ||
|
|
||
| ### Step 3: 트래킹 미적용 인터랙션 탐지 | ||
|
|
||
| ```bash | ||
| grep -rn "onClick\|onSubmit" src/pages/ src/components/ --include="*.tsx" -l | ||
| ``` | ||
|
|
||
| 위 파일 목록 중 `trackEvent`를 import하는 파일: | ||
|
|
||
| ```bash | ||
| grep -rln "trackEvent\|useMixpanelTrack" src/pages/ src/components/ --include="*.tsx" | ||
| ``` | ||
|
|
||
| 두 목록의 **교집합 파일** — 즉, onClick/onSubmit이 있고 trackEvent도 쓰는 파일 — 에서 trackEvent 없이 onClick만 있는 핸들러를 탐지합니다: | ||
|
|
||
| ```bash | ||
| grep -n "onClick\|onSubmit" <파일경로> | ||
| ``` | ||
|
|
||
| 각 핸들러 주변 5줄을 읽어 trackEvent 호출이 없으면 누락 의심으로 분류합니다. | ||
|
|
||
| ### Step 4: 미사용 이벤트 탐지 | ||
|
|
||
| Step 1에서 수집한 USER_EVENT 키 각각에 대해 Step 2 결과에서 사용 여부를 확인합니다. | ||
| 한 번도 등장하지 않는 키는 미사용 이벤트입니다. | ||
|
|
||
| --- | ||
|
|
||
| ## 출력 형식 | ||
|
|
||
| 분석 결과를 아래 3개 표로 요약합니다. | ||
|
|
||
| ### ✅ 트래킹 중인 이벤트 | ||
|
|
||
| | 이벤트명 | 사용 파일 | | ||
| | ------------------ | -------------------- | | ||
| | `CLUB_MAP_CLICKED` | `ClubDetailPage.tsx` | | ||
| | … | … | | ||
|
|
||
| ### ⚠️ 트래킹 누락 의심 인터랙션 | ||
|
|
||
| onClick/onSubmit이 있으나 trackEvent 호출이 없는 핸들러. **사용자 의도가 담긴 주요 액션**(버튼 클릭, 폼 제출 등)에 한해 나열하고, 단순 상태 토글이나 내부 UI 제어는 제외합니다. | ||
|
|
||
| | 파일 | 핸들러 | 비고 | | ||
| | ------------------------ | ------------ | -------------- | | ||
| | `ClubDetailPage.tsx:157` | `onMapClick` | 지도 모달 열기 | | ||
| | … | … | … | | ||
|
|
||
| ### 🗑️ 정의만 되고 미사용 이벤트 (USER_EVENT 기준) | ||
|
|
||
| 코드 어디서도 `trackEvent`로 호출되지 않는 이벤트. | ||
|
|
||
| | 키 | 이벤트명 | | ||
| | ------------ | -------------- | | ||
| | `SOME_EVENT` | `'Some Event'` | | ||
| | … | … | | ||
|
|
||
| --- | ||
|
|
||
| ## 주의사항 | ||
|
|
||
| - `ADMIN_EVENT`와 `PAGE_VIEW`는 별도 트래킹 체계(useTrackPageView 등)를 사용하므로 이번 감사 대상에서 제외합니다. | ||
| - 누락 의심은 **사용자 행동 추적 가치가 있는** 인터랙션에 집중합니다. 드롭다운 토글, 입력 포커스 등 세부 UI 이벤트는 판단이 필요한 경우 별도로 언급합니다. | ||
| - 결과 출력 후 실제 추가가 필요한 항목이 있으면 이어서 작업할지 물어봅니다. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,88 @@ | ||
| Jira 스토리 키를 기반으로 GitHub 이슈(하위 작업 + 브랜치)를 자동 생성합니다. | ||
|
|
||
| ## 흐름 | ||
|
|
||
| 1. **상위 스토리 키**: "상위 Jira 스토리 키를 입력해주세요. (예: MOA-874)" | ||
|
|
||
| 2. **분기 브랜치**: "분기할 브랜치를 선택해주세요. (기본값: develop-fe)" — `develop-fe` 또는 `develop/be` | ||
|
|
||
| 3. **마감일**: "마감일을 입력해주세요. (없으면 Enter → 오늘 날짜, 예: 2026-05-25)" — YYYY-MM-DD 형식, 미입력 시 오늘 날짜 자동 설정 | ||
|
|
||
| 4. 입력받은 키로 **Jira API를 호출**하여 스토리 정보를 자동 조회합니다: | ||
|
|
||
| ```bash | ||
| source .env 2>/dev/null | ||
| jq -n '{"jql":"key=<스토리키>","fields":["summary","description"]}' > /tmp/jql.json | ||
| curl -s -X POST -u "${JIRA_EMAIL}:${JIRA_API_TOKEN}" \ | ||
| -H "Content-Type: application/json" \ | ||
| -d @/tmp/jql.json \ | ||
| "https://${JIRA_HOST}/rest/api/3/search/jql" | ||
| ``` | ||
|
|
||
| 5. 조회된 정보를 기반으로 **자동 생성**합니다: | ||
| - **제목**: Jira 스토리 제목과 동일하게 사용 | ||
| - **담당자**: git config user.name으로 자동 설정 | ||
| - **브랜치명**: 라벨에 맞는 접두사 + 제목의 핵심 키워드를 영문 kebab-case로 변환하여 `<접두사>/<설명>` 형식으로 생성. GitHub Actions가 이슈번호와 MOA 키를 자동으로 붙여줌 | ||
| - **태스크(체크리스트)**: 인수 조건(description에서 "✅ 인수 조건" 이후 텍스트)을 분석하여 `- [ ] 항목` 형식으로 자동 생성. 인수 조건이 없으면 `- [ ] Task1` 기본값 사용 | ||
| - **라벨**: 제목과 설명을 분석하여 가장 적절한 GitHub 라벨을 자동 선택 | ||
|
|
||
| 6. 자동 생성된 내용을 **사용자에게 보여주고 확인**받습니다: | ||
|
|
||
| ``` | ||
| 📋 자동 생성 결과: | ||
| 제목: Jira 스토리 생성 스크립트 개선 (Windows 호환성, 자동 스프린트/담당자/에픽 지정) | ||
| 담당자: suhyun113 | ||
| 상위 스토리: MOA-874 | ||
| 브랜치명: refactor/jira-story-script-improve | ||
| 분기 브랜치: develop-fe | ||
| 라벨: 🔨 Refactor | ||
| 마감일: 2026-05-18 | ||
| 태스크: | ||
| - [ ] jq 미설치 시 OS별 안내 메시지 출력 | ||
| - [ ] Windows에서 JSON payload 정상 전달 | ||
| ... | ||
|
|
||
| 이대로 생성할까요? (수정할 항목이 있으면 알려주세요) | ||
| ``` | ||
|
|
||
| 6. 확인 후 실행합니다: | ||
|
|
||
| ```bash | ||
| ./scripts/jira-task.sh "제목" "담당자" "MOA-xxx" "브랜치명" "분기브랜치" "" "태스크" "라벨" "마감일" | ||
| ``` | ||
|
|
||
| ## 규칙 | ||
|
|
||
| - 제목은 항상 Jira 스토리 제목과 동일하게 사용합니다. | ||
| - 담당자는 `git config user.name`의 값을 사용합니다. 유효한 담당자 목록: seongwon030, oesnuj, Zepelown, PororoAndFriends, lepitaaar, suhyun113, alsdddk, yw6938, seongje973 | ||
| - 브랜치명은 `<접두사>/<설명>` 형식으로 생성합니다. GitHub Actions가 이슈번호(#xxx)와 Jira 키(MOA-xxx)를 자동으로 붙여줍니다. | ||
| - 접두사는 작업 성격 라벨에 따라 결정: | ||
| - `✨ Feature` → `feature/` | ||
| - `🛠Fix`, `🐞 Bug` → `fix/` | ||
| - `🔨 Refactor` → `refactor/` | ||
| - `🎨 Design` → `design/` | ||
| - `⚙ Setting`, `📦 CI/CD` → `chore/` | ||
| - `📃 Docs` → `docs/` | ||
| - `✅ Test` → `test/` | ||
| - `🚁AI` → `feature/` | ||
| - 설명은 제목의 핵심 키워드를 영문 kebab-case로 변환합니다. | ||
| - 태스크는 인수 조건의 각 항목을 `- [ ]` 체크리스트로 변환합니다. 인수 조건이 여러 문장이면 각각 별도 항목으로 분리합니다. | ||
| - 라벨은 **작업 성격 라벨 + 영역 라벨** 조합으로 지정합니다. `--label` 플래그를 여러 번 사용하여 복수 라벨을 전달합니다. | ||
| - **영역 라벨** (분기 브랜치에 따라 자동 결정): | ||
| - `develop-fe` → `💻 FE` | ||
| - `develop/be` → `💾 BE` | ||
| - **작업 성격 라벨** (제목과 설명을 분석하여 선택, 기본값 `✨ Feature`): | ||
| - `✨ Feature` — 새로운 기능 개발 | ||
| - `🐞 Bug` — 버그 수정 | ||
| - `🛠Fix` — 기능이 의도대로 동작하지 않는 수정 | ||
| - `🔨 Refactor` — 코드 리팩토링, 구조 개선 | ||
| - `🎨 Design` — 마크업, 스타일링 | ||
| - `📬 API` — 서버 API 통신 작업 | ||
| - `⚙ Setting` — 개발 환경 세팅 | ||
| - `📃 Docs` — 문서 작성 및 수정 | ||
| - `✅ Test` — 테스트 관련 | ||
| - `📦 CI/CD` — CI/CD 관련 | ||
| - `🚁AI` — Claude, Codex 활용 | ||
| - 분기 브랜치는 사용자에게 직접 물어봅니다. 기본값은 `develop-fe`입니다. | ||
| - 실행 후 GitHub 이슈 URL을 출력합니다. | ||
| - GitHub Actions(common-jira-create.yml)이 자동으로 Jira 하위 작업과 브랜치를 생성합니다. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,104 @@ | ||
| # PRD — 기능 분해 및 이슈 일괄 생성 | ||
|
|
||
| 기능 요구사항을 대화형으로 수집하고, 하위 작업으로 분해한 뒤 | ||
| Jira 스토리와 GitHub 이슈(하위 작업 + 브랜치)를 한 번에 생성합니다. | ||
|
|
||
| **전체 흐름**: [인터뷰] → [하위 작업 분해 & 확인] → [스토리 생성] → [이슈 일괄 생성] | ||
|
|
||
| --- | ||
|
|
||
| ## Phase 1: 기능 인터뷰 | ||
|
|
||
| 아래 순서로 **한 번에 하나씩** 질문하세요: | ||
|
|
||
| 1. **기능 제목**: "어떤 기능을 개발하나요? (예: 동아리 즐겨찾기 기능)" | ||
| 2. **배경 및 목적**: "왜 필요한가요? 어떤 문제를 해결하나요? (없으면 Enter)" — 선택사항 | ||
| 3. **주요 요구사항**: "핵심 요구사항을 설명해주세요. UI/기능/API 등 자유롭게 기술해주세요." | ||
| 4. **담당자**: "담당자를 선택해주세요. (모든 하위 작업에 공통 적용)" | ||
| - 선택지: seongwon030 / oesnuj / Zepelown / PororoAndFriends / lepitaaar / suhyun113 / alsdddk / yw6938 / seongje973 | ||
| 5. **분기 브랜치**: "분기할 브랜치를 입력해주세요. (기본값: develop-fe)" — 선택사항 | ||
|
|
||
| --- | ||
|
|
||
| ## Phase 2: 하위 작업 분해 | ||
|
|
||
| 수집한 요구사항을 분석해 **3~6개의 하위 작업**으로 분해하세요. | ||
|
|
||
| ### 분해 기준 | ||
|
|
||
| - 독립적으로 개발 가능하고 하나의 PR이 될 수 있는 크기 | ||
| - 역할/레이어 기준으로 나눔: UI 컴포넌트, API 연동, 상태관리, 스타일링, 테스트 등 | ||
| - 의존 관계가 있으면 번호 순서로 암묵적으로 표현 | ||
|
|
||
| ### 각 하위 작업에 포함할 항목 | ||
|
|
||
| - **제목**: 간결하게 (예: "즐겨찾기 버튼 UI 구현") | ||
| - **브랜치명**: `feature/동사-명사-kebab-case` 형식, 영어만 사용 | ||
| - **태스크**: 이 하위 작업에서 해야 할 일 체크리스트 (1~3개, `- [ ] ...` 형식) | ||
|
|
||
| ### 출력 형식 | ||
|
|
||
| 분해 결과를 표로 보여주고 사용자 확인을 받으세요: | ||
|
|
||
| ``` | ||
| | # | 제목 | 브랜치명 | 태스크 | | ||
| |---|---|---|---| | ||
| | 1 | ... | feature/... | - [ ] ... | | ||
| | 2 | ... | feature/... | - [ ] ... | | ||
| ``` | ||
|
seongwon030 marked this conversation as resolved.
|
||
|
|
||
| "이 구성으로 진행할까요? 수정이 필요하면 말씀해주세요." | ||
|
|
||
| - 수정 요청이 있으면 반영 후 표를 다시 출력하고 재확인 | ||
| - 확인 완료 후 Phase 3 진행 | ||
|
|
||
| --- | ||
|
|
||
| ## Phase 3: 실행 | ||
|
|
||
| ### Step 1 — Jira 스토리 생성 | ||
|
|
||
| ```bash | ||
| ./scripts/jira-story.sh "기능 제목" "배경 및 목적" "주요 요구사항" | ||
| ``` | ||
|
|
||
| - 설명/인수조건 없으면 빈 문자열("")로 전달 | ||
| - 출력에서 `MOA-xxx` 형식의 스토리 키를 반드시 추출해 Step 2에 사용 | ||
|
|
||
| ### Step 2 — GitHub 이슈 순차 생성 | ||
|
|
||
| 하위 작업 목록을 **순서대로 하나씩** 실행합니다 (병렬 실행 금지): | ||
|
|
||
| ```bash | ||
| ./scripts/jira-task.sh "하위작업 제목" "담당자" "MOA-xxx" "브랜치명" "분기브랜치" "" "태스크 체크리스트" | ||
| ``` | ||
|
|
||
| - `MOA-xxx`는 Step 1에서 추출한 스토리 키 | ||
| - 태스크 체크리스트 여러 줄은 `\n`으로 연결: `"- [ ] Task1\n- [ ] Task2"` | ||
| - 각 실행 후 출력된 GitHub 이슈 URL을 수집 | ||
|
|
||
| --- | ||
|
|
||
| ## Phase 4: 완료 출력 | ||
|
|
||
| 모든 이슈 생성 후 아래 형식으로 결과를 출력하세요: | ||
|
|
||
| ``` | ||
| ✅ 스토리: MOA-xxx — https://...atlassian.net/browse/MOA-xxx | ||
|
|
||
| 📋 생성된 하위 작업 (총 N개): | ||
| 1. [하위작업 제목] → https://github.com/Moadong/moadong/issues/N | ||
| 2. [하위작업 제목] → https://github.com/Moadong/moadong/issues/N | ||
| ... | ||
|
|
||
| ⏳ GitHub Actions이 각 이슈마다 Jira 하위 작업과 브랜치를 자동 생성합니다. | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ## 주의사항 | ||
|
|
||
| - 하위 작업이 6개를 초과하면 유사한 것들의 병합을 제안하세요 | ||
| - 태스크 문자열에 쌍따옴표(`"`)가 포함되면 bash 오류 발생 → 홑따옴표 또는 제거 | ||
| - `JIRA_EMAIL`, `JIRA_API_TOKEN` 환경 변수 없으면 `jira-story.sh` 실행 전 안내 | ||
| - `gh auth status`로 GitHub CLI 로그인 상태 확인 필요 | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| # 동아리방 지도 클릭 이벤트 트래킹 | ||
|
|
||
| 동아리 상세 페이지에서 동아리방 위치 지도를 여는 두 가지 진입점에 Mixpanel 이벤트를 적용. | ||
|
|
||
| ## 진입점 | ||
|
|
||
| 1. **지도 카드** (`Styled.MapCard`) — 상세 페이지 좌측 섹션에 표시되는 네이버 맵 미리보기 클릭 | ||
| 2. **프로필 카드 내 지도 버튼** (`ClubProfileCard`의 `onMapClick`) — 프로필 카드에서 위치 버튼 클릭 | ||
|
|
||
| 두 진입점 모두 `CLUB_MAP_CLICKED` 단일 이벤트로 트래킹. "지도 열람" 행동 자체의 빈도 파악이 목적이므로 진입점을 구분하지 않음. | ||
|
|
||
| ## 관련 코드 | ||
|
|
||
| - `src/constants/eventName.ts` — `CLUB_MAP_CLICKED: 'Club Map Clicked'` 이벤트명 정의 | ||
| - `src/pages/ClubDetailPage/ClubDetailPage.tsx` — 두 진입점의 클릭 핸들러에 `trackEvent(USER_EVENT.CLUB_MAP_CLICKED)` 추가 |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.