Skip to content
Open
Changes from all commits
Commits
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
148 changes: 148 additions & 0 deletions docs/pre-submit-checklist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
# ์ œ์ถœ ์ „ ์ฝ”๋“œ ์ •๋ฆฌ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

์ด๋ ฅ์„œ ์ œ์ถœ ์ „์— ์ €์žฅ์†Œ๋ฅผ "์ฑ„์šฉ ๋‹ด๋‹น์ž๊ฐ€ ์—ด์–ด๋ด๋„ ๋˜๋Š” ์ƒํƒœ"๋กœ ๋งŒ๋“œ๋Š” ์ž‘์—… ๋ชฉ๋ก.

ํ˜„์žฌ ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜(`Nexts`)๋Š” `bun run build`, `tsc --noEmit`, `bun test`๊ฐ€ **๋ชจ๋‘ ์‹คํŒจ**ํ•œ๋‹ค.
์ด๋ ฅ์„œ์— GitHub URL์„ ์ ๋Š” ์ด์ƒ, ์ด ์„ธ ๊ฐ€์ง€๊ฐ€ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ์ด ์ตœ์†Œ ์กฐ๊ฑด์ด๋‹ค.

---

## ์ž‘์—… ์ˆœ์„œ

### 1. PR #6 ๋จธ์ง€ โ€” ๊ณต๊ฐœ ๋…ธ์ถœ๋œ ํ…Œ์ŠคํŠธ ๊ณ„์ • ์ œ๊ฑฐ

`๐Ÿ”’ fix: ํ™”๋ฉดยท๋ฆฌํฌํŠธ์— ๋…ธ์ถœ๋œ ํ…Œ์ŠคํŠธ ๊ณ„์ • ๋ฌธ์ž์—ด ์ œ๊ฑฐ`

- [ ] PR #6 ๋จธ์ง€
- [ ] ํ•ด๋‹น Supabase ๊ณ„์ • **๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ**

๊ณต๊ฐœ ์ €์žฅ์†Œ ๋กœ๊ทธ์ธ ํ™”๋ฉด ์ฝ”๋“œ์— ๊ณ„์ •/๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋ฐ•ํ˜€ ์žˆ๋˜ ์ƒํƒœ๋ผ ์ด๊ฒƒ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•œ๋‹ค.

---

### 2. PR #7 ํŒŒ์ผ๋ณ„ ์ฒ˜๋ฆฌ

`๐Ÿ› fix: ํƒ€์ž… ์˜ค๋ฅ˜ยทํƒ€์ž„์กด ๋ฒ„๊ทธ ์ •๋ฆฌ + ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ + ๋ฆฌ๋ทฐ ์›Œํฌํ”Œ๋กœ ์‹œํฌ๋ฆฟ ๋ถ„๋ฆฌ`

AI๊ฐ€ ์ƒ์„ฑํ•œ PR์ด๋‹ค. **์ „๋ถ€ ๋ฐ›์•„๋“ค์ด์ง€ ๋ง๊ณ  ์•„๋ž˜ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.**

> ํŒ๋‹จ ๊ธฐ์ค€: **๋ฉด์ ‘์—์„œ "์ด๊ฑธ ์™œ ์ด๋ ‡๊ฒŒ ๊ณ ์ณค๋ƒ"๊ณ  ๋ฌผ์œผ๋ฉด ๋‹ตํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?**

