Skip to content
Merged
Show file tree
Hide file tree
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 May 18, 2026
11e8b8f
chore(scripts): Jira-GitHub 이슈 자동화 스크립트 추가
seongwon030 May 18, 2026
8ad3284
feat(tracking): 누락된 Mixpanel 이벤트 트래킹 추가
seongwon030 May 18, 2026
0d82196
chore(commands): 이벤트 트래킹 감사 Claude 커맨드 추가
seongwon030 May 18, 2026
17a58fc
chore(commands): PRD 기반 하위 작업 일괄 생성 Claude 커맨드 추가
seongwon030 May 18, 2026
87aa639
feat(tooling): jira-task.sh 담당자 자동 지정 및 복수 라벨 지원
suhyun113 May 18, 2026
2328a18
chore(commands): /jira-task 대화형 Claude 커맨드 추가
suhyun113 May 18, 2026
9002c3c
fix(commands): /jira-task 브랜치명 형식을 GitHub Actions 규칙에 맞게 수정
suhyun113 May 18, 2026
f886fd7
feat(tooling): /jira-task 마감일 입력 및 브랜치명 형식 수정
suhyun113 May 18, 2026
9843ec4
fix(tooling): jq 오류 메시지 OS별 분기 및 payload 파일 전달로 Windows 호환성 개선
suhyun113 May 18, 2026
9f6b491
feat(tooling): 활성 스프린트 자동 배치 및 담당자 자동 지정
suhyun113 May 18, 2026
e490090
feat(tooling): 스토리 생성 시 에픽(상위항목) 자동 지정 지원
suhyun113 May 18, 2026
6cdc110
Merge pull request #1569 from Moadong/refactor/#1568-jira-story-scrip…
suhyun113 May 18, 2026
fcdaddd
fix(components): setState updater 내 트래킹 사이드 이펙트 분리 및 이벤트명 수정
seongwon030 May 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions frontend/.claude/commands/check-tracking.md
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 이벤트는 판단이 필요한 경우 별도로 언급합니다.
- 결과 출력 후 실제 추가가 필요한 항목이 있으면 이어서 작업할지 물어봅니다.
27 changes: 27 additions & 0 deletions frontend/.claude/commands/jira-story.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,30 @@ Jira 스토리를 대화형으로 생성합니다.
- 설명이나 인수 조건이 없으면 빈 문자열("")로 전달합니다.
- 실행 후 생성된 스토리 키와 링크를 그대로 출력합니다.
- `JIRA_EMAIL` 또는 `JIRA_API_TOKEN` 환경 변수가 없으면 설정 방법을 안내합니다.

---

## GitHub 이슈 (하위 작업 + 브랜치) 연동

스토리 생성 후 바로 이어서 물어보세요:

"GitHub 이슈(Jira 하위 작업 + 브랜치)도 함께 생성할까요?"

**Yes인 경우** 아래 순서로 추가 질문:

4. **담당자**: "담당자를 선택해주세요." — seongwon030 / oesnuj / Zepelown / PororoAndFriends / lepitaaar / suhyun113 / alsdddk / yw6938 / seongje973 중 선택
5. **브랜치명**: "브랜치명을 입력해주세요. (예: feature/add-login-page)"
6. **분기 브랜치**: "분기할 브랜치를 입력해주세요. (기본값: develop-fe)" — 선택사항
7. **태스크**: "체크리스트를 입력해주세요. (없으면 Enter)" — 선택사항, 기본값 `- [ ] Task1`

모든 입력이 완료되면:

```bash
./scripts/jira-task.sh "제목" "담당자" "MOA-xxx" "브랜치명" "분기브랜치" "" "태스크"
```

- `MOA-xxx`는 앞서 생성된 스토리 키를 그대로 사용합니다.
- 분기 브랜치 미입력 시 `develop-fe` 사용합니다.
- 태스크 미입력 시 `- [ ] Task1` 기본값 사용합니다.
- 실행 후 GitHub 이슈 URL을 출력합니다.
- GitHub Actions이 자동으로 Jira 하위 작업과 브랜치를 생성합니다.
88 changes: 88 additions & 0 deletions frontend/.claude/commands/jira-task.md
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. 자동 생성된 내용을 **사용자에게 보여주고 확인**받습니다:

```
Comment thread
seongwon030 marked this conversation as resolved.
📋 자동 생성 결과:
제목: 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 하위 작업과 브랜치를 생성합니다.
104 changes: 104 additions & 0 deletions frontend/.claude/commands/prd.md
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/... | - [ ] ... |
```
Comment thread
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 로그인 상태 확인 필요
15 changes: 15 additions & 0 deletions frontend/docs/features/club-detail/map-event-tracking.md
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)` 추가
Loading
Loading