Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
182 commits
Select commit Hold shift + click to select a range
eaa7c51
feat: ํ™๋ณด ํŽ˜์ด์ง€ ๋ผ์šฐํŠธ ๋ฐ ํŽ˜์ด์ง€ ์ž„์‹œ ์ถ”๊ฐ€
suhyun113 Mar 3, 2026
e9b41a9
feat: ํ™๋ณด ํŽ˜์ด์ง€ Mixpanel ํŠธ๋ž˜ํ‚น ์ถ”๊ฐ€
suhyun113 Mar 3, 2026
85ceb2f
feat: ํ™๋ณด ์นฉ ์ถ”๊ฐ€ ๋ฐ ํ™๋ณด ๋ชฉ๋ก ํŽ˜์ด์ง€ ์ดˆ๊ธฐ ๋ ˆ์ด์•„์›ƒ ์ƒ์„ฑ
suhyun113 Mar 3, 2026
c2e67fc
feat: ํ™๋ณด ์นด๋“œ 2์—ด ๊ทธ๋ฆฌ๋“œ ๊ตฌ์กฐ ์ถ”๊ฐ€
suhyun113 Mar 3, 2026
6a35037
refactor: ํŒŒ์ผ ๊ฒฝ๋กœ ์ด๋™
suhyun113 Mar 3, 2026
25cf256
feat: ํ™๋ณด ์นด๋“œ ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐ ๋ ˆ์ด์•„์›ƒ ๊ตฌํ˜„
suhyun113 Mar 4, 2026
5054047
feat: ๋™์•„๋ฆฌ ํ™๋ณด ์นด๋“œ ๋””์ž์ธ ๋ ˆ์ด์•„์›ƒ ์ถ”๊ฐ€
suhyun113 Mar 4, 2026
f547f14
chore: ํ™๋ณด ์นด๋“œ ์œ„์น˜, ์‹œ๊ฐ„ ์•„์ด์ฝ˜ svg ํŒŒ์ผ ์ถ”๊ฐ€
suhyun113 Mar 4, 2026
93752a0
feat: api ์—ฐ๋™ ๋ฐ ์Šคํƒ€์ผ ์ถ”๊ฐ€
suhyun113 Mar 4, 2026
5bfc34b
feat: CardMeta ๋‚ ์งœ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ ํ˜•์‹ ๋ณ€๊ฒฝ
suhyun113 Mar 4, 2026
0a31760
style: ๊ธฐ๋ณธ ์นด๋“œ ์Šคํƒ€์ผ ์†์„ฑ ์ˆ˜์ •
suhyun113 Mar 4, 2026
996f9ac
style: Dday Glass ํšจ๊ณผ ์ถ”๊ฐ€
suhyun113 Mar 4, 2026
ed8359c
refactor: ํŒŒ์ผ ์œ„์น˜ ์ด๋™
suhyun113 Mar 4, 2026
1224c3d
feat: ์ด๋ฒคํŠธ ์ƒ์„ธ ํŽ˜์ด์ง€ ์ด๋™ ๋ฐ ์ด๋ฒคํŠธ ์ •๋ณด ํƒ‘๋ฐ” ์ถ”๊ฐ€
suhyun113 Mar 4, 2026
6a5d17b
feat: ์ด๋ฒคํŠธ ์ •๋ณด ํŽ˜์ด์ง€ ์—ฐ๋™ ๋ฐ ๋ ˆ์ด์•„์›ƒ ์ถ”๊ฐ€
suhyun113 Mar 5, 2026
25adc9f
style: clubTag margin ์†์„ฑ ๋ถ„๋ฆฌ ๋ฐ TitleSection ์Šคํƒ€์ผ ์ˆ˜์ •
suhyun113 Mar 5, 2026
fa2b62b
feat: ์ด๋ฏธ์ง€๋”๋ณด๊ธฐ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ๋ฐ ๋น„๋™๊ธฐ ๋กœ๋”ฉ ์‹œ์  height ์ธก์ • ์‹คํŒจ ๋ฌธ์ œ ResizeObserver๋กœ ํ•ด๊ฒฐ
suhyun113 Mar 5, 2026
64feaf3
fix: ์ด๋ฏธ์ง€ ๋”๋ณด๊ธฐ ๋ฒ„ํŠผ ์ƒ์„ฑ ์•ˆ ๋˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ
suhyun113 Mar 5, 2026
5b3d900
style: moreArrawIcon ์ถ”๊ฐ€ ๋ฐ ์ด๋ฏธ์ง€ ๋”๋ณด๊ธฐ ๋ฒ„ํŠผ ๋””์ž์ธ ์ˆ˜์ •
suhyun113 Mar 5, 2026
75c3df5
style: ํ–‰์‚ฌ ์ƒ์„ธ์ •๋ณด ์Šคํƒ€์ผ ์ˆ˜์ •
suhyun113 Mar 5, 2026
88771a3
feat: ArrowButton ๊ณตํ†ต์œผ๋กœ ๋ถ„๋ฆฌ ๋ฐ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ์ ์šฉ
suhyun113 Mar 5, 2026
37494cb
feat: PromotionCard ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ ๋ฐ ๊ด€๋ จ ์ด๋ฒคํŠธ ์„น์…˜ ์ž„์‹œ ์ถ”๊ฐ€ ๋ฐ ํ…์ŠคํŠธ ๋ง์ค„์ž„ ์ถ”๊ฐ€
suhyun113 Mar 5, 2026
632f2ac
feat: ๋”๋ฏธ ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ
suhyun113 Mar 8, 2026
d54d356
feat: ๋ฐ์Šคํฌํƒ‘ ๋ฒ„์ „ ์ด๋ฒคํŠธ ์ •๋ณด ํŽ˜์ด์ง€ ์ถ”๊ฐ€
suhyun113 Mar 8, 2026
5682ba3
feat: ๋ชจ๋ฐ”์ผ ๊ธฐ์ค€ ์ƒ๋‹จ๋ฐ” ๊ณ ์ •
suhyun113 Mar 8, 2026
fd4c808
fix: location nullable ์ œ๊ฑฐ
suhyun113 Mar 11, 2026
5683f10
style: ์ƒ์„ธ ํŽ˜์ด์ง€ ๋ชจ๋ฐ”์ผ ํƒ€์ดํ‹€ ๊ฐ„๊ฒฉ ์ˆ˜์ • ๋ฐ ๋ฐ์Šคํฌํƒ‘ ์ด๋ฏธ์ง€ ์กฐ์ •
suhyun113 Mar 12, 2026
0023079
feat: ๊ด€๋ จ ๋™์•„๋ฆฌ ์ปดํฌ๋„ŒํŠธ ๋น„ํ™œ์„ฑํ™”
suhyun113 Mar 12, 2026
073eec1
style: ์ƒ์„ธํŽ˜์ด์ง€ ํƒ€์ดํ‹€ ์„น์…˜ ๊ตฌ๋ถ„์„  ์ถ”๊ฐ€ ๋ฐ ์—ฌ๋ฐฑ ์กฐ์ •
suhyun113 Mar 14, 2026
e825ac1
fix: ์ด๋ฏธ์ง€ ๊ฒฝ๊ณ„ ๋ธ”๋Ÿฌ ์ฒ˜๋ฆฌ ๋ˆ„๋ฝ ์ˆ˜์ •
suhyun113 Mar 15, 2026
7b0b981
feat: ๋ฐ์Šคํฌํƒ‘์ผ๋•Œ ํ™๋ณด์ด๋ฒคํŠธ ํ—ค๋” ์ถ”๊ฐ€ ๋ฐ ์นฉ ๋ฒ„ํŠผ ์ œ๊ฑฐ
suhyun113 Mar 16, 2026
6eaa6ae
feat: ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ๋ฒ„ํŠผ ํ‘ธํ„ฐ๋กœ ๋ถ„๋ฆฌ
suhyun113 Mar 16, 2026
c6a992f
style: ๋ฐํƒ‘์—์„œ ํ‘ธํ„ฐ ์‚ฌ์ด ์—ฌ๋ฐฑ ์ถ”๊ฐ€
suhyun113 Mar 16, 2026
25e8018
refactor: prettier ์ฝ”๋“œ ํฌ๋งท ์ •๋ฆฌ
suhyun113 Mar 16, 2026
2aea6f9
fix: Storybook Router ๋ฌธ์ œ ํ•ด๊ฒฐ
suhyun113 Mar 16, 2026
668c756
test: ๋„ค๋น„๊ฒŒ์ด์…˜ ํ…Œ์ŠคํŠธ ์‹คํŒจ ์ˆ˜์ •
suhyun113 Mar 16, 2026
4a657c2
feat: ๋™์•„๋ฆฌ ์ •๋ณด ๋ณด๋Ÿฌ๊ฐ€๊ธฐ ๋ผ์šฐํŠธ ์ˆ˜์ •
suhyun113 Mar 16, 2026
e9eef2f
fix: ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ๋กœ ๋ณ€๊ฒฝ
suhyun113 Mar 16, 2026
c9b2f99
style: glass ์†์„ฑ ์ˆ˜์ •
suhyun113 Mar 16, 2026
992e49f
feat: ํ™๋ณด ๋ฆฌ์ŠคํŠธ ๋ฐ˜์‘ํ˜• ์ถ”๊ฐ€
suhyun113 Mar 17, 2026
99c19b1
fix: ๋ชจ๋ฐ”์ผ ๋ฐ˜์‘ํ˜• ์นด๋“œ ๊ฐœ์ˆ˜ ์ˆ˜์ •
suhyun113 Mar 17, 2026
dededf5
refactor: Prettier ์ฝ”๋“œ ํฌ๋งท ์ •๋ฆฌ
suhyun113 Mar 17, 2026
b81f613
fix: ๋ชจ๋ฐ”์ผ์—์„œ๋„ ์—ฌ๋ฐฑ ํ†ต์ผ
suhyun113 Mar 17, 2026
2ba61fe
style: ํ—ค๋” ์—ฌ๋ฐฑ ๋ฐ˜์‘ํ˜• ๋ฌธ์ œ ์ˆ˜์ •
suhyun113 Mar 17, 2026
4d19dac
feat: ๋™์†Œํ•œ ํ•„ํ„ฐ ์นฉ ์ œ๊ฑฐ ๋ฐ ํ™๋ณด ์นด๋“œ๋กœ ์ถ”๊ฐ€ ๋ฐ ์ด๋ฒคํŠธ ์ •๋ ฌ ์ถ”๊ฐ€
suhyun113 Mar 18, 2026
3a84847
fix: ํ™๋ณด ๊ฒŒ์‹œํŒ ๊ฒŒ์‹œ๊ธ€ ์ƒ๋‹จ ํŒจ๋”ฉ ์ˆ˜์ •
suhyun113 Mar 18, 2026
1a3fe82
feat: ํ™๋ณด ์นฉ ์•Œ๋ฆผ ๋กœ์ง ์ถ”๊ฐ€
suhyun113 Mar 18, 2026
573c040
fix: ํ™๋ณด ์นฉ ์•Œ๋ฆผ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ์‹œ ์•ˆ ๋ณด์ด๋Š” ๋ฌธ์ œ ์ˆ˜์ •
suhyun113 Mar 18, 2026
4458fba
fix: ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ UI ์—…๋ฐ์ดํŠธ ์ถ”๊ฐ€ ์•ˆ ๋˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ
suhyun113 Mar 18, 2026
3c0dc43
style: ๋ชจ๋ฐ”์ผ ์›น ๋™์†Œํ•œ ํŽ˜์ด์ง€ ์ƒ๋‹จ ์ž˜๋ฆผ ๋ฌธ์ œ ํ•ด๊ฒฐ
suhyun113 Mar 18, 2026
3e0bdd3
test: ํ•„๋“œ ์ถ”๊ฐ€์— ๋”ฐ๋ฅธ ์ˆ˜์ • ๋ฐ ์•Œ๋ฆผ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
suhyun113 Mar 19, 2026
c2531c0
fix: ํ•„๋“œ ์ถ”๊ฐ€์— ๋”ฐ๋ฅธ Mock ๋ฐ์ดํ„ฐ ์ˆ˜์ •
suhyun113 Mar 19, 2026
102a2ca
refactor: Prettier ์ฝ”๋“œ ํฌ๋งท ์ •๋ฆฌ
suhyun113 Mar 19, 2026
b100393
style: dday ํ…์ŠคํŠธ ์ƒ‰์ƒ ๋ณ€๊ฒฝ ๋ฐ ์ข…๋ฃŒ์ธ ๊ฒฝ์šฐ ์ƒ‰์ƒ ๋ณ€๊ฒฝ
suhyun113 Mar 22, 2026
e378c4b
feat: ์บ˜๋ฆฐ๋” OAuth API ์œ ํ‹ธ ์ถ”๊ฐ€
seongwon030 Mar 22, 2026
f4e5c7c
feat: ์บ˜๋ฆฐ๋” ๋™๊ธฐํ™” ์œ ํ‹ธ ๋ถ„๋ฆฌ
seongwon030 Mar 22, 2026
46361ce
test: ์บ˜๋ฆฐ๋” ๋™๊ธฐํ™” ์œ ํ‹ธ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
seongwon030 Mar 22, 2026
ea82390
style: ์บ˜๋ฆฐ๋” ์—ฐ๋™ ํƒญ ์Šคํƒ€์ผ ์ •๋ฆฌ
seongwon030 Mar 22, 2026
02135e4
feat: ์บ˜๋ฆฐ๋” ์—ฐ๋™ ํƒญ UI ๊ตฌ์„ฑ ๊ฐœ์„ 
seongwon030 Mar 22, 2026
f2fffe6
refactor: ๊ตฌ๊ธ€ ์บ˜๋ฆฐ๋” ๋กœ์ง ํ›… ๋ถ„๋ฆฌ
seongwon030 Mar 22, 2026
ad35d74
refactor: ๋…ธ์…˜ ๋ฐ์ดํ„ฐ ๋กœ์ง ํ›… ๋ถ„๋ฆฌ
seongwon030 Mar 22, 2026
ea35403
refactor: ๋…ธ์…˜ ์บ˜๋ฆฐ๋” UI ์ƒํƒœ ํ›… ๋ถ„๋ฆฌ
seongwon030 Mar 22, 2026
7dec85a
refactor: ๋…ธ์…˜ OAuth ๋กœ์ง ํ›… ๋ถ„๋ฆฌ
seongwon030 Mar 22, 2026
989aab3
refactor: ์บ˜๋ฆฐ๋” ์—ฐ๋™ ์กฐํ•ฉ ํ›… ๊ตฌ์„ฑ
seongwon030 Mar 22, 2026
3c96345
feat: ์บ˜๋ฆฐ๋” ๋ผ์šฐํŠธ ์ถ”๊ฐ€
seongwon030 Mar 22, 2026
4881b43
style: ํ™๋ณด ์นด๋“œ ์—ฌ๋ฐฑ ๋ฐ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ˆ˜์ •
suhyun113 Mar 22, 2026
3d2749c
Merge branch 'develop-fe' into feature/#1295-promotion-board-page-MOAโ€ฆ
suhyun113 Mar 22, 2026
bb1915e
refactor: Filter ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ ์œ„์น˜ ์ด๋™
suhyun113 Mar 23, 2026
e4f183a
refactor: Filter ์ปดํฌ๋„ŒํŠธ ๋กœ์ง ๋ถ„๋ฆฌ ๋ฐ usePromotionNotification ํ›… ๋„์ž…
suhyun113 Mar 23, 2026
0e7b45b
fix: Story ํŒŒ์ผ ์˜ค๋ฅ˜ ์ˆ˜์ •
suhyun113 Mar 23, 2026
81c972c
refactor: Prettier ์ฝ”๋“œ ํฌ๋งท ์ •๋ฆฌ
suhyun113 Mar 23, 2026
1572f9c
fix: build ์—๋Ÿฌ ์ˆ˜์ •
suhyun113 Mar 23, 2026
52112ab
refactor: Prettier ์ฝ”๋“œ ํฌ๋งท ์ •๋ฆฌ
suhyun113 Mar 23, 2026
bc81f2a
fix: build ์—๋Ÿฌ ์ˆ˜์ •
suhyun113 Mar 24, 2026
bd10eb5
fix: ์บ˜๋ฆฐ๋” ๋‚ ์งœ ํŒŒ์‹ฑ๊ณผ Notion OAuth ์ฝœ๋ฐฑ URL ์ •๋ฆฌ
seongwon030 Mar 24, 2026
1309e42
feat: ๋‚ ์งœ ํฌ๋งท ์œ ํ‹ธ(KST ๋ณ€ํ™˜) ๋ถ„๋ฆฌ ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€
suhyun113 Mar 24, 2026
18a4d54
fix: ํ™๋ณด ์ƒ์„ธ ์กฐํšŒ id ์ฐธ์กฐ ์˜ค๋ฅ˜ ์ˆ˜์ •
suhyun113 Mar 24, 2026
972b246
fix: D-day ๊ณ„์‚ฐ ๋กœ์ง ๊ธฐ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ ๊ฐœ์„  ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€
suhyun113 Mar 24, 2026
255591d
refactor: promotion ๊ด€๋ จ ์œ ํ‹ธ ํ•จ์ˆ˜ ๋„๋ฉ”์ธ ํด๋”๋กœ ๋ถ„๋ฆฌ
suhyun113 Mar 24, 2026
aced3e6
fix: lint error
seongwon030 Mar 25, 2026
7a840ac
fix: ํ™๋ณด ์ด๋ฒคํŠธ ์ •๋ ฌ util ๋ถ„๋ฆฌ ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€
suhyun113 Mar 25, 2026
18a8cca
fix: D-day ๊ณ„์‚ฐ ๋กœ์ง ์‹œ๊ฐ„ ๊ธฐ์ค€ ํฌํ•จํ•˜๋„๋ก ์ˆ˜์ • ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ณด์™„
suhyun113 Mar 25, 2026
60283f6
refactor: Prettier ์ฝ”๋“œ ํฌ๋งท ์ •๋ฆฌ
suhyun113 Mar 25, 2026
68a6311
feat: ์ด๋™์•„๋ฆฌ์—ฐํ•ฉํšŒ ๋Œ€ํ‘œ์ž ์ด๋ฏธ์ง€ ์ถ”๊ฐ€ ๋ฐ ๋ฉค๋ฒ„ ํƒ€์ž…๋ณ„ ํ”„๋กœํ•„ ๋ฐฐ๊ฒฝ์ƒ‰ ์ ์šฉ
suhyun113 Mar 26, 2026
2d22682
feat: ์ด๋™์—ฐ ๊ฐ์˜ค ์ถ”๊ฐ€ ๋ฐ ํƒœ๋ธ”๋ฆฟ ์ดํ•˜์—์„œ ์ˆจ๊น€ ์ฒ˜๋ฆฌ
suhyun113 Mar 26, 2026
ec68da9
refactor: Prettier ์ฝ”๋“œ ํฌ๋งท ์ •๋ฆฌ
suhyun113 Mar 26, 2026
a6113ed
feat: ๋™์•„๋ฆฌ ์ผ์ • get api์ถ”๊ฐ€
seongwon030 Mar 26, 2026
7fd173c
feat: ์ผ์ •๋ณด๊ธฐ ํƒญ ํด๋ฆญ ์ด๋ฒคํŠธ ์ถ”๊ฐ€
seongwon030 Mar 26, 2026
81a2d5d
feat: ์บ˜๋ฆฐ๋” querykey์ถ”๊ฐ€
seongwon030 Mar 26, 2026
b2701c8
feat: ์บ˜๋ฆฐ๋” useQuery์ถ”๊ฐ€
seongwon030 Mar 26, 2026
cf15433
feat: ์บ˜๋ฆฐ๋” ์ด๋ฒคํŠธ ํƒ€์ž… ์ถ”๊ฐ€
seongwon030 Mar 26, 2026
3841cd6
feat: ์ƒ์„ธํŽ˜์ด์ง€ ์ผ์ •๋ณด๊ธฐ ํƒญ ์ถ”๊ฐ€
seongwon030 Mar 26, 2026
0466d49
fix: styled-components ์ปค์Šคํ…€ props DOM ์ „๋‹ฌ ๋ฌธ์ œ ์ˆ˜์ •
suhyun113 Mar 26, 2026
359d5b0
feat: ๋™์•„๋ฆฌ ์ƒ์„ธ ํŽ˜์ด์ง€ ์ผ์ • ์บ˜๋ฆฐ๋” ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€
seongwon030 Mar 27, 2026
b2aca7b
fix: lint error
seongwon030 Mar 27, 2026
b887d97
refactor: Google/Notion ํƒ€์ž…์„ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ
seongwon030 Mar 28, 2026
195ecd9
fix: clearError๋ฅผ useCallback์œผ๋กœ ๊ฐ์‹ธ์„œ ์ฐธ์กฐ๊ฐ€ ์œ ์ง€
seongwon030 Mar 28, 2026
71ee3ce
fix: OAuth ์™„๋ฃŒ ํ›„ sessionStorage state ์ •๋ฆฌ
seongwon030 Mar 28, 2026
0f2377e
fix: parseDateKey datetime ํƒ€์ž„์กด ์ฒ˜๋ฆฌ ๊ฐœ์„ 
seongwon030 Mar 28, 2026
ab0a3f0
fix: Google OAuth state ๊ฒ€์ฆ ํ›„ sessionStorage ์ •๋ฆฌ
seongwon030 Mar 28, 2026
12982cd
feat: ์บ˜๋ฆฐ๋” ๋ฐ์ดํ„ฐ ์—†์œผ๋ฉด ์ผ์ • ํƒญ ์ˆจ๊น€
seongwon030 Mar 28, 2026
6f04500
feat: ์บ˜๋ฆฐ๋” ๋ฐ์ดํ„ฐ lazy loading ๋ฐ ์บ์‹ฑ ์ตœ์ ํ™”
seongwon030 Mar 28, 2026
5fb0cbf
Merge pull request #1352 from Moadong/feature/#1350-calendar-fe-MOA-759
seongwon030 Mar 29, 2026
a1dbfcd
feat: ์ƒ์„ธํŽ˜์ด์ง€ ๋ฐฉ๋ฌธ ์‹œ ๋ชจ์ง‘ ์ƒํƒœ Mixpanel ๋กœ๊น… ์ถ”๊ฐ€
seongwon030 Mar 29, 2026
7262545
chore: ๋ถˆํ•„์š” ํŒŒ์ผ์ œ๊ฑฐ
seongwon030 Mar 29, 2026
d1cfef2
fix: recruitmentStatus๋ฅผ ๋ณ„๋„ effect๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ค‘๋ณต ์ด๋ฒคํŠธ ๋ฐฉ์ง€
seongwon030 Mar 29, 2026
6803a4e
Merge pull request #1362 from Moadong/feature/#1361-clubdetail-recruiโ€ฆ
seongwon030 Mar 29, 2026
1a9126d
chore: commit ์ปค๋งจ๋“œ ์ถ”๊ฐ€
seongwon030 Mar 29, 2026
49d3951
docs(commands): commit ์ปค๋งจ๋“œ ๋ฌธ๋ฒ• ๋ฐ ์„ค๋ช… ์ˆ˜์ •
seongwon030 Mar 29, 2026
5878734
chore(commands): test ์ปค๋งจ๋“œ ์ถ”๊ฐ€
seongwon030 Mar 29, 2026
2e8bf29
Merge pull request #1356 from Moadong/feature/#1355-club-union-intro-โ€ฆ
suhyun113 Mar 29, 2026
88ee498
feat: ํ™๋ณด ๊ฒŒ์‹œ๋ฌผ์ด 0๊ฐœ์ธ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ ๋กœ์ง ์ถ”๊ฐ€
suhyun113 Mar 29, 2026
034e15e
Merge pull request #1364 from Moadong/chore/#1363-claude-commands-MOAโ€ฆ
seongwon030 Mar 30, 2026
0151cf8
fix: ํ™๋ณด ๊ฒŒ์‹œ๊ธ€ polling ์ฃผ๊ธฐ ์ตœ์ ํ™”
suhyun113 Mar 30, 2026
02485cc
fix: Related ์ด๋ฒคํŠธ ์ด๋™ ์‹œ id ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์œผ๋กœ ์ˆ˜์ • ๋ฐ ํžˆ์Šคํ† ๋ฆฌ replace ์ ์šฉ ๋ฐ ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ์Šคํฌ๋กคโ€ฆ
suhyun113 Mar 30, 2026
ab84336
refactor: prettier ์ฝ”๋“œ ํฌ๋งท ์ •๋ฆฌ
suhyun113 Mar 30, 2026
6f2bea5
Merge pull request #1337 from Moadong/feature/#1295-promotion-board-pโ€ฆ
suhyun113 Mar 30, 2026
ed5588e
feat: add source field to ClubCalendarEvent type
seongwon030 Mar 30, 2026
efbdb5d
feat: add Google Calendar backend API functions
seongwon030 Mar 30, 2026
90f1234
feat: create GoogleCallbackPage for OAuth callback handling
seongwon030 Mar 30, 2026
77d7524
feat: add /callback/google route for Google OAuth
seongwon030 Mar 30, 2026
db68c95
refactor: replace client-side Google OAuth with backend integration
seongwon030 Mar 30, 2026
33a0463
refactor: update useCalendarSync to use new Google hook interface
seongwon030 Mar 30, 2026
3d9342f
refactor(calendar): Google ์บ˜๋ฆฐ๋” ์—ฐ๊ฒฐ UI ๊ฐœ์„ 
seongwon030 Apr 1, 2026
0cd44b9
fix: lint
seongwon030 Apr 1, 2026
7ba6060
docs: ๊ตฌ๊ธ€์บ˜๋ฆฐ๋” ํ”ผ์ฒ˜ ๋ฌธ์„œ ์ˆ˜์ •
seongwon030 Apr 1, 2026
584ee6e
fix: lint
seongwon030 Apr 1, 2026
332c08b
fix(calendar): ์ดˆ๊ธฐ ์—ฐ๊ฒฐ ํ™•์ธ๊ณผ ์‚ฌ์šฉ์ž ์•ก์…˜ ๋กœ๋”ฉ ์ƒํƒœ ๋ถ„๋ฆฌ
seongwon030 Apr 1, 2026
cdecb27
docs: commit ๋ช…๋ น์–ด์— ๊ทœ์น™์ถ”๊ฐ€
seongwon030 Apr 1, 2026
1e907a3
fix: lint
seongwon030 Apr 1, 2026
5e04c04
fix: ์„œ๋ฒ„๊ฐ€ ์ €์žฅํ•œ ์บ˜๋ฆฐ๋” ์„ ํƒ ์ƒํƒœ ๋ณต์›
seongwon030 Apr 1, 2026
5f9f6ed
fix: lint
seongwon030 Apr 1, 2026
17db254
refactor: ApiError๋กœ ์—๋ŸฌํŒ๋ณ„ํ•˜๋„๋ก ๋ณ€๊ฒฝ
seongwon030 Apr 1, 2026
e503612
fix: OAuth์„ฑ๊ณต ์‹œ ํ™•์ธ ํ”Œ๋ž˜๊ทธ ๋‚ด๋ฆผ
seongwon030 Apr 1, 2026
c8befe9
refactor: ์‚ฌ์ด๋“œ๋ฐ”์— ์บ˜๋ฆฐ๋” ์ฃผ์„์ฒ˜๋ฆฌ
seongwon030 Apr 1, 2026
45d2d76
Merge pull request #1371 from Moadong/feature/#1369-google-calendar-fโ€ฆ
seongwon030 Apr 1, 2026
54f4bda
feat: Google ์บ˜๋ฆฐ๋”์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” `fetchGoogleCalendarEvents` ํ•จ์ˆ˜ ์ถ”๊ฐ€
seongwon030 Apr 2, 2026
e8e6ce2
feat: CalendarEvent ์Šคํƒ€์ผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์†Œ์Šค์— ๋”ฐ๋ผ ๋ฐฐ๊ฒฝ์ƒ‰ ๋ณ€๊ฒฝ
seongwon030 Apr 2, 2026
c66a06d
feat: ํ†ตํ•ฉ ์บ˜๋ฆฐ๋” ์ผ์ • ์นด๋“œ์— Google ์ด๋ฒคํŠธ ์ง€์› ์ถ”๊ฐ€
seongwon030 Apr 2, 2026
8217d3a
feat: ํ†ตํ•ฉ ์บ˜๋ฆฐ๋” UI ์ƒํƒœ ๊ด€๋ฆฌ ์ถ”๊ฐ€
seongwon030 Apr 2, 2026
cf7f6c5
feat: Google ์บ˜๋ฆฐ๋” ์ด๋ฒคํŠธ ๋กœ๋“œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
seongwon030 Apr 2, 2026
d965a40
feat: useUnifiedCalendarUiState ํ›… ์ถ”๊ฐ€ํ•˜์—ฌ ํ†ตํ•ฉ ์บ˜๋ฆฐ๋” UI ์ƒํƒœ ๊ด€๋ฆฌ
seongwon030 Apr 2, 2026
f318615
feat: GoogleCalendarEvent ์ธํ„ฐํŽ˜์ด์Šค ์ถ”๊ฐ€
seongwon030 Apr 2, 2026
d7e3b0c
feat: ํ†ตํ•ฉ ์บ˜๋ฆฐ๋” ์ด๋ฒคํŠธ ๋ณ€ํ™˜ ์œ ํ‹ธ ์ถ”๊ฐ€
seongwon030 Apr 2, 2026
be5760a
feat: ํ†ตํ•ฉ ์บ˜๋ฆฐ๋” ๋ฌธ์„œ ์ถ”๊ฐ€
seongwon030 Apr 2, 2026
a120105
fix: ์˜๋„์™€ ๋ถˆ์ผ์น˜ํ•œ ์ฃผ์„์ œ๊ฑฐ
seongwon030 Apr 3, 2026
3608199
fix: notionEventEnabledMap ์ฐธ์กฐ๋ฅผ unifiedCalendar๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ
seongwon030 Apr 3, 2026
6ab42ef
refactor: ์ฃผ์„ ๋ฐ ์˜์กด์„ฑ ์ •๋ฆฌ
seongwon030 Apr 3, 2026
9036fb2
refactor: ๋””๋ฒ„๊น… ๋กœ๊ทธ ์ œ๊ฑฐ
seongwon030 Apr 3, 2026
7d52834
feat: ๋‚ ์งœ ํฌ๋งทํŒ… ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฐ ์บ˜๋ฆฐ๋” ๋™๊ธฐํ™” ํƒญ ์—…๋ฐ์ดํŠธ
seongwon030 Apr 3, 2026
f07f242
feat: Google Calendar ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์š”์ฒญ ๊ด€๋ฆฌ ๊ฐœ์„ 
seongwon030 Apr 3, 2026
a1467ca
refactor: parseDateKey ํ•จ์ˆ˜ ๊ฐœ์„  ๋ฐ ์ฃผ์„ ์—…๋ฐ์ดํŠธ
seongwon030 Apr 3, 2026
2ccea4a
refactor: Google Calendar ์ด๋ฒคํŠธ ์กฐํšŒ ๊ธฐ๊ฐ„ ์ฃผ์„ ์—…๋ฐ์ดํŠธ
seongwon030 Apr 3, 2026
f888052
feat: Google Calendar ์ด๋ฒคํŠธ ๋กœ๋“œ ์š”์ฒญ ๊ด€๋ฆฌ ๊ฐœ์„ 
seongwon030 Apr 3, 2026
1e2adb7
fix: ์ฝ”๋“œ ๋ธ”๋ก ์–ธ์–ด ํƒœ๊ทธ ์ˆ˜์ •
seongwon030 Apr 3, 2026
91e2b16
fix: lint error
seongwon030 Apr 3, 2026
5527141
Merge pull request #1376 from Moadong/feature/#1373-google-calendar-uโ€ฆ
seongwon030 Apr 3, 2026
4b08f84
chore: mockServiceWorker.js๋ฅผ ๋ฌด์‹œํ•˜๊ธฐ์œ„ํ•œ .eslintignore ์ถ”๊ฐ€
seongwon030 Apr 5, 2026
ea8e751
docs: CLAUDE.md์—์„œ API ํ—ฌํผ ํ•จ์ˆ˜ ์„ค๋ช… ์—…๋ฐ์ดํŠธ
seongwon030 Apr 5, 2026
fcbdf0b
style: CalendarSyncTab stylesํŒŒ์ผ theme์ƒ์ˆ˜์ ์šฉ
seongwon030 Apr 5, 2026
8ee2431
style: media์ƒ์ˆ˜๋กœ media Query๋ณ€๊ฒฝ
seongwon030 Apr 5, 2026
f91e505
fix: Notion ์บ˜๋ฆฐ๋” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ์—…๋ฐ์ดํŠธ
seongwon030 Apr 5, 2026
eb6e4d7
feat: Google Calendar ํ†ตํ•ฉ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
seongwon030 Apr 5, 2026
5785f6e
fix: Notion ์บ˜๋ฆฐ๋” ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์š”์ฒญ ๊ด€๋ฆฌ ๊ฐœ์„ 
seongwon030 Apr 5, 2026
58fff52
fix: ๊ฐœ์„ ๋œ Notion ์บ˜๋ฆฐ๋” ์ด๋ฒคํŠธ ์ดˆ๊ธฐํ™” ๋กœ์ง
seongwon030 Apr 5, 2026
021db50
fix: Notion OAuth ์ธ์ฆ ์ •๋ณด ์ฒ˜๋ฆฌ ๊ฐœ์„ 
seongwon030 Apr 5, 2026
bc5a817
fix: CalendarSyncTab ์ดˆ๊ธฐํ™” ๋กœ์ง ๊ฐœ์„ 
seongwon030 Apr 5, 2026
2594106
fix: ๊ฐœ์„ ๋œ activeTab ๋กœ์ง ๋ฐ useEffect ์ถ”๊ฐ€
seongwon030 Apr 5, 2026
4d0b10a
fix: ๊ฐœ์„ ๋œ ClubScheduleCalendar ์ดˆ๊ธฐํ™” ๋กœ์ง
seongwon030 Apr 5, 2026
5ff8968
fix: URL ์ธ์ฝ”๋”ฉ์„ ํ†ตํ•œ ํด๋Ÿฝ ์ƒ์„ธ ํŽ˜์ด์ง€ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐœ์„ 
seongwon030 Apr 5, 2026
db56fed
fix: ๊ฐœ์„ ๋œ promotionNotification ๋กœ์ง
seongwon030 Apr 5, 2026
dac2e7b
fix: ๊ฐœ์„ ๋œ createState ํ•จ์ˆ˜ ๊ตฌํ˜„
seongwon030 Apr 5, 2026
6e95dda
fix: ๊ฐœ์„ ๋œ buildMonthCalendarDays ํ•จ์ˆ˜ ๋กœ์ง
seongwon030 Apr 5, 2026
6f89739
fix: ๊ฐœ์„ ๋œ formatKSTDateTime ํ•จ์ˆ˜์˜ ๋‚ ์งœ ์ฒ˜๋ฆฌ ๋กœ์ง
seongwon030 Apr 5, 2026
5e545ce
fix: ๊ฐœ์„ ๋œ sortPromotions ํ•จ์ˆ˜์˜ ์ •๋ ฌ ๋กœ์ง
seongwon030 Apr 5, 2026
ca2a297
fix: ํด๋Ÿฝ ์ƒ์„ธ ํŽ˜์ด์ง€์˜ ์บ˜๋ฆฐ๋” ์—ฐ๊ฒฐ ๋กœ์ง ๊ฐœ์„ 
seongwon030 Apr 5, 2026
0d967a5
fix: ๊ฐœ์„ ๋œ useGoogleCalendarData ํ›…์˜ ๋กœ์ง
seongwon030 Apr 5, 2026
a7a0368
fix: ClubScheduleCalendar์— key prop ์ถ”๊ฐ€
seongwon030 Apr 5, 2026
db02c97
fix: lint error
seongwon030 Apr 5, 2026
3adb2fc
Merge pull request #1387 from Moadong/fix/pr-review-1386
seongwon030 Apr 5, 2026
7561a78
fix: eslintignore์„ config๋กœ ์ด๋™
seongwon030 Apr 5, 2026
ff39fd1
Merge pull request #1389 from Moadong/fix/pr-review-1386
seongwon030 Apr 5, 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
152 changes: 152 additions & 0 deletions frontend/.claude/commands/commit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
---
description: ์„ธ์…˜ ์ž‘์—… ๊ธฐ๋ก + ๊ธฐ๋Šฅ ๋ฌธ์„œํ™” + ๋ณ€๊ฒฝ ๋‚ด์šฉ ์ปค๋ฐ‹
allowed-tools: Bash(mkdir *), Bash(ls *), Bash(date *), Bash(git status), Bash(git diff *), Bash(git log *), Bash(git add *), Bash(git commit *), Read, Write, Edit, Glob, Grep
---

