diff --git a/.claude/commands/backend-review.md b/.claude/commands/backend-review.md new file mode 100644 index 00000000..8062750d --- /dev/null +++ b/.claude/commands/backend-review.md @@ -0,0 +1,214 @@ +# ๐Ÿ“„ Backend PR Review Guide (for claude) + +## ๐Ÿ“Œ ๋ชฉ์  + +์ด ๋ฌธ์„œ๋Š” ๋ฐฑ์—”๋“œ Pull Request๋ฅผ ๋ฆฌ๋ทฐํ•  ๋•Œ, +LLM์ด ์ผ๊ด€๋˜๊ณ  ์‹ค๋ฌด์ ์ธ ๊ธฐ์ค€์œผ๋กœ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋•๊ธฐ ์œ„ํ•œ ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค. + +๋ฆฌ๋ทฐ๋Š” ๋‹จ์ˆœ ์ฝ”๋“œ ์Šคํƒ€์ผ์ด ์•„๋‹ˆ๋ผ, +**์„ค๊ณ„ / ์•ˆ์ •์„ฑ / ์„ฑ๋Šฅ / ๋ณด์•ˆ / ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ค‘์‹ฌ**์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ๋ฆฌ๋ทฐ ๊ธฐ๋ณธ ์›์น™ + +- ๋‹จ์ˆœ "์ข‹๋‹ค/๋‚˜์˜๋‹ค"๊ฐ€ ์•„๋‹ˆ๋ผ **์ด์œ  + ๊ฐœ์„  ๋ฐฉํ–ฅ** ์ œ์‹œ +- ๊ฐ€๋Šฅํ•˜๋ฉด **๋Œ€์•ˆ ์ฝ”๋“œ** ๋˜๋Š” **๊ตฌ์ฒด์  ์ˆ˜์ • ๋ฐฉํ–ฅ** ์ œ์‹œ +- ๋ถˆํ•„์š”ํ•œ nitpick ์ง€์–‘ +- **๋ฌธ์ œ โ†’ ์ด์œ  โ†’ ๊ฐœ์„ ์•ˆ** ๊ตฌ์กฐ๋กœ ์„ค๋ช… + +--- + +## 1. ์•„ํ‚คํ…์ฒ˜ / ์„ค๊ณ„ + +- ์ฑ…์ž„ ๋ถ„๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ๋Š”๊ฐ€? + - Controller / Service / Repository ์—ญํ• ์ด ๋ช…ํ™•ํ•œ๊ฐ€? +- ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด Service์— ์œ„์น˜ํ•˜๋Š”๊ฐ€? +- Entity์— ๋กœ์ง์ด ์ ์ ˆํžˆ ํฌํ•จ๋˜์–ด ์žˆ๋Š”๊ฐ€? +- ๋„๋ฉ”์ธ ์ค‘์‹ฌ ์„ค๊ณ„๊ฐ€ ๋˜์–ด ์žˆ๋Š”๊ฐ€? + +### ์ฒดํฌ ํฌ์ธํŠธ + +- Service๊ฐ€ ๋„ˆ๋ฌด ๋น„๋Œ€ํ•˜์ง€ ์•Š์€๊ฐ€? +- Controller์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š”๊ฐ€? +- Repository๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋กœ์ง์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๊ฐ€? + +--- + +## 2. ๋„๋ฉ”์ธ ๋ชจ๋ธ (Entity) + +- ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์ž˜ ํ‘œํ˜„ํ•˜๋Š”๊ฐ€? +- setter ๋‚จ์šฉ ์—†์ด ๋ฉ”์„œ๋“œ ๊ธฐ๋ฐ˜ ๋ณ€๊ฒฝ์ธ๊ฐ€? +- ์ƒํƒœ ๋ณ€๊ฒฝ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ช…ํ™•ํ•œ๊ฐ€? + +### ์ฒดํฌ ํฌ์ธํŠธ + +- `user.restore()` ๊ฐ™์€ ๋ช…ํ™•ํ•œ ํ–‰์œ„ ๋ฉ”์„œ๋“œ ์กด์žฌ ์—ฌ๋ถ€ +- ๋ฌด๋ถ„๋ณ„ํ•œ public setter ์‚ฌ์šฉ ์—ฌ๋ถ€ +- soft delete ์ •์ฑ… ์ผ๊ด€์„ฑ + +--- + +## 3. ์ธ์ฆ / ๋ณด์•ˆ + +- ์ธ์ฆ ๋กœ์ง์ด ์•ˆ์ „ํ•œ๊ฐ€? +- ์™ธ๋ถ€ API ํ† ํฐ์„ ๊ทธ๋Œ€๋กœ ์‹ ๋ขฐํ•˜์ง€ ์•Š๋Š”๊ฐ€? +- JWT ์‚ฌ์šฉ ๋ฐฉ์‹์ด ์˜ฌ๋ฐ”๋ฅธ๊ฐ€? + +### ์ฒดํฌ ํฌ์ธํŠธ + +- ์šฐ๋ฆฌ ์„œ๋น„์Šค JWT ๋”ฐ๋กœ ๋ฐœ๊ธ‰ํ•˜๋Š”๊ฐ€ +- refresh token ์ €์žฅ ์œ„์น˜๊ฐ€ ์•ˆ์ „ํ•œ๊ฐ€ (DB/Redis) +- ๋ฏผ๊ฐ ์ •๋ณด ๋กœ๊ทธ ์ถœ๋ ฅ ์—ฌ๋ถ€ + +--- + +## 4. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + +- ์˜ˆ์™ธ๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”๊ฐ€? +- ๋น„์ฆˆ๋‹ˆ์Šค ์˜ˆ์™ธ vs ์‹œ์Šคํ…œ ์˜ˆ์™ธ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋Š”๊ฐ€? + +### ์ฒดํฌ ํฌ์ธํŠธ + +- ErrorCode enum ์‚ฌ์šฉ ์—ฌ๋ถ€ +- try-catch ๋‚จ์šฉ ์—ฌ๋ถ€ +- ์˜๋ฏธ ์—†๋Š” RuntimeException throw ์—ฌ๋ถ€ + +--- + +## 5. ํŠธ๋žœ์žญ์…˜ + +- ํ•„์š”ํ•œ ๊ณณ์— `@Transactional`์ด ์žˆ๋Š”๊ฐ€? +- readOnly ์„ค์ •์ด ์ ์ ˆํ•œ๊ฐ€? + +### ์ฒดํฌ ํฌ์ธํŠธ + +- ์กฐํšŒ ํ›„ ์—”ํ‹ฐํ‹ฐ ์ˆ˜์ • ์‹œ ํŠธ๋žœ์žญ์…˜ ์กด์žฌ ์—ฌ๋ถ€ +- ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„๊ฐ€ ๊ณผ๋„ํ•˜์ง€ ์•Š์€๊ฐ€ + +--- + +## 6. ์„ฑ๋Šฅ / ์ฟผ๋ฆฌ + +- ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๊ฐ€? +- N+1 ๋ฌธ์ œ ๊ฐ€๋Šฅ์„ฑ ์žˆ๋Š”๊ฐ€? + +### ์ฒดํฌ ํฌ์ธํŠธ + +- find ํ›„ ๋‹ค์‹œ ์กฐํšŒํ•˜๋Š” ๊ตฌ์กฐ +- lazy loading ๋ฌธ์ œ +- ์ธ๋ฑ์Šค ๊ณ ๋ ค ์—ฌ๋ถ€ + +--- + +## 7. ๋™์‹œ์„ฑ / ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ + +- race condition ๊ฐ€๋Šฅ์„ฑ ์žˆ๋Š”๊ฐ€? +- ์ค‘๋ณต ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ๊ฐ€๋Šฅ์„ฑ ์žˆ๋Š”๊ฐ€? + +### ์ฒดํฌ ํฌ์ธํŠธ + +- ์†Œ์…œ ๋กœ๊ทธ์ธ ์ค‘๋ณต ๊ฐ€์ž… ๊ฐ€๋Šฅ์„ฑ +- DB unique constraint ์กด์žฌ ์—ฌ๋ถ€ +- save ์ „์— ๊ฒ€์ฆ๋งŒ ํ•˜๋Š” ๊ตฌ์กฐ + +--- + +## 8. ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ + +- ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ์ธ๊ฐ€? +- ์˜์กด์„ฑ ๋ถ„๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ๋Š”๊ฐ€? + +### ์ฒดํฌ ํฌ์ธํŠธ + +- Service ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ +- ์™ธ๋ถ€ API mock ๊ฐ€๋Šฅ ์—ฌ๋ถ€ + +--- + +## 9. ์ฝ”๋“œ ๊ฐ€๋…์„ฑ / ์œ ์ง€๋ณด์ˆ˜์„ฑ + +- ๋ณ€์ˆ˜๋ช… / ๋ฉ”์„œ๋“œ๋ช…์ด ๋ช…ํ™•ํ•œ๊ฐ€? +- ์ฝ”๋“œ ํ๋ฆ„์ด ์ง๊ด€์ ์ธ๊ฐ€? + +### ์ฒดํฌ ํฌ์ธํŠธ + +- map/orElseGet ๋‚จ์šฉ ์—ฌ๋ถ€ +- if-else๊ฐ€ ๋” ๋‚˜์€ ๊ฒฝ์šฐ์ธ์ง€ +- ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ ์ ์ ˆํ•œ๊ฐ€ + +--- + +## 10. API ์„ค๊ณ„ + +- RESTfulํ•˜๊ฒŒ ์„ค๊ณ„๋˜์–ด ์žˆ๋Š”๊ฐ€? +- ์š”์ฒญ/์‘๋‹ต์ด ๋ช…ํ™•ํ•œ๊ฐ€? + +### ์ฒดํฌ ํฌ์ธํŠธ + +- DTO ์‚ฌ์šฉ ์—ฌ๋ถ€ +- Entity ์ง์ ‘ ๋ฐ˜ํ™˜ ์—ฌ๋ถ€ +- ์‘๋‹ต ํฌ๋งท ์ผ๊ด€์„ฑ + +--- + +## 11. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค + +- ์Šคํ‚ค๋งˆ ์„ค๊ณ„๊ฐ€ ์ ์ ˆํ•œ๊ฐ€? +- ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ณณ์— ์žˆ๋Š”๊ฐ€? + +### ์ฒดํฌ ํฌ์ธํŠธ + +- `(oauth_provider, oauth_id)` unique ์—ฌ๋ถ€ +- nullable ์ •์ฑ… ์ ์ ˆํ•œ๊ฐ€ +- enum ์‚ฌ์šฉ ์‹œ ํ™•์žฅ์„ฑ ๊ณ ๋ คํ–ˆ๋Š”๊ฐ€ + +--- + +## 12. ์œ„ํ—˜ ์‹ ํ˜ธ (์ค‘์š”) + +์•„๋ž˜๊ฐ€ ๋ณด์ด๋ฉด ๋ฐ˜๋“œ์‹œ ์ง€์ ํ•˜์„ธ์š”. + +- โŒ ์ธ์ฆ ๋กœ์ง์ด Controller์— ์žˆ์Œ +- โŒ Entity setter ๋‚จ์šฉ +- โŒ ํŠธ๋žœ์žญ์…˜ ์—†์ด ์—”ํ‹ฐํ‹ฐ ๋ณ€๊ฒฝ +- โŒ unique ์ œ์•ฝ ์—†์ด ์ค‘๋ณต ์ƒ์„ฑ ๊ฐ€๋Šฅ +- โŒ ์™ธ๋ถ€ API ์‘๋‹ต์„ ๊ทธ๋Œ€๋กœ ์‹ ๋ขฐ +- โŒ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์—ฌ๋Ÿฌ ๊ณ„์ธต์— ํฉ์–ด์ง + +--- + +## ๐Ÿงพ ๋ฆฌ๋ทฐ ์ถœ๋ ฅ ํ˜•์‹ + +```text +### ๋ฌธ์ œ์  +- ์„ค๋ช… + +### ์™œ ๋ฌธ์ œ์ธ๊ฐ€ +- ์„ค๋ช… + +### ๊ฐœ์„  ๋ฐฉ๋ฒ• +- ์„ค๋ช… + +### ๊ฐœ์„  ์˜ˆ์‹œ ์ฝ”๋“œ (์„ ํƒ) +- ์ฝ”๋“œ +``` + +--- + +## ๋ฆฌ๋ทฐ ์šฐ์„ ์ˆœ์œ„ + +1. ๋ฒ„๊ทธ ๊ฐ€๋Šฅ์„ฑ +2. ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ +3. ๋ณด์•ˆ +4. ์„ฑ๋Šฅ +5. ์„ค๊ณ„ +6. ๊ฐ€๋…์„ฑ + +--- + +## ์ถ”๊ฐ€ ์ง€์นจ + +- ์ž‘์€ ์Šคํƒ€์ผ ์ง€์ ๋ณด๋‹ค **์น˜๋ช…์ ์ธ ์„ค๊ณ„ ๋ฌธ์ œ๋ฅผ ์šฐ์„ ** +- "์ด๊ฑด ์ทจํ–ฅ" ์ˆ˜์ค€์€ ๊ณผํ•˜๊ฒŒ ์ง€์ ํ•˜์ง€ ์•Š๊ธฐ +- ๋ฐ˜๋“œ์‹œ **์‹ค๋ฌด ๊ธฐ์ค€์œผ๋กœ ํŒ๋‹จ** diff --git a/.claude/commands/branch.md b/.claude/commands/branch.md new file mode 100644 index 00000000..845b9e04 --- /dev/null +++ b/.claude/commands/branch.md @@ -0,0 +1,74 @@ +--- +description: Create or suggest a git branch name using this repository's branch convention. +argument-hint: " # " +allowed-tools: Bash(git status --short), Bash(git branch --show-current), Bash(git switch -c *) +--- + +You are creating or suggesting a git branch for this repository. + +Use Korean. + +Branch naming convention: + +```text +/#- +``` + +Examples: + +```text +feat/#123-add-review-api +fix/#346-handle-apple-email-missing +refactor/#354-clean-partnership-period +docs/#12-update-deploy-guide +``` + +Input from the user: + +```text +$ARGUMENTS +``` + +Process: + +1. Identify the git commit type. +2. Identify the issue number. +3. Convert the feature/fix summary into short English kebab-case. +4. Check current branch and working tree before creating. +5. If the user only asks for a branch name, suggest the branch name only. +6. If the user explicitly asks to create the branch, run `git switch -c `. + +Allowed commit types: + +```text +feat, fix, refactor, style, docs, test, chore +``` + +Rules: + +- Always include `#` before the issue number. +- Use lowercase English in the description. +- Use kebab-case, not spaces, underscores, or Korean. +- Keep the description short, usually 2-6 words. +- If the issue number is missing, ask for it before creating a branch. +- If the type is unclear, choose the most conservative type and explain briefly. +- Before creating a branch, run `git status --short` and `git branch --show-current`. +- If there are uncommitted changes, mention that they will remain in the working tree after switching. + +Output when suggesting: + +```text +์ถ”์ฒœ ๋ธŒ๋žœ์น˜๋ช…: feat/#123-add-review-api +``` + +Output when creating: + +```text +์ƒ์„ฑํ•  ๋ธŒ๋žœ์น˜๋ช…: feat/#123-add-review-api +``` + +Then run: + +```bash +git switch -c feat/#123-add-review-api +``` diff --git a/.claude/commands/commit.md b/.claude/commands/commit.md new file mode 100644 index 00000000..8fd78609 --- /dev/null +++ b/.claude/commands/commit.md @@ -0,0 +1,60 @@ +--- +description: Create a git commit message using this repository's commit convention. +argument-hint: "" +allowed-tools: Bash(git status --short), Bash(git diff --staged) +--- + +You are creating a git commit message for this repository. + +Use Korean. + +Commit message convention: + +```text +: <ํ•œ๊ธ€๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ> +``` + +Examples: + +```text +feat: ๋ฆฌ๋ทฐ ์ƒ์„ฑ API ์ถ”๊ฐ€ +fix: ์• ํ”Œ ๋กœ๊ทธ์ธ ์ด๋ฉ”์ผ ๋ˆ„๋ฝ ์˜ค๋ฅ˜ ์ˆ˜์ • +refactor: Partnership ๊ธฐ๊ฐ„ ํƒ€์ž… ์ •๋ฆฌ +style: ์ฝ”๋“œ ํฌ๋งท ์ •๋ฆฌ +docs: ๋ฐฐํฌ ๊ฐ€์ด๋“œ ์—…๋ฐ์ดํŠธ +test: ๋ฆฌ๋ทฐ ์„œ๋น„์Šค ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ +chore: ์˜์กด์„ฑ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ +``` + +Input from the user: + +```text +$ARGUMENTS +``` + +Process: + +1. Run `git status --short` to check staged files. +2. Run `git diff --staged` to inspect actual changes. +3. Identify the appropriate commit type from the changes. +4. Write a short Korean description summarizing what changed and why. + +Allowed commit types: + +```text +feat, fix, refactor, style, docs, test, chore +``` + +Rules: + +- Description is written in Korean. +- Keep it short and clear โ€” one line only. +- Focus on "๋ฌด์—‡์„ ์™œ" not "์–ด๋–ป๊ฒŒ". +- Do not end with a period. +- If nothing is staged, mention it and do not suggest a commit message. + +Output format: + +```text +์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€: feat: ๋ฆฌ๋ทฐ ์ƒ์„ฑ API ์ถ”๊ฐ€ +``` diff --git a/.claude/commands/feature-issue.md b/.claude/commands/feature-issue.md new file mode 100644 index 00000000..a7325b5c --- /dev/null +++ b/.claude/commands/feature-issue.md @@ -0,0 +1,49 @@ +--- +description: Create a GitHub feature issue body using this repository's issue template. +argument-hint: "" +--- + +You are creating a feature issue for this repository. + +Use Korean. + +Use the repository template at `.github/ISSUE_TEMPLATE/feature-report.md`. + +Input from the user: + +```text +$ARGUMENTS +``` + +Output only the final issue content in Markdown. + +Follow this exact structure: + +```markdown +# Feature Report + +## ์ถ”๊ฐ€ ํ•  ์‚ฌํ•ญ๋“ค + +- ... + +## ์ฒจ๋ถ€์ž๋ฃŒ + +- ... +``` + +Rules: + +- Keep the title suggestion separate at the top as `title: feature: ...`. +- If the user did not provide enough detail, infer a reasonable feature scope from the repository context. +- Do not invent implementation details that are not implied by the request. +- Prefer concrete acceptance criteria over vague descriptions. +- If there is no attachment/reference, write `- ์—†์Œ`. + +When the user explicitly asks to create the issue (not just draft it), run: + +```bash +gh issue create --title "feature: " --body "" --assignee @me --label feat +``` + +- Always include `--assignee @me` so the issue is assigned to the current user. +- Always include `--label feat` to match this template's convention. diff --git a/.claude/commands/fix-issue.md b/.claude/commands/fix-issue.md new file mode 100644 index 00000000..3882cddd --- /dev/null +++ b/.claude/commands/fix-issue.md @@ -0,0 +1,49 @@ +--- +description: Create a GitHub fix issue body using this repository's issue template. +argument-hint: "" +--- + +You are creating a fix issue for this repository. + +Use Korean. + +Use the repository template at `.github/ISSUE_TEMPLATE/fix-report.md`. + +Input from the user: + +```text +$ARGUMENTS +``` + +Output only the final issue content in Markdown. + +Follow this exact structure: + +```markdown +# Fix Report + +## ๊ณ ์ณ์•ผ ํ•  ์‚ฌํ•ญ + +- ... + +## ์ฒจ๋ถ€์ž๋ฃŒ + +- ... +``` + +Rules: + +- Keep the title suggestion separate at the top as `title: fix: ...`. +- Describe the current problem, expected behavior, and affected area when possible. +- If the issue is operational, include the relevant environment such as prod, dev, EC2, Docker, or CloudWatch. +- Do not claim a root cause unless it is directly supported by the given context. +- If there is no attachment/reference, write `- ์—†์Œ`. + +When the user explicitly asks to create the issue (not just draft it), run: + +```bash +gh issue create --title "fix: " --body "" --assignee @me --label fix +``` + +- Always include `--assignee @me` so the issue is assigned to the current user. +- Always include `--label fix` to match this template's convention. diff --git a/.claude/commands/pr.md b/.claude/commands/pr.md new file mode 100644 index 00000000..a0a8a826 --- /dev/null +++ b/.claude/commands/pr.md @@ -0,0 +1,80 @@ +--- +description: Draft a pull request body using this repository's PR template and current git changes. +argument-hint: "" +allowed-tools: Bash(git status --short), Bash(git diff --stat), Bash(git diff --name-only), Bash(git diff) +--- + +You are drafting a pull request for this repository. + +Use Korean. + +Use the repository template at `.github/PULL_REQUEST_TEMPLATE.md`. + +Input from the user: + +```text +$ARGUMENTS +``` + +Before writing the PR body: + +1. Check changed files with `git status --short`. +2. Check the diff summary with `git diff --stat`. +3. Inspect relevant diffs with `git diff`. + +Output only the final PR content in Markdown. + +Follow this exact structure: + +```markdown +## #๏ธโƒฃ Issue Number + +- resolved # + +## ๐Ÿ“ ์š”์•ฝ(Summary) + +- + +## ๐Ÿ’ฌ ๊ณต์œ ์‚ฌํ•ญ to ๋ฆฌ๋ทฐ์–ด + +- + +## โœ… PR Checklist + +PR์ด ๋‹ค์Œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. + +- [ ] ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ปจ๋ฒค์…˜์— ๋งž๊ฒŒ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. +- [ ] ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.(๋ฒ„๊ทธ ์ˆ˜์ •/๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ). +``` + +Rules: + +- Fill `resolved #` with an issue number if the user provided one. If not, keep `resolved #`. +- Explain what changed and why, not just how. +- Mention key files or behavior changes when helpful. +- In `๊ณต์œ ์‚ฌํ•ญ to ๋ฆฌ๋ทฐ์–ด`, call out risks, test gaps, migration concerns, deployment concerns, or areas needing focused review. +- For the checklist, mark an item checked only if the evidence is clear from the context or command results. +- If tests were not run, leave the test checkbox unchecked and mention that in reviewer notes. +- Do not include unrelated refactoring in the summary. + +When the user explicitly asks to create the PR (not just draft it), run: + +```bash +gh pr create --title ": " --body "" --assignee @me --reviewer eunseo9311,sjinssun --label