Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
172 commits
Select commit Hold shift + click to select a range
6ead99e
round1: 1์ฃผ์ฐจ ๋ฌธ์„œ, ๊ณผ์ œ ์ถ”๊ฐ€
JVHE Oct 28, 2025
8e06929
round1: redis, kafka ์„ค์ • ์ฃผ์„ ์ฒ˜๋ฆฌ
JVHE Oct 28, 2025
5569bf6
round1: User ๊ฐ์ฒด ๊ตฌํ˜„, ํ…Œ์ŠคํŠธ ์ž‘์„ฑ (ID)
JVHE Oct 28, 2025
ee02ce7
round1: User email ํ•„๋“œ ์ถ”๊ฐ€, email ์ œ์•ฝ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
JVHE Oct 28, 2025
e1d3f05
round1: User birthday ์ถ”๊ฐ€, birthday ์ œ์•ฝ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
JVHE Oct 28, 2025
b399fde
round1: User userId, email, birthday null ์•ˆ๋˜๋„๋ก ์ˆ˜์ •, ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
JVHE Oct 28, 2025
a143f91
round1: User๊ฐ€ BaseEntity ์ƒ์†๋ฐ›๋„๋ก ์ˆ˜์ •,User.id -> User.userId๋กœ ์ˆ˜์ •
JVHE Oct 29, 2025
0096dae
round1: ์œ ์ € ์ €์žฅ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
JVHE Oct 29, 2025
7f05b54
round1: ํšŒ์› ๊ฐ€์ž… API ๊ธฐ๋Šฅ ์ถ”๊ฐ€
JVHE Oct 29, 2025
ca1fed1
round1: ์œ ์ € ๊ฐ€์ž… ์„ฑ๋ณ„์š”๊ฑด ์ถ”๊ฐ€
JVHE Oct 30, 2025
d5280ea
round1: ๋‚ด ์ •๋ณด ์กฐํšŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
JVHE Oct 30, 2025
05b7b2a
round1: ํฌ์ธํŠธ ์กฐํšŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
JVHE Oct 31, 2025
227d932
round1: ํฌ์ธํŠธ ์ถฉ์ „ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
JVHE Oct 31, 2025
003b543
docs: 1round.md ์ถ”๊ฐ€
adminhelper Oct 27, 2025
00498cd
feat: User ๋„๋ฉ”์ธ ์ถ”๊ฐ€
adminhelper Oct 27, 2025
1ad67da
test: ํšŒ์›๊ฐ€์ž… ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
adminhelper Oct 27, 2025
4a13366
feat : User ๊ฐ’๊ฐ์ฒด ํ…Œ์ŠคํŠธ ์™„๋ฃŒ ํ›„ ์‚ญ์ œ
bookers-web Oct 28, 2025
bc962b2
feat : User ๊ฐ์ฒด ์ถ”๊ฐ€
bookers-web Oct 28, 2025
0605dc4
docs: 1round.md ๋ฌธ์„œ์ˆ˜์ •
adminhelper Oct 28, 2025
f1d94ed
feat: UserRepository, UserService ์ƒ์„ฑ
adminhelper Oct 28, 2025
a51021c
test: ํšŒ์› ๊ฐ€์ž… ํ†ตํ•ฉํ…Œ์ŠคํŠธ ์ž‘์„ฑ
adminhelper Oct 28, 2025
a946ac0
fix: ๋ถˆํ•„์š”ํ•œ import ์ˆ˜์ •
adminhelper Oct 28, 2025
33c0ab8
test: ๋‚ด์ •๋ณด ์กฐํšŒ ๋ฐ E2E ํ…Œ์ŠคํŠธ
adminhelper Oct 29, 2025
b73c2c6
docs: 1round.md check list update
adminhelper Oct 29, 2025
8d5e90a
feat: ํฌ์ธํŠธ ์กฐํšŒ ๋„๋ฉ”์ธ ์ถ”๊ฐ€
adminhelper Oct 29, 2025
d6711cf
feat: ๋‚ด์ •๋ณด ์กฐํšŒ ๋ฐ E2E ํ…Œ์ŠคํŠธ
adminhelper Oct 29, 2025
7a56684
docs: 1round.md ์š”๊ตฌ์‚ฌํ•ญ ์™„๋ฃŒ
adminhelper Oct 30, 2025
ded9e38
chore: ํŒŒ์ผ ์œ„์น˜ ์ด๋™
adminhelper Oct 30, 2025
5b83c03
feat: ํฌ์ธํŠธ ๋„๋ฉ”์ธ ์ถ”๊ฐ€
adminhelper Oct 30, 2025
3158c2b
test: ํฌ์ธํŠธ ๋„๋ฉ”์ธ ๋‹จ์œ„ํ…Œ์ŠคํŠธ
adminhelper Oct 30, 2025
e287600
test: ํฌ์ธํŠธ ๋„๋ฉ”์ธ ํ†ตํ•ฉํ…Œ์ŠคํŠธ
adminhelper Oct 30, 2025
9c5e6ea
test: ํฌ์ธํŠธ ๋„๋ฉ”์ธ E2Eํ…Œ์ŠคํŠธ
adminhelper Oct 30, 2025
3774002
refactor: ํšŒ์› ๋„๋ฉ”์ธ ๋ฆฌํŒฉํ† ๋ง
adminhelper Oct 30, 2025
8e5643a
chore: ํšŒ์› ๋„๋ฉ”์ธ ๋ฆฌํŒฉํ† ๋ง
adminhelper Oct 30, 2025
ef3eebd
style: ์ฝ”๋“œ ์ž๋™์ •๋ ฌ
bookers-web Oct 31, 2025
d738654
remove: sample code ์‚ญ์ œ
bookers-web Oct 31, 2025
b06e034
chore: ํ…Œ์ŠคํŠธ์ฝ”๋“œ given when then ์ž‘์„ฑ
bookers-web Oct 31, 2025
6c48755
fix: Exception ๋ฉ”์‹œ์ง€ ์ถ”๊ฐ€
bookers-web Oct 31, 2025
d9ae7ad
Add GitHub Actions workflow for PR Agent
LenKIM Nov 3, 2025
5bb8d33
docs : ์œ ์ € ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ ์ •์˜, ์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ
adminhelper Nov 7, 2025
d505115
docs : ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ
adminhelper Nov 7, 2025
624b780
docs : ๋„๋ฉ”์ธ ๊ฐ์ฒด ์„ค๊ณ„ (ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ)
adminhelper Nov 7, 2025
a97d77b
docs : ์ „์ฒด ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๋ฐ ๊ด€๊ณ„ ์ •๋ฆฌ
adminhelper Nov 7, 2025
55f8c8b
docs : 2round ๋ฌธ์„œ
adminhelper Nov 7, 2025
592a4e5
docs : 1round ๋ฌธ์„œ
adminhelper Nov 7, 2025
4faa67e
round1: ๋ฆฌ๋ทฐ ์ ์šฉ
JVHE Nov 8, 2025
86a8205
round1: ๋ฆฌ๋ทฐ ์ ์šฉ
JVHE Nov 11, 2025
d06a0d0
round1: ๋ฆฌ๋ทฐ ์ ์šฉ - JPA repo ๊ตฌํ˜„์ฒด ๋ถ„๋ฆฌ
JVHE Nov 11, 2025
5042c22
docs : 2round ๋ฌธ์„œ ์ˆ˜์ •
adminhelper Nov 14, 2025
4fda674
docs : 3round ๋ฌธ์„œ์ถ”๊ฐ€
adminhelper Nov 14, 2025
25b423e
feat(brand): ๋ธŒ๋žœ๋“œ ๋„๋ฉ”์ธ ๋ชจ๋ธ ๋ฐ ๋„๋ฉ”์ธ ์„œ๋น„์Šค ๊ตฌํ˜„
adminhelper Nov 14, 2025
04ff345
feat(product): ์ƒํ’ˆ ๋„๋ฉ”์ธ ๋ชจ๋ธ ๊ตฌํ˜„ ๋ฐ ์žฌ๊ณ /์ •๋ ฌ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
adminhelper Nov 14, 2025
7e0ac82
feat(like): ์ข‹์•„์š” ๋„๋ฉ”์ธ ๊ตฌํ˜„ ๋ฐ ๋ฉฑ๋“ฑ์„ฑ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€
adminhelper Nov 14, 2025
1087ea2
feat(order, point): ์ฃผ๋ฌธ ์ƒ์„ฑ ์œ ์Šค์ผ€์ด์Šค ๋ฐ ํฌ์ธํŠธ ์ฐจ๊ฐ ๋„๋ฉ”์ธ ๊ตฌํ˜„
adminhelper Nov 14, 2025
3e2e0f4
round3: Product, Brand, Like, Order ๋„๋ฉ”์ธ ๊ตฌํ˜„
JVHE Nov 13, 2025
5db5c36
round3: ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ํŒŒ์ผ ์ œ๊ฑฐ
JVHE Nov 14, 2025
aa374c3
round3: ์„ค์ • ์ถฉ๋Œ ํ•ด๊ฒฐ
JVHE Nov 15, 2025
c74e6ad
round3: ์ข‹์•„์š” ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ ์˜ค๋ฅ˜ ์ˆ˜์ •
JVHE Nov 15, 2025
c80ed47
round3: ๋ถˆํ•„์š”ํ•œ ๋ฌธ์„œ ์ œ๊ฑฐ
JVHE Nov 15, 2025
c5754ff
fix : PR์ฝ”๋“œ ์ˆ˜์ •
adminhelper Nov 17, 2025
deda1e2
Merge branch 'Loopers-dev-lab:main' into 3round
adminhelper Nov 19, 2025
617746d
Merge pull request #86 from adminhelper/3round
adminhelper Nov 19, 2025
be18c88
Revert "[volume-3] ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง ๋ฐ ๊ตฌํ˜„"
adminhelper Nov 21, 2025
0074ea9
Revert "[volume-3] ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง ๋ฐ ๊ตฌํ˜„"
adminhelper Nov 21, 2025
b84525a
Revert "Revert "[volume-3] ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง ๋ฐ ๊ตฌํ˜„""
adminhelper Nov 21, 2025
52b62bd
Merge pull request #110 from Loopers-dev-lab/revert-109-revert-86-3round
adminhelper Nov 21, 2025
34df8d5
Merge pull request #112 from Loopers-dev-lab/revert-86-3round
adminhelper Nov 21, 2025
4ca321e
round3: ์ฝ”๋“œ ๊ฐœ์„ , ํ…Œ์ŠคํŠธ ์˜ค๋ฅ˜ ์ˆ˜์ •
JVHE Nov 25, 2025
339132b
Merge pull request #95 from JVHE/round3
JVHE Nov 28, 2025
d321b49
Revert "Round3: Product, Brand, Like, Order"
JVHE Nov 28, 2025
caec6fa
Merge pull request #131 from Loopers-dev-lab/revert-95-round3
JVHE Nov 28, 2025
da195a3
commerce-batch ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•˜๋ฉฐ, ๋ฐ๋ชจ Batch Job ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
hubtwork Dec 31, 2025
6c87e71
commerce-batch ๋ชจ๋“ˆ์— ๋Œ€ํ•ด README ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
hubtwork Dec 31, 2025
9107d53
Merge branch 'Loopers-dev-lab:main' into main
yeonjiyeon Dec 31, 2025
ff20736
feat: ๋ธŒ๋žœ๋“œ ๋„๋ฉ”์ธ ์ƒ์„ฑ ๋ฐ ๋‹จ์›Œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
yeonjiyeon Nov 12, 2025
bec68bd
feat: ๋ธŒ๋žœ๋“œ ์กฐํšŒ ๊ธฐ๋Šฅ ๋ฐ ํ†ตํ•ฉํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 12, 2025
4cfbae4
feat: ์ œํ’ˆ ๋„๋ฉ”์ธ ์ƒ์„ฑ ๋ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 12, 2025
32c8789
feat: ์ œํ’ˆ ์กฐํšŒ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 13, 2025
8ceebb8
feat: ์ œํ’ˆ ์ƒ์„ธ ์กฐํšŒ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 13, 2025
aaea47a
feat: ์ฃผ๋ฌธ ๊ด€๋ จ ๋„๋ฉ”์ธ ์ƒ์„ฑ ๋ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 13, 2025
3637e2e
feat: ์ฃผ๋ฌธ ์ƒ์„ฑ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 13, 2025
914900c
feat: ์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํšŒ, ๋‹จ์ผ ์ฃผ๋ฌธ ์ƒ์„ธ ์กฐํšŒ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 13, 2025
e898b73
feat: ์ข‹์•„์š” ๋„๋ฉ”์ธ ์ƒ์„ฑ ๋ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 13, 2025
9a308a7
feat: ์ข‹์•„์š”, ์ข‹์•„์š” ์ทจ์†Œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 13, 2025
48db0f3
refactor: ๊ธฐ์กด ์œ ์ €์˜ ํฌ์ธํŠธ ํ•„๋“œ ํฌ์ธํŠธ VO๋กœ ๋ณ€๊ฒฝ ๋ฐ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋“ค ์ˆ˜์ •
yeonjiyeon Nov 14, 2025
f44f912
feature: ๋ธŒ๋žœ๋“œ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ Facade ๊ตฌํ˜„ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 14, 2025
289120f
feature: ์ƒํ’ˆ ์ •๋ณด ์กฐํšŒ Facade ๊ตฌํ˜„ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 14, 2025
d8bba1a
feature: ์ข…์•„์š” Facade ๊ตฌํ˜„ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 14, 2025
92c486f
feature: ์ฃผ๋ฌธ ๊ธฐ๋Šฅ Facade ๊ตฌํ˜„
yeonjiyeon Nov 14, 2025
e667a57
refactor: ๊ฒ€์ฆ ๋กœ์ง ์˜คํƒ€ ์ˆ˜์ • ๋ฐ DB ๋ ˆ๋ฒจ ์ œ์•ฝ์„ ์œ„ํ•œ @Column(nullable = false) ์ถ”๊ฐ€
yeonjiyeon Nov 17, 2025
948e1e0
refactor: userId๊ฐ€ null์ผ ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
yeonjiyeon Nov 17, 2025
2fa314d
refactor: Order์—์„œ ์žฌ๊ณ  ๊ฒ€์ฆ ๋กœ์ง ์‚ญ์ œ
yeonjiyeon Nov 17, 2025
bc4e2e8
refactor: price-> VO(Money)๋กœ ๋ณ€๊ฒฝ, DB ๋ ˆ๋ฒจ ์ œ์•ฝ์„ ์œ„ํ•œ @Column ์ถ”๊ฐ€
yeonjiyeon Nov 18, 2025
84c9c0d
refactor: ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์ˆ˜์ • ๋ฐ ํ…Œ์ŠคํŠธ๋“ค ์˜คํƒ€ ์ˆ˜์ •
yeonjiyeon Nov 18, 2025
b9a4147
refactor: ์ƒ์„ฑ์ž ์‚ฌ์šฉ Lombok์œผ๋กœ ๋ณ€๊ฒฝ
yeonjiyeon Nov 18, 2025
d52739a
refactor: ์ƒ์„ฑ์ž ์‚ฌ์šฉ Lombok์œผ๋กœ ๋ณ€๊ฒฝ ๋ฐ db ์ปฌ๋Ÿผ ์ด๋ฆ„ ๋ณ€๊ฒฝ
yeonjiyeon Nov 18, 2025
efc9a5f
refactor: ์ƒํ’ˆ์˜ ์ข‹์•„์š” ์ˆ˜๋ฅผ product์˜ ์ปฌ๋Ÿผ์— ๋„ฃ๋Š” ๊ฒƒ์œผ๋กœ ๋กœ์ง ๋ณ€๊ฒฝ
yeonjiyeon Nov 18, 2025
c9dcf7d
refactor: ์ฃผ๋ฌธ์—์„œ ์ฐจ๊ฐ ๋กœ์ง ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์ˆ˜์ • ๋ฐ ๋ฐ”๊นฅ์ชฝ dto ์‚ฌ์šฉ ๋กœ์ง ์ˆ˜์ •
yeonjiyeon Nov 18, 2025
0978394
fix: ํฌ์ธํŠธ ์ฐจ๊ฐ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์ˆ˜์ • ๋ฐ ๊ด€๋ จ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
yeonjiyeon Nov 19, 2025
4a79620
feature: order contoller ์ƒ์„ฑ ๋ฐ ํŒŒ์‚ฌ๋“œ ๊ณ„์ธต ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•œ command ํด๋ž˜์Šค ์ถ”๊ฐ€
yeonjiyeon Nov 20, 2025
1afa04f
feature: ํฌ์ธํŠธ ์ฐจ๊ฐ ์‹œ ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๋น„๊ด€์  ๋ฝ ์ถ”๊ฐ€ ๋ฐ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
yeonjiyeon Nov 20, 2025
cafb370
feature: ์žฌ๊ณ  ์ฐจ๊ฐ ์‹œ ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๋‚™๊ด€์  ๋ฝ ์ถ”๊ฐ€ ๋ฐ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
yeonjiyeon Nov 20, 2025
ae5a7c8
test: ๋กค๋ฐฑ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€
yeonjiyeon Nov 20, 2025
eaf0fb2
fix: ๋™์ผํ•œ ์œ ์ €๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ฃผ๋ฌธ์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ…Œ์ŠคํŠธ ์ˆ˜์ •
yeonjiyeon Nov 20, 2025
08d6f36
feature: ์ข‹์•„์š”์™€ ์‹ซ์–ด์š” ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๋น„๊ด€์  ๋ฝ ์ถ”๊ฐ€ ๋ฐ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
yeonjiyeon Nov 20, 2025
982cca7
refactor: ๋น„๊ด€์  ๋ฝ์—์„œ ๋‚™๊ด€์  ๋ฝ์œผ๋กœ ๋ณ€๊ฒฝ
yeonjiyeon Nov 21, 2025
2c183aa
feature: ์ฟ ํฐ ๋„๋ฉ”์ธ ์„ค๊ณ„ ๋ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 21, 2025
6a55717
feature: ์ฟ ํฐ ์กฐํšŒ ๋กœ์ง ๋ฐ ๊ด€๋ จ ํ†ตํ•ฉํ…Œ์ŠคํŠธ ์ž‘์„ฑ
yeonjiyeon Nov 21, 2025
a230acb
refactor: ๋ถ„๋ฆฌ๋œ ํŠธ๋žœ์žญ์…˜ ๋ฌถ๊ธฐ
yeonjiyeon Nov 21, 2025
bf668de
docs: ์ธ๋ฑ์Šค ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ œํ’ˆ ๋”๋ฏธ ๋ฐ์ดํ„ฐ ์ค€๋น„(10๋งŒ๊ฐœ ์ œํ’ˆ)
yeonjiyeon Nov 26, 2025
adc3f43
perf: ์ƒํ’ˆ ๋ชฉ๋ก ์กฐํšŒ ๋ฐ ์ •๋ ฌ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•œ ์ธ๋ฑ์Šค ์ถ”๊ฐ€
yeonjiyeon Nov 26, 2025
38005dd
docs: ์ธ๋ฑ์Šค ์ƒ์„ฑ ์ฟผ๋ฆฌ
yeonjiyeon Nov 27, 2025
24eee76
fix: ์ปฌ๋Ÿผ๋ช…์„ ์œ„ํ•ด ์ˆ˜์ •
yeonjiyeon Nov 27, 2025
41e3b03
chore:jpa ๊ด€๋ จ ์„ค์ • ์ถ”๊ฐ€
yeonjiyeon Nov 27, 2025
3b2ed9e
chore:redis ๊ด€๋ จ ์„ค์ • ์ถ”๊ฐ€
yeonjiyeon Nov 28, 2025
b4b8a61
refactor:์บ์‹œ๋ฏธ์Šค์‹œ db ์กฐํšŒ ๋ถ€๋ถ„ ๊ณตํ†ต ๋กœ์ง์œผ๋กœ ๋ถ„๋ฆฌ
yeonjiyeon Nov 28, 2025
0207881
chore:๋ ˆ๋””์Šค ๊ด€๋ จ yml ํŒŒ์ผ ์ถ”๊ฐ€
yeonjiyeon Nov 28, 2025
e34e110
feature:์ƒํ’ˆ๋ชฉ๋ก, ์ƒํ’ˆ ์ƒ์„ธ ์บ์‹œ ์ถ”๊ฐ€ ๋ฐ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
yeonjiyeon Nov 28, 2025
e874858
fix:PageImpl์€ ์ƒ์„ฑ์ž๊ฐ€ ์—†์–ด์„œ Jackson์ด ์ฝ์–ด์˜ค์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ PageWrapper ํด๋ž˜์Šค ์ƒ์„ฑ
yeonjiyeon Nov 28, 2025
b849cf7
refactor:๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด transactionTemplate ์‚ฌ์šฉ
yeonjiyeon Nov 28, 2025
7367c45
docs: ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์ „ํ›„ ์„ฑ๋Šฅ ๋น„๊ต ์ถ”๊ฐ€
yeonjiyeon Nov 28, 2025
241da9d
fix: ๋ณด์•ˆ ์œ„ํ—˜์œผ๋กœ ์„ค์ • ๋ณ€๊ฒฝ(์ฝ”๋“œ๋ ˆ๋น— ๋ฆฌ๋ทฐ ๋ฐ˜์˜)
yeonjiyeon Dec 2, 2025
6462c33
add: ๊ฒฐ์ œ ๊ด€๋ จ ๋ชจ๋“ˆ ๋ฐ ์„ค์ • ํŒŒ์ผ ์ถ”๊ฐ€
yeonjiyeon Dec 3, 2025
c295ebb
add: http ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€
yeonjiyeon Dec 3, 2025
50d553e
chore: FeignClient, Resilience ๋“ฑํ•„์š”ํ•œ ์˜์กด์„ฑ๋“ค ์ถ”๊ฐ€
yeonjiyeon Dec 3, 2025
abfd777
chore: Resilience4j ์„ค์ • ์ถ”๊ฐ€ (Retry, CircuitBreaker ์„ค์ • ํฌํ•จ)
yeonjiyeon Dec 4, 2025
88d484f
feature: ๊ฒฐ์ œ ๋„๋ฉ”์ธ ๋ฐ ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€ (Payment ์—”ํ‹ฐํ‹ฐ, ์„œ๋น„์Šค, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋“ฑ)
yeonjiyeon Dec 4, 2025
d40f6d5
feature: ๊ฒฐ์ œ ๋„๋ฉ”์ธ ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€ (์นด๋“œ ํƒ€์ž… PG simulator๋ž‘ ๋งž์ถค)
yeonjiyeon Dec 4, 2025
201cf3b
feature: ์นด๋“œ ๊ฒฐ์ œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (PG ์—ฐ๋™ ๋ฐ ๊ฒฐ์ œ ์ƒํƒœ ๊ด€๋ฆฌ ํฌํ•จ)
yeonjiyeon Dec 4, 2025
cd84589
chore: FeignClient ์—ฐ๊ฒฐ ์‹œ๊ฐ„ ์„ค์ • ์ถ”๊ฐ€ (connectTimeout, readTimeout ์„ค์ •)
yeonjiyeon Dec 4, 2025
c194e30
add: PG ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜์ • ๋ฐ ์ฃผ๋ฌธ API http ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
yeonjiyeon Dec 4, 2025
3b17ea4
refactor: ์ด๋ฏธ ์™„๋ฃŒ๋œ ๊ฑด์€ ์ƒํƒœ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€ ๋กœ์ง ์ถ”๊ฐ€(ํšŒ๊ท€ ๋ฐฉ์ง€)
yeonjiyeon Dec 4, 2025
b6ebc4c
chore: ์ •๋ฆฌ๋œ ์˜์กด์„ฑ ์žฌ๋ฐฐ์น˜ ๋ฐ Resilience4j ์„ค์ • ๊ฐœ์„  (Retry, CircuitBreaker ์„ธ๋ถ€ ์กฐ์ • ํฌํ•จ)
yeonjiyeon Dec 5, 2025
31f7528
feature: ์ฃผ๋ฌธ ๋ฐ ๊ฒฐ์ œ ๋„๋ฉ”์ธ ๋ฆฌํŒฉํ† ๋ง, ์ž๋™ ๊ฒฐ์ œ ๋ณต๊ตฌ ์Šค์ผ€์ค„๋Ÿฌ ์ถ”๊ฐ€
yeonjiyeon Dec 5, 2025
9969cbc
add: HTTP request samples for Payment API (v1) including payment and โ€ฆ
yeonjiyeon Dec 5, 2025
4d4261d
feature: ์ฟ ํฐ ์‚ฌ์šฉ ๋ฐ ํ• ์ธ ๊ณ„์‚ฐ ๋กœ์ง ์ถ”๊ฐ€
yeonjiyeon Dec 11, 2025
3c24ed2
feature: ์ฃผ๋ฌธ ๊ฒฐ์ œ ๋ฐฉ์‹ ํ™•์žฅ ๋ฐ ํ”„๋กœ์„ธ์„œ ์ถ”๊ฐ€
yeonjiyeon Dec 11, 2025
b3db4ed
refator: ์ฟ ํฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋„๋ฉ”์ธ ์„œ๋น„์Šค ๋กœ์ง ๊ธฐ๋Šฅ ๋ถ„๋ฆฌ(ํ• ์ธ์œจ ๊ณ„์‚ฐ + ์‚ฌ์šฉ์™„๋ฃŒ์ฒ˜๋ฆฌ) -> ๊ฐ๊ฐ ์ฒ˜๋ฆฌํ•˜๋„๋ก โ€ฆ
yeonjiyeon Dec 11, 2025
06fb841
feature: ์ฃผ๋ฌธ๊ณผ ๊ฒฐ์ œ ์—ฐ๋™ ๋ฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ ๋„์ž…
yeonjiyeon Dec 12, 2025
60ebf6d
feature: ์ข‹์•„์š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐ ์‹คํŒจ ์ด๋ฒคํŠธ ์žฌ์‹œ๋„ ๋กœ์ง ์ถ”๊ฐ€
yeonjiyeon Dec 12, 2025
93ac95d
feature: DLQ ์ด๋ฒคํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด ์ถ”๊ฐ€
yeonjiyeon Dec 12, 2025
36aad30
chore: add optimistic locking to Coupon entity with @Version field
yeonjiyeon Dec 12, 2025
1a3aa85
feature: ์ฟ ํฐ ํ™•์ธ ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ถ”๊ฐ€
yeonjiyeon Dec 12, 2025
74e354b
feature: ์‚ฌ์šฉ์ž ์•ก์…˜ ์ถ”์  ์ด๋ฒคํŠธ ์ถ”๊ฐ€ ๋ฐ ์ข‹์•„์š” ์ด๋ฒคํŠธ ํ™•์žฅ
yeonjiyeon Dec 12, 2025
7cb28e5
refactor: ์ฝ”๋“œ๋ ˆ๋น— ๋ฆฌ๋ทฐ ๋ฐ˜์˜ํ•˜์—ฌ LocalDateTime โ†’ ZonedDateTime ํƒ€์ž… ์ •ํ•ฉ์„ฑ ๊ฐœ์„ 
yeonjiyeon Dec 18, 2025
7bc7bf3
chore: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” JPAยทRedis ์„ค์ • ์ œ๊ฑฐ ๋ฐ Kafka ์„ค์ • ์ •๋ฆฌ
yeonjiyeon Dec 18, 2025
09fa5e7
feature: Outbox ํŒจํ„ด ๊ธฐ๋ฐ˜ ์ด๋ฒคํŠธ ์ €์žฅ ๋กœ์ง ์ถ”๊ฐ€
yeonjiyeon Dec 18, 2025
c91cd66
feature: Outbox ๊ธฐ๋ฐ˜ ์ข‹์•„์š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐ Kafka ์—ฐ๋™ ๊ฐœ์„ 
yeonjiyeon Dec 18, 2025
75b2811
feature: Kafka ๊ธฐ๋ฐ˜ ์ข‹์•„์š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐ ๋ฉ”ํŠธ๋ฆญ ๊ด€๋ฆฌ ๊ตฌํ˜„
yeonjiyeon Dec 18, 2025
6eaf1aa
- LikeKafkaEvent๋ฅผ LikeCountEvent๋กœ ํด๋ž˜์Šค๋ช… ๋ณ€๊ฒฝ
yeonjiyeon Dec 18, 2025
7af3ae8
feature: ์ƒํ’ˆ ์กฐํšŒ ์ด๋ฒคํŠธ(ProductViewEvent) ์ถ”๊ฐ€ ๋ฐ Kafka ๊ธฐ๋ฐ˜ ์กฐํšŒ ์ถ”์  ๊ธฐ๋Šฅ ๊ตฌํ˜„
yeonjiyeon Dec 18, 2025
2a38caf
feature: Outbox ๊ธฐ๋ฐ˜ ์ฃผ๋ฌธ ๋ฐ ํŒ๋งค ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, Kafka ์—ฐ๋™ ๊ตฌํ˜„
yeonjiyeon Dec 19, 2025
67344b8
feature: ๋ฉ”ํŠธ๋ฆญ ์ด๋ฒคํŠธ ์ปจ์Šˆ๋จธ ํ™•์žฅ ๋ฐ Kafka ๊ธฐ๋ฐ˜ ์ง€ํ‘œ ๊ด€๋ฆฌ ๊ฐ•ํ™”
yeonjiyeon Dec 19, 2025
432cd74
feat: JPA @Table ์„ค์ • ์ถ”๊ฐ€ ๋ฐ ๋ฉฑ๋“ฑ์„ฑ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„
yeonjiyeon Dec 19, 2025
ceb53ce
refactor: SalesCountEvent ์ œ๊ฑฐ ๋ฐ ์บ์‹œ ์‚ญ์ œ ์ž‘์—…์„ ์œ„ํ•œProductStockEvent ๊ธฐ๋ฐ˜ ์žฌ๊ณ  ๊ด€๋ฆฌโ€ฆ
yeonjiyeon Dec 19, 2025
985954c
feat: Outbox ์ด๋ฒคํŠธ ์‹คํŒจ ์ฒ˜๋ฆฌ ๋ฐ ์žฌ๋ฐœํ–‰ ๋กœ์ง ์ถ”๊ฐ€
yeonjiyeon Dec 19, 2025
2a30ac7
chore: Kafka ํ”„๋กœ๋“€์„œ ๋ฉฑ๋“ฑ์„ฑ ์„ค์ • ๋ฐ ์„ค์ • ์ •๋ฆฌ
yeonjiyeon Dec 19, 2025
e667da8
chore: DemoKafkaConsumer ํด๋ž˜์Šค ์ œ๊ฑฐ
yeonjiyeon Dec 23, 2025
4a1aa52
refactor: OrderCreatedEvent๊ฐ€ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์Šค์Šค๋กœ ํฌํ•จํ•˜๋„๋ก ๊ฐœ์„ 
yeonjiyeon Dec 23, 2025
6de080b
feature: ProductStockEvent์— ๊ฐ€๊ฒฉ ํ•„๋“œ ์ถ”๊ฐ€ ๋ฐ ์ฃผ๋ฌธ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๊ฐœ์„ 
yeonjiyeon Dec 25, 2025
cd878d5
feature: ์ง€ํ‘œ ๋ฉ”ํŠธ๋ฆญ ๊ฐœ์„  ๋ฐ RankingService ์ถ”๊ฐ€
yeonjiyeon Dec 25, 2025
425b980
feature: ์ƒํ’ˆ ๋žญํ‚น API ๊ตฌํ˜„
yeonjiyeon Dec 25, 2025
6fe3025
feature: ์ƒํ’ˆ ์ƒ์„ธ ์ •๋ณด์— ๋žญํ‚น ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
yeonjiyeon Dec 26, 2025
db4ed51
feat: ์ฝœ๋“œ ์Šคํƒ€ํŠธ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ Score Carry-Over ์Šค์ผ€์ค„๋Ÿฌ ์ถ”๊ฐ€
yeonjiyeon Dec 26, 2025
ee16413
refactor: ๋™์  ๋žญํ‚น ํ‚ค ์ƒ์„ฑ์„ ์œ„ํ•œ RankingKeyGenerator ๋ถ„๋ฆฌ ๋ฐ commerce-streamer์˜ โ€ฆ
yeonjiyeon Dec 31, 2025
21dc4d2
refactor: ๋žญํ‚น API ์˜ ์ƒํ’ˆ ์‘๋‹ต ์ŠคํŽ™์— ์žฌ๊ณ ์— ๋”ฐ๋ฅธ ํŠน์ • ๊ฒฐ๊ณผ๋งŒ ํฌํ•จํ•˜๋„๋ก ์ˆ˜์ •
yeonjiyeon Dec 31, 2025
d9322e1
feat: Order ๋ฐ Stock ์ด๋ฒคํŠธ์— ์ƒํ’ˆ๋ช… ํ•„๋“œ ์ถ”๊ฐ€ ๋ฐ ๋žญํ‚น ๋งคํ•‘ ๋ฉ”์„œ๋“œ ํ™•์žฅ
yeonjiyeon Jan 2, 2026
e0ef326
feat: ProductMetrics์— ์ƒํ’ˆ ์ •๋ณด ํ•„๋“œ ์ถ”๊ฐ€ ๋ฐ ์—…๋ฐ์ดํŠธ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„
yeonjiyeon Jan 2, 2026
6f4a795
feat: ์ฃผ๊ฐ„ยท์›”๊ฐ„ ๋žญํ‚น API ์ถ”๊ฐ€ ๋ฐ RankingService ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
yeonjiyeon Jan 2, 2026
384ec82
feat: ์ฃผ๊ฐ„ ๋žญํ‚น ๋ฐฐ์น˜ ํ”„๋กœ์„ธ์Šค ๋ฐ ์Šค์ผ€์ค„๋Ÿฌ ๊ตฌํ˜„
yeonjiyeon Jan 2, 2026
5bd085e
feat: ์›”๊ฐ„ ๋žญํ‚น ๋ฐฐ์น˜ ํ”„๋กœ์„ธ์Šค ๋ฐ Tasklet ๊ตฌํ˜„
yeonjiyeon Jan 2, 2026
84b46b4
Merge branch 'yeonjiyeon' into feature/week10
yeonjiyeon Jan 2, 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
13 changes: 13 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
name: PR Agent
on:
pull_request:
types: [opened, synchronize]
jobs:
pr_agent_job:
runs-on: ubuntu-latest
steps:
- name: PR Agent action step
uses: Codium-ai/pr-agent@main
env:
OPENAI_KEY: ${{ secrets.OPENAI_KEY }}
GITHUB_TOKEN: ${{ secrets.G_TOKEN }}
Comment on lines +11 to +13
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