| ํŒŒ์ผ | ์ฒ˜๋ฆฌ | ์ด์œ  |
|---|---|---|
| `Heatmap/hook.test.ts` | ๊ทธ๋Œ€๋กœ | ํƒ€์ž„์กด ๊ณ ์ • + ์ ์šฉ ํ™•์ธ ํ…Œ์ŠคํŠธ๊นŒ์ง€ ์ž˜ ์ž‘์„ฑ๋จ |
| `LineChart/hook.test.ts` | ๊ทธ๋Œ€๋กœ | ๋™์ผ |
| `Heatmap/hook.ts` | ๊ทธ๋Œ€๋กœ | `format()` ์ ์šฉ. ๊ฒ€์ฆ ์™„๋ฃŒ |
| `LineChart/hook.ts` | ๊ทธ๋Œ€๋กœ | `format()` + ๋ฒ”์œ„ `-5~0`. ๊ฒ€์ฆ ์™„๋ฃŒ |
| `MakeStudy.tsx` | ๊ทธ๋Œ€๋กœ | ์ฃผ์„ ํ•ด์ œ. ํŒ๋‹จํ•  ๊ฒƒ ์—†์Œ |
| `Sidebar.tsx` | ๊ทธ๋Œ€๋กœ | `study?.id` guard ํ•œ ์ค„ |
| `calendar.tsx` | ๊ทธ๋Œ€๋กœ | react-day-picker ๋ฒ„์ „ ํƒ€์ž… ๋ฌธ์ œ |
| **`TagSection.tsx`** | **์ง์ ‘ ๋‹ค์‹œ ์ž‘์„ฑ** | ์˜ค๋ฅ˜๋งŒ ์ง€์šด ์šฐํšŒ ์ˆ˜์ • |
| **`studyStore.ts`** | **์„ค๊ณ„ ๊ฒฐ์ •** | ๋‘ ์•ˆ ์ค‘ ์„ ํƒ |
| **`tsconfig.json`** | **ํŒ๋‹จ** | ๋ถ€์ž‘์šฉ ์ธ์ง€ํ•˜๊ณ  ์œ ์ง€ ์—ฌ๋ถ€ ๊ฒฐ์ • |
| **`.github/workflows/automated-code-review.yml`** | **์ฝ๊ณ  ๊ฒ€ํ† ** | 57์ค„ ์ถ”๊ฐ€. ๋‚ด์šฉ ํ™•์ธ ํ•„์š” |
| **`problems/page.tsx`** | **ํ™•์ธ** | 13์ค„ ๋ณ€๊ฒฝ๋ถ„์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธ |

#### 2-1. `TagSection.tsx` โ€” ์ง์ ‘ ๋‹ค์‹œ ์“ธ ๊ฒƒ

```ts
// PR ์ƒํƒœ: ์˜ค๋ฅ˜๋งŒ ์‚ฌ๋ผ์ง€๊ณ  ํƒ€์ž… ์•ˆ์ •์„ฑ์€ ๊ทธ๋Œ€๋กœ
const selectedTags: string[] = useWatch({ control, name: "tags" }) ?? [];
// ^^^^^^^^ any ์— ์ด๋ฆ„ํ‘œ๋งŒ ๋ถ™์ธ ๊ฒƒ. ์ˆซ์ž ๋ฐฐ์—ด์ด ์™€๋„ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ชจ๋ฆ„
```

```ts
// ๋ชฉํ‘œ
// 1. ProblemFormValues ๋ฅผ ProblemAddModal.tsx ๋ฐ– ๊ณต์šฉ ํƒ€์ž…์œผ๋กœ ๋ถ„๋ฆฌ
// 2. const { setValue, control } = useFormContext<ProblemFormValues>();
// 3. const selectedTags = useWatch({ control, name: "tags" }) ?? [];
// โ†’ ์ œ๋„ค๋ฆญ์ด ์—ฐ๊ฒฐ๋˜์–ด ํƒ€์ž…์ด ์ž๋™์œผ๋กœ string[]
```

React Hook Form ์ œ๋„ค๋ฆญ ์—ฐ๊ฒฐ์€ ํ”„๋ก ํŠธ์—”๋“œ ๋ฉด์ ‘ ๋‹จ๊ณจ ์ฃผ์ œ๋‹ค. ์šฐํšŒํ•œ ์ฑ„๋กœ ๋‘์ง€ ์•Š๋Š”๋‹ค.

#### 2-2. `studyStore.ts` โ€” ๋‘ ์•ˆ ์ค‘ ์„ ํƒ