# ์ž‘์—… ์ง€์‹œ

ํ˜„์žฌ ์„ธ์…˜์˜ ์ž‘์—… ๋‚ด์šฉ์„ ๊ธฐ๋กํ•˜๊ณ , ๊ธฐ๋Šฅ๋ณ„ ๋ฌธ์„œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•œ ๋’ค, ๋ณ€๊ฒฝ ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.

---

## Phase 1: ์„ธ์…˜ ๊ธฐ๋ก

๋จผ์ € ์„ธ์…˜ ์ž‘์—… ๋‚ด์šฉ์„ dailyNote์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

1. `dailyNote/` ํด๋”๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑ
2. ์˜ค๋Š˜ ๋‚ ์งœ ํŒŒ์ผ ํ™•์ธ (ํ˜•์‹: `YYYY-MM-DD.md`)
3. ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ, ์žˆ์œผ๋ฉด ๊ธฐ์กด ๋‚ด์šฉ ๋’ค์— `---` ๊ตฌ๋ถ„์„  ์ถ”๊ฐ€ ํ›„ ์ด์–ด์„œ ์ž‘์„ฑ

**๊ธฐ๋กํ•  ๋‚ด์šฉ:**

- ์„ธ์…˜์—์„œ ๋…ผ์˜ํ•œ ๋‚ด์šฉ
- ๊ณ ๋ฏผํ•œ ํ”์ ๊ณผ ์˜์‚ฌ๊ฒฐ์ • ๊ณผ์ • (Decision Log)
- ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ฒฝํ—˜
- ์ƒˆ๋กœ ๋ฐฐ์šด ๊ธฐ์ˆ ์ด๋‚˜ ๋ฐœ๊ฒฌํ•œ ๊ฒƒ๋“ค