โš ๏ธ Potential issue | ๐Ÿ”ด Critical

๐Ÿงฉ Analysis chain

๐Ÿ Script executed:

cd .github/workflows && find . -name "main.yml" -exec cat -n {} \;

Repository: Loopers-dev-lab/loopers-spring-java-template

Length of output: 487


๐Ÿ Script executed:

# Check if there are any other references to G_TOKEN or pr-agent in the repo
rg -i "g_token|pr-agent|openai" --type yaml --type md -A 2 -B 2 2>/dev/null || echo "Search completed"

Repository: Loopers-dev-lab/loopers-spring-java-template

Length of output: 104


๐ŸŒ Web query:

Codium-ai pr-agent GitHub action trustworthiness security

๐Ÿ’ก Result:

Short answer: PR-Agent (Codiumโ€‘AI / now Qodo) has had real, documented security issues; two vulnerabilities (CVEโ€‘2024โ€‘51355 and CVEโ€‘2024โ€‘51356) were reported and responsible disclosures and fixes were published โ€” so treat the GitHub Action as potentially risky unless you follow mitigation steps and use patched/pinned images or selfโ€‘host. Sources: independent security research and the project's security notes. [1][2][3]

Key points and what to do

  • History: Multiple serious vulnerabilities were published by Kudelski Security in Augโ€“Nov 2024 (PoC showed secret exfiltration and repo write risks); CVEs were assigned. The researcher showed many repos using the action could be affected. [1]
  • Project response: The PRโ€‘Agent repo/project (now Qodo) has published security guidance, release notes and recommends using fixed releases or pinned Docker digests; they also provide a security contact. Confirm you run a version that includes the fixes. [2][3]
  • Immediate mitigations (minimum best practice):
    1. Do not use unpinned uses: avoid using uses: codiumai/pr-agent@main. Pin to a specific, patched release or to the Docker image digest. [2]
    2. Selfโ€‘host the agent or run the Docker image in your own environment where you control secrets and network egress. [2]
    3. Limit GitHub Actions permissions and tokens: restrict GITHUB_TOKEN permissions (no write unless absolutely needed) and avoid passing highโ€‘privilege secrets into the action. Use least privilege for workflow tokens. (This is standard Actions hardening and directly mitigates the PoC.) [1][2]
    4. Upgrade to a version >= the patched release (check project release notes / changelog) and monitor the repo for new advisories. [2][3]
    5. Scan your repo and workflows for other uses of PRโ€‘Agent and rotated any secrets that may have been exposed if you used vulnerable versions. [1]
  • When to avoid it: do not install the action on sensitive/private repos or orgs that contain production secrets unless you selfโ€‘host or have confirmed the version is patched and permissions are locked down. [1][2]