```ts
// A์•ˆ (ํ˜„์žฌ PR): ํ•„๋“œ๋งˆ๋‹ค nullable
interface StoredStudy { id: number | null; name: string | null; /* ... */ }
// โ†’ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ ํ•„๋“œ๋งˆ๋‹ค null ์ฒดํฌ ํ•„์š”

// B์•ˆ: ์Šคํ„ฐ๋””๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†๊ฑฐ๋‚˜
atomWithStorage<Study | null>("study_storage", null)
// โ†’ ํ•œ ๋ฒˆ๋งŒ ์ฒดํฌํ•˜๋ฉด ์ดํ›„ ํ•„๋“œ๋Š” ํƒ€์ž…์ด ๋ณด์žฅ๋จ
```

B์•ˆ์ด ๋” ๋‚ซ์ง€๋งŒ ์ฐธ์กฐํ•˜๋Š” ๊ณณ์„ ํ•จ๊ป˜ ์†๋ด์•ผ ํ•œ๋‹ค.
์‹œ๊ฐ„์ด ์—†์œผ๋ฉด A์•ˆ ์œ ์ง€ โ€” ๋‹จ, **์™œ A์•ˆ์„ ๊ณจ๋ž๋Š”์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.**

#### 2-3. `tsconfig.json` โ€” ๋ถ€์ž‘์šฉ ์ธ์ง€ ํ›„ ๊ฒฐ์ •

```json
"exclude": ["node_modules", "**/*.test.ts"]
```

ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ `next build` ํƒ€์ž… ๊ฒ€์‚ฌ์—์„œ ์ œ์™ธํ•˜๋Š” ๊ฒƒ ์ž์ฒด๋Š” ํ•ฉ๋ฆฌ์ ์ด๋‹ค.
๋‹ค๋งŒ **ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ „ํ˜€ ๋ฐ›์ง€ ์•Š๊ฒŒ ๋˜๋Š”** ๋ถ€์ž‘์šฉ์ด ์žˆ๋‹ค.
์ง€๊ธˆ์€ ์œ ์ง€ํ•˜๊ณ , ์ดํ›„ `tsconfig.test.json` ๋ถ„๋ฆฌ๋ฅผ ๊ฒ€ํ† ํ•œ๋‹ค.

---

### 3. ๊ฒ€์ฆ โ€” ์„ธ ๊ฐ€์ง€ ๋ชจ๋‘ ํ†ต๊ณผํ•  ๊ฒƒ

- [ ] `bun run build`
- [ ] `./node_modules/.bin/tsc --noEmit`
- [ ] `bun test`

`npx tsc` ๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋ฅผ ๋ฐ›์•„์˜ค๋ฏ€๋กœ `./node_modules/.bin/tsc` ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

---

### 4. ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™ ์„ค์ •

- [ ] Settings โ†’ Branches โ†’ Add rule โ†’ `Nexts`
- [ ] Require status checks to pass โ†’ `checks` ์„ ํƒ