**๊ธฐ๋ก ํ˜•์‹ ์˜ˆ์‹œ:**

```markdown
## [14:30] ์„ธ์…˜ ์š”์•ฝ

### ๋…ผ์˜ ๋‚ด์šฉ

- React Query์˜ stale time ์„ค์ •์— ๋Œ€ํ•ด ๊ณ ๋ฏผ

### Decision Log

- useEffect ์˜์กด์„ฑ ๋ฐฐ์—ด์—์„œ ํ•จ์ˆ˜ ์ฐธ์กฐ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด useCallback ์ ์šฉ ๊ฒฐ์ •

### ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

- MSW ํ•ธ๋“ค๋Ÿฌ์—์„œ ์‘๋‹ต ์ง€์—ฐ ์‹œ ์Šคํ† ๋ฆฌ๋ถ ๋ Œ๋”๋ง ์ด์Šˆ ๋ฐœ๊ฒฌ โ†’ delay ์‹œ๊ฐ„ ์กฐ์ •์œผ๋กœ ํ•ด๊ฒฐ
```

---

## Phase 2: ๊ธฐ๋Šฅ ๋ฌธ์„œํ™” (์„ ํƒ์ )

์„ธ์…˜์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ์ด ์žˆ์—ˆ๋‹ค๋ฉด ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค.