Want me to:

  • check the exact latest patched release number and a recommended digest right now, or
  • scan a workflow file you have to point out risky config?

๐Ÿ Script executed:

# Check for other workflow files
find .github/workflows -type f -name "*.yml" -o -name "*.yaml" | head -20

# Check for any documentation about tokens
find . -name "README*" -o -name "SECURITY*" -o -name "CONTRIBUTING*" | xargs ls -la 2>/dev/null || echo "No docs found"

# Check git history for when G_TOKEN was introduced
git log --all --full-history -p -- ".github/workflows/main.yml" 2>/dev/null | head -50 || echo "Git history check skipped"

Repository: Loopers-dev-lab/loopers-spring-java-template

Length of output: 1682


๐ŸŒ Web query:

CVE-2024-51355 CVE-2024-51356 pr-agent codium-ai patch fix version

๐Ÿ’ก Result:

CVE-2024-51355 and CVE-2024-51356 affect PRโ€‘Agent (CodiumAI / Qodo Merge). The upstream fix was released in PRโ€‘Agent v0.26 (and included in later releases). [1][2][3]

Sources:

  • Kudelski Security writeup noting the two CVEs and the issue timeline. [1]
  • PRโ€‘Agent GitHub releases (v0.26 release notes). [2]
  • PRโ€‘Agent / Qodo security/release guidance referencing the v0.26 fix and later images. [3]