ํ˜„์žฌ๋Š” ๋ณดํ˜ธ ๊ทœ์น™์ด ์—†์–ด **์ฒดํฌ๊ฐ€ ์‹คํŒจํ•ด๋„ ๋จธ์ง€๊ฐ€ ๋œ๋‹ค.** (PR #5๊ฐ€ `fail` ์ƒํƒœ๋กœ ๋จธ์ง€๋œ ์‚ฌ๋ก€)

**3๋ฒˆ์ด ํ†ต๊ณผํ•œ ๋’ค์— ์ผ ๋‹ค.** ๋จผ์ € ์ผœ๋ฉด ๋ณธ์ธ์ด ๋จธ์ง€ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

์ด ์„ค์ •์„ ๋งˆ์ณ์•ผ ์ด๋ ฅ์„œ์˜ "P1 ๋ฐœ๊ฒฌ ์‹œ ๋ณ‘ํ•ฉ์„ ์ฐจ๋‹จํ•˜๋Š”" ๋ฌธ๊ตฌ๊ฐ€ ์‚ฌ์‹ค์ด ๋œ๋‹ค.

---

### 5. ์ผ๊ฐ„ ๋ฆฌํฌํŠธ ์žฌ์‹คํ–‰

- [ ] ๋ฆฌํฌํŠธ ๊ฒฐ๋ก ์ด `๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค` ์—์„œ ๋ฐ”๋€Œ๋Š”์ง€ ํ™•์ธ

ํฌํŠธํด๋ฆฌ์˜ค์˜ "ํ˜ผ์ž ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ฆฌ๋ทฐ ๊ณต๋ฐฑ ์ค„์ด๊ธฐ" ์„น์…˜์˜ ๊ทผ๊ฑฐ๊ฐ€ ๋œ๋‹ค.
์ˆ˜์ • ์ „ํ›„ ๋ฆฌํฌํŠธ๋ฅผ ์บก์ฒ˜ํ•ด ๋‘˜ ๊ฒƒ.

---

### 6. ์‹œ๊ฐ„์ด ๋‚จ์œผ๋ฉด

- [ ] `src/app/api/extension/_shared.ts` โ€” CORS `*` ๋ฅผ allowlist ๋กœ ๋ณ€๊ฒฝ
- [ ] `problems/page.tsx` โ€” queryKey ์—์„œ `openProblem`, `openAddProblem` ์ œ๊ฑฐํ•˜๊ณ  ๋“ฑ๋ก ์„ฑ๊ณต ์‹œ `invalidateQueries` ํ˜ธ์ถœ
- [ ] `History.tsx`, `MonthlySolve.tsx` ์‚ญ์ œ (`Heatmap/`, `LineChart/` ์™€ ์ค‘๋ณต)
- [ ] biome 70 errors / 28 warnings ์ •๋ฆฌ
- [ ] `getAuthedMember` ๋ฅผ discriminated union ๋ฐ˜ํ™˜์œผ๋กœ ๋ณ€๊ฒฝ

---

## ์ฐธ๊ณ  โ€” ์ž๋™ ๋ฆฌ๋ทฐ ๋ฆฌํฌํŠธ๊ฐ€ ์ง€์ ํ•œ ๊ฒƒ ์ค‘ ๋ฏธ์ฒ˜๋ฆฌ ํ•ญ๋ชฉ

์ผ๊ฐ„ ๋ฆฌํฌํŠธ(2026-07-30)์˜ `์ง€๊ธˆ ๋ฐ”๋กœ ๋ณผ ๊ฒƒ`:

1. `tsc --noEmit` ์˜ค๋ฅ˜ 11๊ฑด โ†’ **2๋ฒˆ์—์„œ ์ฒ˜๋ฆฌ**
2. `bun run build` ํ†ต๊ณผ ํ™•์ธ โ†’ **3๋ฒˆ์—์„œ ์ฒ˜๋ฆฌ**
3. `_shared.ts` CORS origin allowlist โ†’ **6๋ฒˆ**
4. ์ตœ์†Œ smoke test ์ถ”๊ฐ€ โ†’ **2๋ฒˆ์—์„œ ์ฒ˜๋ฆฌ (ํ…Œ์ŠคํŠธ 2ํŒŒ์ผ)**

`๋‚˜์ค‘์— ์ •๋ฆฌํ•  ๊ฒƒ`:

1. `problems/page.tsx` ๋ฅผ ํ•„ํ„ฐ/data/list/dialog ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ
2. Heatmapยท์›”๋ณ„ ์ฐจํŠธ ์ค‘๋ณต ๋กœ์ง์„ ๊ณต์šฉ ๋„๋ฉ”์ธ ์œ ํ‹ธ๋กœ ํ†ตํ•ฉ
3. `data` / `value` / `result` / `item` ์ด๋ฆ„์„ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝ, API ๋ฐ˜ํ™˜ ํƒ€์ž… ๋ช…์‹œ
4. `console.log` ์™€ ์˜ค๋ž˜๋œ ์ฃผ์„ ์ฝ”๋“œ ์ œ๊ฑฐ
5. ๋ชจ๋‹ฌยทํƒœ๊ทธ ํ† ๊ธ€ยทํ™•์žฅ ํŒจ๋„ ์ ‘๊ทผ์„ฑ ๋ณด๊ฐ•
Loading