### ๊ธฐ๋Šฅ ๋งคํ•‘ ํ…Œ์ด๋ธ”

| ๊ธฐ๋Šฅ | ๋ฌธ์„œ ๊ฒฝ๋กœ | ํ‚ค์›Œ๋“œ |
| ------------------- | ---------------------------------- | ----------------------------------------------------------------------------------------- |
| Main Page | `docs/features/main/` | MainPage, ClubCard, Filter, Banner, CategoryButton, SearchBox, Popup |
| Club Detail | `docs/features/club-detail/` | ClubDetailPage, ClubFeed, ClubProfileCard, ShareButton, ApplyButton, ClubScheduleCalendar |
| Admin - Info | `docs/features/admin/info/` | ClubInfoEditTab, MakeTags, SelectTags |
| Admin - Intro | `docs/features/admin/intro/` | ClubIntroEditTab, AwardEditor, FAQEditor |
| Admin - Photo | `docs/features/admin/photo/` | PhotoEditTab, ImagePreview, ClubLogoEditor, ClubCoverEditor |
| Admin - Recruit | `docs/features/admin/recruit/` | RecruitEditTab, DateTimeRangePicker, MarkdownEditor |
| Admin - Application | `docs/features/admin/application/` | ApplicationEditTab, QuestionBuilder, ApplicationListTab |
| Admin - Applicants | `docs/features/admin/applicants/` | ApplicantsTab, ApplicantDetailPage, ApplicantsListTab |
| Admin - Calendar | `docs/features/admin/calendar/` | CalendarSyncTab, calendarOAuth |
| Admin - Account | `docs/features/admin/account/` | AccountEditTab, LoginTab, PrivateRoute |
| Application Form | `docs/features/application-form/` | ApplicationFormPage, QuestionAnswerer, QuestionContainer |
| Auth | `docs/features/auth/` | auth, secureFetch, refreshAccessToken, JWT |
| API Layer | `docs/features/api/` | apis, apiHelpers, handleResponse, withErrorHandling |
| Hooks | `docs/features/hooks/` | useClub, useApplication, useApplicants, React Query |
| Store | `docs/features/store/` | Zustand, useCategoryStore, useSearchStore |
| Components | `docs/features/components/` | ๊ณต์šฉ ์ปดํฌ๋„ŒํŠธ |
| Utils | `docs/features/utils/` | debounce, validateSocialLink, formatRelativeDateTime, recruitmentDateParser |
| Experiments | `docs/features/experiments/` | A/B test, useExperiment, Mixpanel |
| Festival | `docs/features/festival/` | FestivalPage, PerformanceCard, TimelineRow, BoothMapSection |
| Introduce | `docs/features/introduce/` | IntroducePage, FeatureSection |