Codium-ai/pr-agent ์•ก์…˜์˜ ์•Œ๋ ค์ง„ ๋ณด์•ˆ ์ทจ์•ฝ์ ์œผ๋กœ ์ธํ•ด ๊ธด๊ธ‰ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Codium-ai/pr-agent์—์„œ ๋ฐœ๊ฒฌ๋œ CVE-2024-51355์™€ CVE-2024-51356 (๋น„๋ฐ€ ์ •๋ณด ํƒˆ์ทจ ๋ฐ ์ €์žฅ์†Œ ์“ฐ๊ธฐ ๊ถŒํ•œ ์•…์šฉ ์œ„ํ—˜)์„ ๊ณ ๋ คํ•˜๋ฉด, ํ˜„์žฌ ์›Œํฌํ”Œ๋กœ์šฐ ๊ตฌ์„ฑ์ด ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค:

  1. @main ์‚ฌ์šฉ ์ค‘๋‹จ: ํŠน์ • ๋ฒ„์ „ (v0.26 ์ด์ƒ์˜ ํŒจ์น˜๋œ ๋ฆด๋ฆฌ์Šค)์œผ๋กœ ๊ณ ์ •ํ•˜์„ธ์š”. ํ˜„์žฌ @main์€ ๋ฏธํŒจ์น˜ ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. permissions ๋ธ”๋ก ์ถ”๊ฐ€: PR ์ฝ”๋ฉ˜ํŠธ ์ž‘์„ฑ๋งŒ ํ•„์š”ํ•˜๋ฉด ์ตœ์†Œ ๊ถŒํ•œ์œผ๋กœ ์ œํ•œํ•˜์„ธ์š”:
    permissions:
      pull-requests: write
      contents: read
  3. OPENAI_KEY ๋…ธ์ถœ: ์ด ์•ก์…˜์— ๋ฏผ๊ฐํ•œ API ํ‚ค๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์„ธ์š”. ๊ฐ€๋Šฅํ•˜๋ฉด ํ™˜๊ฒฝ๋ณ„๋กœ ๊ฒฉ๋ฆฌ๋œ ๊ตฌ์„ฑ ์‚ฌ์šฉ์„ ๊ฒ€ํ† ํ•˜์„ธ์š”.
๐Ÿค– Prompt for AI Agents
In .github/workflows/main.yml around lines 11 to 13, the workflow currently uses
the codium-ai/pr-agent action via @main and exposes OPENAI_KEY to the action,
which is vulnerable (CVE-2024-51355/51356); update the action to a specific
patched release (pin to a fixed tag or commit >= v0.26) instead of @main, add a
minimal permissions block restricting rights to only whatโ€™s needed (e.g.,
pull-requests: write and contents: read), and remove or stop passing OPENAI_KEY
into this action (use an isolated, scoped secret or omit the secret for this
job) so the action cannot access sensitive API keys.

1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ docker-compose -f ./docker/monitoring-compose.yml up
Root
โ”œโ”€โ”€ apps ( spring-applications )
โ”‚ โ”œโ”€โ”€ ๐Ÿ“ฆ commerce-api
โ”‚ โ”œโ”€โ”€ ๐Ÿ“ฆ commerce-batch
โ”‚ โ””โ”€โ”€ ๐Ÿ“ฆ commerce-streamer
โ”œโ”€โ”€ modules ( reusable-configurations )
โ”‚ โ”œโ”€โ”€ ๐Ÿ“ฆ jpa
Expand Down
18 changes: 18 additions & 0 deletions apps/commerce-api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,22 @@ dependencies {
// test-fixtures
testImplementation(testFixtures(project(":modules:jpa")))
testImplementation(testFixtures(project(":modules:redis")))

// Resilience4j (Spring Boot 3.x ๊ธฐ์ค€)
implementation("io.github.resilience4j:resilience4j-spring-boot3")

// AOP
implementation("org.springframework.boot:spring-boot-starter-aop")

// actuator
implementation("org.springframework.boot:spring-boot-starter-actuator")

//Micrometer Prometheus
implementation("io.micrometer:micrometer-registry-prometheus")

//Spring Cloud OpenFeign
implementation("org.springframework.cloud:spring-cloud-starter-openfeign")

Comment on lines +38 to +52
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

โš ๏ธ Potential issue | ๐Ÿ”ด Critical

์ค‘๋ณต๋œ ์˜์กด์„ฑ ์„ ์–ธ์„ ์ œ๊ฑฐํ•˜์„ธ์š”.

๋‹ค์Œ ์˜์กด์„ฑ๋“ค์ด ์ด๋ฏธ ํŒŒ์ผ ์ƒ๋‹จ์— ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • resilience4j-spring-boot3 (17๋ฒˆ ๋ผ์ธ)
  • spring-boot-starter-aop (20๋ฒˆ ๋ผ์ธ)
  • spring-boot-starter-actuator (13๋ฒˆ ๋ผ์ธ)
  • micrometer-registry-prometheus (23๋ฒˆ ๋ผ์ธ)
  • spring-cloud-starter-openfeign (26๋ฒˆ ๋ผ์ธ)

Gradle์€ ์ค‘๋ณต ์„ ์–ธ์„ ๋ฌด์‹œํ•˜์ง€๋งŒ, ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด๊ณผ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”Ž ์ค‘๋ณต ์ œ๊ฑฐ ์ œ์•ˆ
-
-    // Resilience4j (Spring Boot 3.x ๊ธฐ์ค€)
-    implementation("io.github.resilience4j:resilience4j-spring-boot3")
-
-    // AOP
-    implementation("org.springframework.boot:spring-boot-starter-aop")
-
-    // actuator
-    implementation("org.springframework.boot:spring-boot-starter-actuator")
-
-    //Micrometer Prometheus
-    implementation("io.micrometer:micrometer-registry-prometheus")
-
-    //Spring Cloud OpenFeign
-    implementation("org.springframework.cloud:spring-cloud-starter-openfeign")
-
๐Ÿ“ Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Resilience4j (Spring Boot 3.x ๊ธฐ์ค€)
implementation("io.github.resilience4j:resilience4j-spring-boot3")
// AOP
implementation("org.springframework.boot:spring-boot-starter-aop")
// actuator
implementation("org.springframework.boot:spring-boot-starter-actuator")
//Micrometer Prometheus
implementation("io.micrometer:micrometer-registry-prometheus")
//Spring Cloud OpenFeign
implementation("org.springframework.cloud:spring-cloud-starter-openfeign")
๐Ÿค– Prompt for AI Agents
In apps/commerce-api/build.gradle.kts around lines 38 to 52, the block
re-declares dependencies that are already defined earlier in the file
(resilience4j-spring-boot3 at line 17, spring-boot-starter-aop at line 20,
spring-boot-starter-actuator at line 13, micrometer-registry-prometheus at line
23, and spring-cloud-starter-openfeign at line 26); remove these duplicate
implementation(...) entries from lines 38โ€“52 so each dependency is declared only
once, keeping the original declarations and deleting the repeated ones to avoid
redundancy and maintenance confusion.

//Spring Cloud CircuitBreaker
implementation("org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j")
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;

public record OrderCreatedEvent(
Expand All @@ -22,7 +21,7 @@ public record OrderCreatedEvent(
Long couponId
) {

public record OrderItemInfo(Long productId, int quantity, long price, int remainStock) {
public record OrderItemInfo(Long productId, String productName, int quantity, long price, int remainStock) {

}

Expand All @@ -46,6 +45,7 @@ public static OrderCreatedEvent of(
Product product = productMap.get(item.getProductId());
return new OrderItemInfo(
item.getProductId(),
product != null ? product.getName() : "Unknown",
item.getQuantity(),
product != null ? product.getPrice().getValue() : 0,
product != null ? product.getStock() : 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public void handleOrderCreated(OrderCreatedEvent event) {

ProductStockEvent kafkaEvent = ProductStockEvent.of(
item.productId(),
item.productName(),
item.quantity(),
item.remainStock(),
item.price()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import com.loopers.domain.brand.BrandService;
import com.loopers.domain.product.Product;
import com.loopers.domain.product.ProductService;
import com.loopers.infrastructure.rank.RankingService;
import com.loopers.event.ProductViewEvent;
import com.loopers.infrastructure.rank.RankingService;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.domain.Page;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,12 @@ public List<RankingInfo> getTopRankings(String date, int page, int size) {
})
.toList();
}

public List<RankingInfo> getRankings(String type, String date, int page, int size) {
return switch (type.toUpperCase()) {
case "WEEKLY" -> rankingService.getWeeklyRankings(date, page, size);
case "MONTHLY" -> rankingService.getMonthlyRankings(date, page, size);
default -> getTopRankings(date, page, size);
};
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.loopers.application.rank;

import com.loopers.domain.product.Product;
import com.loopers.domain.rank.monthly.MonthlyRankingMV;
import com.loopers.domain.rank.weekly.WeeklyRankingMV;

public record RankingInfo(
Long productId,
String productName,
Long price,
int stock,
boolean isSoldOut,
int currentRank
) {

Expand All @@ -15,8 +17,28 @@ public static RankingInfo of(Product product, int currentRank) {
product.getId(),
product.getName(),
product.getPrice().getValue(),
product.getStock(),
product.getStock() <= 0,
currentRank
);
}

public static RankingInfo from(WeeklyRankingMV mv) {
return new RankingInfo(
mv.getProductId(),
mv.getProductName(),
mv.getPrice(),
mv.isSoldOut(),
mv.getCurrentRank()
);
}

public static RankingInfo from(MonthlyRankingMV mv) {
return new RankingInfo(
mv.getProductId(),
mv.getProductName(),
mv.getPrice(),
mv.isSoldOut(),
mv.getCurrentRank()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,54 +1,15 @@
package com.loopers.infrastructure.rank;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import com.loopers.application.rank.RankingInfo;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.connection.zset.Aggregate;
import org.springframework.data.redis.connection.zset.Weights;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class RankingService {
public interface RankingService {

private final RedisTemplate<String, String> redisTemplate;
List<Long> getTopRankingIds(String date, int page, int size);

public List<Long> getTopRankingIds(String date, int page, int size) {
String key = "ranking:all:" + date;
int start = (page - 1) * size;
int end = start + size - 1;
List<RankingInfo> getWeeklyRankings(String date, int page, int size);

Set<String> rankedIds = redisTemplate.opsForZSet().reverseRange(key, start, end);
List<RankingInfo> getMonthlyRankings(String date, int page, int size);

if (rankedIds == null || rankedIds.isEmpty()) {
return List.of();
}

return rankedIds.stream()
.map(Long::valueOf)
.toList();
}

public Integer getProductRank(Long productId) {
String today = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
String key = "ranking:all:" + today;

Long rank = redisTemplate.opsForZSet().reverseRank(key, String.valueOf(productId));

return (rank != null) ? rank.intValue() + 1 : null;
}

public void carryOverRanking(String sourceDate, String targetDate, double weight) {
String sourceKey = "ranking:all:" + sourceDate;
String targetKey = "ranking:all:" + targetDate;

redisTemplate.opsForZSet().unionAndStore(sourceKey, List.of(), targetKey,
Aggregate.SUM, Weights.of(weight));

redisTemplate.expire(targetKey, 2, TimeUnit.DAYS);
}
Integer getProductRank(Long productId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.loopers.infrastructure.rank;

import com.loopers.application.rank.RankingInfo;
import com.loopers.domain.rank.monthly.MonthlyRankingMVRepository;
import com.loopers.domain.rank.weekly.WeeklyRankingMVRepository;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Set;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

@RequiredArgsConstructor
@Component
public class RankingServiceImpl implements RankingService {

private final RedisTemplate<String, String> redisTemplate;
private final WeeklyRankingMVRepository weeklyRepository;
private final MonthlyRankingMVRepository monthlyRepository;

@Override
public List<Long> getTopRankingIds(String date, int page, int size) {
String key = "ranking:all:" + date;
int start = (page - 1) * size;
int end = start + size - 1;

Set<String> rankedIds = redisTemplate.opsForZSet().reverseRange(key, start, end);

if (rankedIds == null || rankedIds.isEmpty()) {
return List.of();
}

return rankedIds.stream()
.map(Long::valueOf)
.toList();
}

@Override
public List<RankingInfo> getWeeklyRankings(String date, int page, int size) {
return weeklyRepository.findByBaseDateOrderByCurrentRankAsc(date, PageRequest.of(page - 1, size))
.stream()
.map(RankingInfo::from)
.toList();
}

@Override
public List<RankingInfo> getMonthlyRankings(String date, int page, int size) {
return monthlyRepository.findByBaseDateOrderByCurrentRankAsc(date, PageRequest.of(page - 1, size))
.stream()
.map(RankingInfo::from)
.toList();
}

@Override
public Integer getProductRank(Long productId) {
String today = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
String key = "ranking:all:" + today;

Long rank = redisTemplate.opsForZSet().reverseRank(key, String.valueOf(productId));

return (rank != null) ? rank.intValue() + 1 : null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public interface RankingV1ApiSpec {

@Operation(summary = "์‹ค์‹œ๊ฐ„ ๋žญํ‚น ์กฐํšŒ", description = "ํŠน์ • ๋‚ ์งœ์˜ ์ธ๊ธฐ ์ƒํ’ˆ ๋žญํ‚น์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.")
ApiResponse<List<RankingResponse>> getRankings(
@Parameter(description = "๋žญํ‚น ํƒ€์ž… (DAILY, WEEKLY, MONTHLY)", example = "WEEKLY") String type,
@Parameter(description = "์กฐํšŒ ๋‚ ์งœ (yyyyMMdd)", example = "20251225") String date,
@Parameter(description = "ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ") int page,
@Parameter(description = "ํŽ˜์ด์ง€ ํฌ๊ธฐ") int size
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,12 @@ public class RankingV1Controller implements RankingV1ApiSpec {
@GetMapping
@Override
public ApiResponse<List<RankingResponse>> getRankings(
@RequestParam(value = "type", defaultValue = "DAILY") String type,
@RequestParam(value = "date") String date,
@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "20") int size
) {
List<RankingInfo> infos = rankingFacade.getTopRankings(date, page, size);
List<RankingInfo> infos = rankingFacade.getRankings(type, date, page, size);
List<RankingV1Dto.RankingResponse> response = infos.stream()
.map(RankingV1Dto.RankingResponse::from)
.toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public record RankingResponse(
Long productId,
String productName,
Long price,
int stock,
boolean isSoldOut,
int currentRank
) {

Expand All @@ -17,7 +17,7 @@ public static RankingResponse from(RankingInfo info) {
info.productId(),
info.productName(),
info.price(),
info.stock(),
info.isSoldOut(),
info.currentRank()
);
}
Expand Down
1 change: 0 additions & 1 deletion apps/commerce-api/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ spring:
connectTimeout: 1000
readTimeout: 1000


resilience4j:
retry:
instances:
Expand Down
21 changes: 21 additions & 0 deletions apps/commerce-batch/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
dependencies {
// add-ons
implementation(project(":modules:jpa"))
implementation(project(":modules:redis"))
implementation(project(":supports:jackson"))
implementation(project(":supports:logging"))
implementation(project(":supports:monitoring"))

// batch
implementation("org.springframework.boot:spring-boot-starter-batch")
testImplementation("org.springframework.batch:spring-batch-test")

// querydsl
annotationProcessor("com.querydsl:querydsl-apt::jakarta")
annotationProcessor("jakarta.persistence:jakarta.persistence-api")
annotationProcessor("jakarta.annotation:jakarta.annotation-api")

// test-fixtures
testImplementation(testFixtures(project(":modules:jpa")))
testImplementation(testFixtures(project(":modules:redis")))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.loopers;

import jakarta.annotation.PostConstruct;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;

import java.util.TimeZone;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@ConfigurationPropertiesScan
@SpringBootApplication
public class CommerceBatchApplication {

@PostConstruct
public void started() {
// set timezone
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
}

public static void main(String[] args) {
int exitCode = SpringApplication.exit(SpringApplication.run(CommerceBatchApplication.class, args));
System.exit(exitCode);
}
Comment on lines +11 to +25
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

โš ๏ธ Potential issue | ๐ŸŸ  Major

๐Ÿงฉ Analysis chain

๐Ÿ Script executed:

#!/bin/bash
# commerce-batch ๋ชจ๋“ˆ์—์„œ @Scheduled ๋ฉ”์„œ๋“œ ๊ฒ€์ƒ‰
rg -n --type=java '@Scheduled' apps/commerce-batch/

Repository: Loopers-dev-lab/loopers-spring-java-template

Length of output: 357


๐Ÿ Script executed:

#!/bin/bash
# commerce-batch ๋ชจ๋“ˆ์˜ ์ „์ฒด Java ํŒŒ์ผ ๋ชฉ๋ก ํ™•์ธ
find apps/commerce-batch/src -name "*.java" -type f | head -20

Repository: Loopers-dev-lab/loopers-spring-java-template

Length of output: 1505


๐Ÿ Script executed:

#!/bin/bash
# commerce-batch ๋ชจ๋“ˆ ๊ตฌ์กฐ ํ™•์ธ
ls -la apps/commerce-batch/src/main/java/com/loopers/

Repository: Loopers-dev-lab/loopers-spring-java-template

Length of output: 328


@EnableScheduling๊ณผ System.exit() ํŒจํ„ด์˜ ์„ค๊ณ„ ๋ชจ์ˆœ์„ ์ฆ‰์‹œ ํ•ด๊ฒฐํ•˜์„ธ์š”.

RankingScheduler์— @Scheduled(cron = "0 0 2 * * MON")๊ณผ @Scheduled(cron = "0 0 3 1 * *")๋กœ ์ •์˜๋œ ์ฃผ๊ธฐ์  ์Šค์ผ€์ค„ ์ž‘์—…์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ CommerceBatchApplication์˜ main() ๋ฉ”์„œ๋“œ์—์„œ System.exit(exitCode)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘ ํ›„ ์ฆ‰์‹œ ์ข…๋ฃŒ๋˜์–ด, ์Šค์ผ€์ค„๋œ ์ž‘์—…๋“ค์ด ์‹คํ–‰๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ:

  • @EnableScheduling์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žฅ๊ธฐ ์‹คํ–‰๋˜์–ด์•ผ ํ•จ์„ ์˜๋ฏธ
  • System.exit(exitCode)๋Š” JVM์„ ์ฆ‰์‹œ ์ข…๋ฃŒ์‹œํ‚ด
  • ๊ฒฐ๊ณผ: ์Šค์ผ€์ค„๋œ ์ž‘์—…์ด ์ •๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Œ

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ:

  • main() ๋ฉ”์„œ๋“œ์—์„œ System.exit() ์ œ๊ฑฐ โ†’ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ณ„์† ์‹คํ–‰ ์ƒํƒœ๋กœ ์œ ์ง€
  • ๋˜๋Š” ๋‹ค๋ฅธ ์ข…๋ฃŒ ๋ฉ”์ปค๋‹ˆ์ฆ˜(์˜ˆ: shutdown hook, graceful shutdown) ์ ์šฉ
๐Ÿค– Prompt for AI Agents
apps/commerce-batch/src/main/java/com/loopers/CommerceBatchApplication.java
around lines 11-25: the main method calls System.exit(...) which immediately
terminates the JVM and prevents @EnableScheduling cron jobs (e.g.,
RankingScheduler) from running; remove the System.exit call (and avoid forcing
SpringApplication.exit on startup) so the application remains running to execute
scheduled tasksโ€”if you need to handle shutdown/exit codes, implement a proper
shutdown hook or call SpringApplication.exit only on explicit termination events
rather than at startup.

}
Loading