์–ด๋ ค์šฐ๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌผ์–ด๋ด…๋‹ˆ๋‹ค. ๋งคํ•‘์— ์—†๋Š” ๊ธฐ๋Šฅ์ด๋ฉด ์ƒˆ ํด๋”๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

**๋ฌธ์„œ ํ˜•์‹:**

```markdown
# [์ œ๋ชฉ โ€” ์„ธ์…˜ ํ•ต์‹ฌ ์ฃผ์ œ]

[๋ณธ๋ฌธ โ€” ์„ธ์…˜์—์„œ ๋…ผ์˜/์ž‘์—…ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌ]

## ๊ด€๋ จ ์ฝ”๋“œ

- `[์„ธ์…˜์—์„œ ๋‹ค๋ฃฌ ํŒŒ์ผ ๊ฒฝ๋กœ]` โ€” [๊ฐ„๋‹จํ•œ ์„ค๋ช…]
```

**์›์น™:**

- ์–ต์ง€๋กœ ๋‚ด์šฉ์„ ๋Š˜๋ฆฌ์ง€ ์•Š๋Š”๋‹ค
- ๋Œ€ํ™”์ฒด โ†’ ๋ฌธ์„œ์ฒด๋กœ ๋ณ€ํ™˜
- ์ œ๋ชฉ, ๋ณธ๋ฌธ: ํ•œ๊ตญ์–ด / ์ฝ”๋“œ, ๊ฒฝ๋กœ, ๊ธฐ์ˆ  ์šฉ์–ด: ์˜์–ด

**๊ฒฐ๊ณผ ์ถœ๋ ฅ:**

```text
## ๋ฌธ์„œํ™” ์™„๋ฃŒ
- **๊ฒฝ๋กœ**: `docs/features/[๊ธฐ๋Šฅ]/[ํŒŒ์ผ๋ช…]`
- **๋‚ด์šฉ**: [1์ค„ ์š”์•ฝ]
```

---

## Phase 3: Git Commit

๊ธฐ๋ก์ด ์™„๋ฃŒ๋˜๋ฉด ์ปค๋ฐ‹์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

1. `git status`๋กœ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ ํ™•์ธ
2. `git diff HEAD`๋กœ ๋ชจ๋“  ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ (๋˜๋Š” `git diff`์™€ `git diff --staged`๋ฅผ ๊ฐ๊ฐ ์‹คํ–‰)
3. `git log --oneline -5`๋กœ ์ตœ๊ทผ ์ปค๋ฐ‹ ์Šคํƒ€์ผ ์ฐธ๊ณ 
4. ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ถ„์„ํ•˜์—ฌ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ
5. ๊ด€๋ จ ํŒŒ์ผ๋งŒ `git add`๋กœ ์Šคํ…Œ์ด์ง•
- `docs/features/` ๋ฌธ์„œ ํŒŒ์ผ ํฌํ•จ
- `dailyNote/`๋Š” gitignore ๋Œ€์ƒ์ด๋ฏ€๋กœ ์ œ์™ธ
6. **์ปค๋ฐ‹ ์ „์— ๋ณ€๊ฒฝ ๋‚ด์šฉ๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ™•์ธ ์š”์ฒญ**
7. ์‚ฌ์šฉ์ž ์Šน์ธ ํ›„ ์ปค๋ฐ‹ ์‹คํ–‰

**์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹:**

```text
<type>(<scope>): <subject>

<body>
```

**ํƒ€์ž…:**

- `feat`: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ
- `fix`: ๋ฒ„๊ทธ ์ˆ˜์ •
- `docs`: ๋ฌธ์„œ ๋ณ€๊ฒฝ
- `style`: ์ฝ”๋“œ ํฌ๋งทํŒ…
- `refactor`: ๋ฆฌํŒฉํ† ๋ง
- `test`: ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€/์ˆ˜์ •
- `chore`: ๊ธฐํƒ€ ๋ณ€๊ฒฝ

**์Šค์ฝ”ํ”„ ์˜ˆ์‹œ:**

- `main`, `club-detail`, `admin`, `application`, `auth`, `api`, `hooks`, `store`, `utils`, `components`

**์ฃผ์˜์‚ฌํ•ญ:**

- Co-Authored-By ๋ผ์ธ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค

---

## ์ฐธ๊ณ ์‚ฌํ•ญ

- dailyNote๋Š” `.gitignore`์— ํฌํ•จ๋˜์–ด ์ปค๋ฐ‹ ๋Œ€์ƒ์ด ์•„๋‹˜
- ๋ฌธ์„œํ™”๋Š” ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ๋งŒ ์ˆ˜ํ–‰ (๋งค ์„ธ์…˜ ํ•„์ˆ˜ ์•„๋‹˜)
- ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ์€ Phase 1๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์•„๋„ ๋จ
220 changes: 220 additions & 0 deletions frontend/.claude/commands/test.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
---
description: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (Jest / RTL / Playwright)
allowed-tools: Bash(npm run test *), Bash(npx jest *), Bash(npx playwright *), Read, Write, Edit, Glob, Grep
---

# ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

๋Œ€์ƒ ํŒŒ์ผ ๋˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

---

## Step 1: ํ…Œ์ŠคํŠธ ์œ ํ˜• ํ™•์ธ

์‚ฌ์šฉ์ž์—๊ฒŒ ํ…Œ์ŠคํŠธ ์œ ํ˜•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

1. **๋‹จ์œ„ ํ…Œ์ŠคํŠธ (Jest)** - ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜, ํ›…, ์ˆœ์ˆ˜ ๋กœ์ง
2. **์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ (RTL)** - React ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋ฐ ์ธํ„ฐ๋ž™์…˜
3. **E2E ํ…Œ์ŠคํŠธ (Playwright)** - ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ

---

## Step 2: ๋Œ€์ƒ ํŒŒ์ผ ๋ถ„์„

ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค:

- ํ•จ์ˆ˜/์ปดํฌ๋„ŒํŠธ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ
- ์—ฃ์ง€ ์ผ€์ด์Šค ๋ฐ ์˜ˆ์™ธ ์ƒํ™ฉ
- ์˜์กด์„ฑ (์™ธ๋ถ€ API, ์Šคํ† ์–ด, ๋ผ์šฐํ„ฐ ๋“ฑ)

---

## Step 3: ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

### ๋‹จ์œ„ ํ…Œ์ŠคํŠธ (Jest)

**ํŒŒ์ผ ์œ„์น˜**: ๋Œ€์ƒ ํŒŒ์ผ๊ณผ ๋™์ผ ๊ฒฝ๋กœ์— `*.test.ts` ์ƒ์„ฑ

**ํŒจํ„ด**:

```typescript
import { targetFunction } from './targetFile';

describe('targetFunction', () => {
beforeEach(() => {
// ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ •
});

afterEach(() => {
// ์ •๋ฆฌ
});

it('์ •์ƒ ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค', () => {
const result = targetFunction(input);
expect(result).toBe(expected);
});

it('์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค', () => {
// ...
});

it('์˜ˆ์™ธ ์ƒํ™ฉ์—์„œ ์ ์ ˆํžˆ ๋™์ž‘ํ•œ๋‹ค', () => {
// ...
});
});
```

**์ฒดํฌ๋ฆฌ์ŠคํŠธ**:

- [ ] ์ •์ƒ ๋™์ž‘ ์ผ€์ด์Šค
- [ ] ๊ฒฝ๊ณ„๊ฐ’ ํ…Œ์ŠคํŠธ
- [ ] ์˜ˆ์™ธ/์—๋Ÿฌ ์ผ€์ด์Šค
- [ ] ํƒ€์ด๋จธ ์‚ฌ์šฉ ์‹œ `jest.useFakeTimers()`
- [ ] ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” `async/await` ์‚ฌ์šฉ

---

### ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ (RTL)

**ํŒŒ์ผ ์œ„์น˜**: ์ปดํฌ๋„ŒํŠธ์™€ ๋™์ผ ๊ฒฝ๋กœ์— `*.test.tsx` ์ƒ์„ฑ

**ํŒจํ„ด**:

```typescript
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import { BrowserRouter } from 'react-router-dom';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import TargetComponent from './TargetComponent';

const queryClient = new QueryClient({
defaultOptions: {
queries: { retry: false },
},
});

const renderWithProviders = (ui: React.ReactElement) => {
return render(
<QueryClientProvider client={queryClient}>
<BrowserRouter>{ui}</BrowserRouter>
</QueryClientProvider>
);
};

describe('TargetComponent', () => {
beforeEach(() => {
queryClient.clear();
});

it('์ดˆ๊ธฐ ์ƒํƒœ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋œ๋‹ค', () => {
renderWithProviders(<TargetComponent />);
expect(screen.getByText('์˜ˆ์ƒ ํ…์ŠคํŠธ')).toBeInTheDocument();
});

it('์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐ˜์‘ํ•œ๋‹ค', async () => {
renderWithProviders(<TargetComponent />);

fireEvent.click(screen.getByRole('button', { name: '๋ฒ„ํŠผ๋ช…' }));

await waitFor(() => {
expect(screen.getByText('๋ณ€๊ฒฝ๋œ ํ…์ŠคํŠธ')).toBeInTheDocument();
});
});

it('๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค', () => {
// ...
});

it('์—๋Ÿฌ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค', () => {
// ...
});
});
```

**์ฒดํฌ๋ฆฌ์ŠคํŠธ**:

- [ ] ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์ƒํƒœ
- [ ] ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ (ํด๋ฆญ, ์ž…๋ ฅ ๋“ฑ)
- [ ] ๋กœ๋”ฉ/์—๋Ÿฌ ์ƒํƒœ
- [ ] ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง
- [ ] Props ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ์—…๋ฐ์ดํŠธ
- [ ] ํ•„์š”์‹œ MSW๋กœ API ๋ชจํ‚น

---

### E2E ํ…Œ์ŠคํŠธ (Playwright)

**ํŒŒ์ผ ์œ„์น˜**: `e2e/` ํด๋”์— `*.spec.ts` ์ƒ์„ฑ

**ํŒจํ„ด**:

```typescript
import { expect, test } from '@playwright/test';

test.describe('๊ธฐ๋Šฅ๋ช…', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/target-page');
});

test('์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์™„๋ฃŒํ•œ๋‹ค', async ({ page }) => {
// 1. ํŽ˜์ด์ง€ ๋กœ๋“œ ํ™•์ธ
await expect(
page.getByRole('heading', { name: 'ํŽ˜์ด์ง€ ์ œ๋ชฉ' }),
).toBeVisible();

// 2. ์‚ฌ์šฉ์ž ์•ก์…˜
await page.getByRole('button', { name: '๋ฒ„ํŠผ๋ช…' }).click();

// 3. ๊ฒฐ๊ณผ ํ™•์ธ
await expect(page.getByText('์„ฑ๊ณต ๋ฉ”์‹œ์ง€')).toBeVisible();
});

test('์—๋Ÿฌ ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค', async ({ page }) => {
// ...
});
});
```

**์ฒดํฌ๋ฆฌ์ŠคํŠธ**:

- [ ] ํ•ต์‹ฌ ์‚ฌ์šฉ์ž ํ”Œ๋กœ์šฐ
- [ ] ํผ ์ œ์ถœ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
- [ ] ๋„ค๋น„๊ฒŒ์ด์…˜
- [ ] ๋ฐ˜์‘ํ˜• (๋ชจ๋ฐ”์ผ/๋ฐ์Šคํฌํ†ฑ)
- [ ] ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ๋ณต๊ตฌ

---

## Step 4: ํ…Œ์ŠคํŠธ ์‹คํ–‰

```bash
# ๋‹จ์œ„/์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ
npx jest path/to/file.test.ts

# ์ „์ฒด ํ…Œ์ŠคํŠธ
npm run test

# E2E ํ…Œ์ŠคํŠธ
npx playwright test e2e/file.spec.ts

# E2E ํ…Œ์ŠคํŠธ (UI ๋ชจ๋“œ)
npx playwright test --ui
```

---

## ์ž‘์„ฑ ์›์น™

1. **ํ…Œ์ŠคํŠธ ์„ค๋ช…์€ ํ•œ๊ตญ์–ด๋กœ** - `it('์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค')`
2. **Given-When-Then ๊ตฌ์กฐ** - ์ค€๋น„ โ†’ ์‹คํ–‰ โ†’ ๊ฒ€์ฆ
3. **๋…๋ฆฝ์ ์ธ ํ…Œ์ŠคํŠธ** - ํ…Œ์ŠคํŠธ ๊ฐ„ ์˜์กด์„ฑ ์—†์Œ
4. **์˜๋ฏธ ์žˆ๋Š” ํ…Œ์ŠคํŠธ๋ช…** - ๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ
5. **๊ณผ๋„ํ•œ ๋ชจํ‚น ์ง€์–‘** - ์‹ค์ œ ๋™์ž‘์— ๊ฐ€๊น๊ฒŒ

---

## ์ฐธ๊ณ : ํ”„๋กœ์ ํŠธ ํ…Œ์ŠคํŠธ ์„ค์ •

- Jest ์„ค์ •: `jest.config.js`
- RTL ์„ค์ •: `@testing-library/react`, `@testing-library/jest-dom`
- MSW ํ•ธ๋“ค๋Ÿฌ: `src/mocks/handlers/`
- Playwright ์„ค์ •: `playwright.config.ts` (์—†์œผ๋ฉด ์ƒ์„ฑ ํ•„์š”)
1 change: 0 additions & 1 deletion frontend/.claude/commands/tm/auto-implement-tasks.md

This file was deleted.

1 change: 0 additions & 1 deletion frontend/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@ npm run generate:sitemap # sitemap.xml ์ƒ์„ฑ
API๋Š” `src/apis/utils/apiHelpers.ts`์˜ ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๊ด€๋œ ํŒจํ„ด์„ ๋”ฐ๋ฆ„:

- `handleResponse<T>()` - ์‘๋‹ต ํŒŒ์‹ฑ, `{ data: {...} }` ํ˜•์‹ ์ž๋™ ์–ธ๋ž˜ํ•‘
- `withErrorHandling()` - API ํ˜ธ์ถœ์„ ์—๋Ÿฌ ๋กœ๊น…์œผ๋กœ ๋ž˜ํ•‘
- `secureFetch()` - ์ธ์ฆ๋œ ์š”์ฒญ, 403 ์‹œ ํ† ํฐ ์ž๋™ ๊ฐฑ์‹ 

์ฟผ๋ฆฌ ํ‚ค๋Š” `src/constants/queryKeys.ts`์— ์ค‘์•™ ๊ด€๋ฆฌ.
Expand Down
4 changes: 2 additions & 2 deletions frontend/codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ coverage:
status:
project:
default:
enabled: false # ์ „์ฒด ํ”„๋กœ์ ํŠธ ๋ ˆ๋ฒจ์˜ status ์ฒดํฌ ๋น„ํ™œ์„ฑํ™”
enabled: false # ์ „์ฒด ํ”„๋กœ์ ํŠธ ๋ ˆ๋ฒจ์˜ status ์ฒดํฌ ๋น„ํ™œ์„ฑํ™”
patch:
default:
enabled: false # PR(patch) ๋ ˆ๋ฒจ์˜ status ์ฒดํฌ ๋น„ํ™œ์„ฑํ™”
enabled: false # PR(patch) ๋ ˆ๋ฒจ์˜ status ์ฒดํฌ ๋น„ํ™œ์„ฑํ™”
Loading
Loading