Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
160 commits
Select commit Hold shift + click to select a range
af7c379
docs: README ์„ค๊ณ„, ์š”๊ตฌ์‚ฌํ•ญ, ๊ธฐ๋Šฅ ๋ช…์„ธ ์ž‘์„ฑ
dhyepark Mar 25, 2026
e1eed41
feat: ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„ ์ž…๋ ฅ ๊ตฌํ˜„
dhyepark Mar 25, 2026
0bdb3eb
feat: ์ถœ๋ ฅ ์ƒ์ˆ˜ ์ •์˜
dhyepark Mar 25, 2026
b760bd2
feat: ๊ฒŒ์ž„ ์ค€๋น„ ์ถœ๋ ฅ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„
dhyepark Mar 25, 2026
7876dd6
feat: ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„ ์ž…๋ ฅ ์˜ˆ์™ธ ๊ฒ€์ฆ ๋ฐ ์žฌ์ž…๋ ฅ ๋กœ์ง ๊ตฌํ˜„
dhyepark Mar 25, 2026
8da12f5
feat: ์ง„์˜ ENUM ์ถ”๊ฐ€
dhyepark Mar 25, 2026
9d90197
refactor: ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ
dhyepark Mar 25, 2026
1b6fe6f
feat: ์ง„์˜ ๊ตฌํ˜„ ๋ฐ ์‹คํ–‰ ํ๋ฆ„์— ๋ฐ˜์˜
dhyepark Mar 25, 2026
4a7fdc8
feat: ํ”Œ๋ ˆ์ด์–ด ๋ฐ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ๊ตฌํ˜„
dhyepark Mar 25, 2026
f8650f5
feat: ๊ธฐ๋ฌผ ์œ„์น˜ ๊ด€๋ฆฌ ํด๋ž˜์Šค ๊ตฌํ˜„
dhyepark Mar 25, 2026
08e3241
feat: ๊ธฐ๋ฌผ ์ตœ์†Œ ์ด๋™ ๋‹จ์œ„ ํด๋ž˜์Šค ๊ตฌํ˜„, ๊ธฐ๋ฌผ ์œ„์น˜ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌ
dhyepark Mar 25, 2026
6282079
feat: ๊ธฐ๋ฌผ ์ด๋™ ๊ด€๋ฆฌ ํด๋ž˜์Šค ๋ฐ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ๊ตฌํ˜„
dhyepark Mar 25, 2026
251dccd
feat: ์ด๋™ ์ „๋žต ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„
nn98 Mar 25, 2026
7fbd579
feat: ์ด๋™ ๊ฐ€๋Šฅํ•œ ์œ„์น˜๋ฅผ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ๊ธฐ๋ฌผ ์ •๋ณด VO
nn98 Mar 25, 2026
c835063
feat: ๊ธฐ๋ฌผ์˜ ์ข…๋ฅ˜, ์ด๋™ ๊ทœ์น™์„ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค `enum PieceType`
nn98 Mar 25, 2026
27eeaf8
feat: ๊ธฐ๋ฌผ์˜ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค `class Piece` ๊ตฌํ˜„, VO์— ์‹๋ณ„์ž ์ถ”๊ฐ€
nn98 Mar 25, 2026
302e2f4
feat: ๊ฒŒ์ž„ํŒ ๊ตฌํ˜„, ๊ธฐ๋ฌผ ์ดˆ๊ธฐ ์œ„์น˜๋กœ ์ƒ์„ฑ
nn98 Mar 25, 2026
94d60a2
feat: ์ดˆ๊ธฐํ™” ํ™•์ธ ๋ฐ ์‚ฌ์ดํด 1 ์š”๊ตฌ์‚ฌํ•ญ ์ถฉ์กฑ์„ ์œ„ํ•œ ์ž„์‹œ DTO
nn98 Mar 25, 2026
3fe4d68
feat: ์ž„์‹œ DTO ์ถœ๋ ฅ
nn98 Mar 25, 2026
2bc5da1
feat: ์ž„์‹œ DTO ์ถœ๋ ฅ๊ณผ ๊ธฐ๋ฌผ ์ดˆ๊ธฐํ™” ๊ตฌํ˜„
nn98 Mar 25, 2026
a0c0a6d
fix: ์—ด ๋ฒˆํ˜ธ ์–‘์‹ ์ˆ˜์ •
nn98 Mar 25, 2026
144bf64
feat: ์ƒํ•˜์ขŒ์šฐ ์ด๋™๊ณผ ๋Œ€๊ฐ ์ด๋™์„ ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌ
dhyepark Mar 26, 2026
7533475
feat: ๊ฒฐ๊ณผ ์ถœ๋ ฅํ•ด์„œ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์ž„์‹œ getter
dhyepark Mar 26, 2026
befc84f
feat: ๊ธฐ๋ฌผ๋ณ„ ์ด๋™ ์ „๋žต ๊ตฌํ˜„ ๋ฐ PieceType ์— ๋ฐ˜์˜(ํฌ ์ œ์™ธ)
dhyepark Mar 26, 2026
b1ac0fb
test: ์œ„์น˜์˜ ์œ ํšจ์„ฑ ํ…Œ์ŠคํŠธ
dhyepark Mar 26, 2026
685d374
test: ๊ธฐ๋ฌผ๋ณ„ ์ด๋™ ๊ทœ์น™์˜ ์œ ํšจ์„ฑ ํ…Œ์ŠคํŠธ(ํฌ ์ œ์™ธ)
dhyepark Mar 26, 2026
d49e98f
feat: ๊ธฐ๋ฌผ ์ด๋™๊ณผ ์ž…๋ ฅ ๊ตฌํ˜„
dhyepark Mar 26, 2026
0ff363c
feat: ์ด๋™ ๊ฒฐ๊ณผ๊นŒ์ง€ ์ถœ๋ ฅ
nn98 Mar 26, 2026
8582e27
fix: ์ถœ๋ ฅ ์˜ค๋ฅ˜ ์ˆ˜์ • ๋ฐ ์ถœ๋ ฅ ์ถ”๊ฐ€
dhyepark Mar 26, 2026
2a74c5e
feat: ํฌ๋ฅผ ์ œ์™ธํ•œ ๊ธฐ๋ฌผ ์ด๋™, ํ„ด์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ํ”Œ๋ ˆ์ด์–ด ์ „ํ™˜
nn98 Mar 26, 2026
1df6ec2
fix: ์ž˜๋ชป๋œ ๊ฐ™์€ ์ง„์˜ ํŒ๋ณ„ ์ˆ˜์ •
nn98 Mar 26, 2026
721049a
feat: ํฌ ์ด๋™ ๊ตฌํ˜„, ํฌ๊ธฐ(ๆ•ๆฃ‹) ๊ธฐ๋Šฅ ๊ตฌํ˜„
nn98 Mar 26, 2026
a1dfd6f
docs(rule): ํ† ๋ก  ํ™œ๋™ ๋“ฑ์—์„œ ์ •ํ•œ ๊ทœ์น™
nn98 Mar 26, 2026
7d81530
rename: ๋„๋ฉ”์ธ ํŒจํ‚ค์ง€ ๋ถ„๋ฆฌ
nn98 Mar 26, 2026
fb4770a
chore: ๋ถˆํ•„์š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
dhyepark Mar 27, 2026
3644ecd
refactor: Players ๊ฐ์ฒด ์ƒ์„ฑ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ
dhyepark Mar 27, 2026
d3fefd9
refactor: ๋„๋ฉ”์ธ ๊ฐ์ฒด์™€ DTO ์—ญํ•  ๋ถ„๋ฆฌ ๋ฐ ์˜์กด์„ฑ ๊ฐœ์„ 
dhyepark Mar 28, 2026
9117b0e
refactor: ์žฌ์ž…๋ ฅ ๋กœ์ง ๊ฐœ์„ 
dhyepark Mar 28, 2026
2b41da5
chore: ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
dhyepark Mar 28, 2026
fc2bbd9
refactor: ๋„๋ฉ”์ธ ๊ฒ€์ฆ ๋กœ์ง ๋ฉ”์„œ๋“œ ์ถ”์ถœ
dhyepark Mar 28, 2026
22d50c9
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Mar 28, 2026
ab668cd
refactor: ์—ฐ์‚ฐ์ž ๊ฐ€๋…์„ฑ ๊ฐœ์„ 
dhyepark Mar 28, 2026
de79898
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Mar 28, 2026
9277514
refactor: ๋นˆ Path ๊ฐ์ฒด ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •
dhyepark Mar 28, 2026
2021542
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Mar 28, 2026
35377ee
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Mar 29, 2026
14863b8
chore: ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
dhyepark Mar 29, 2026
ecaa1a2
refactor: ์ƒ์ˆ˜ public์œผ๋กœ ๋ณ€๊ฒฝ ๋ฐ view์—์„œ ์‚ฌ์šฉ
dhyepark Mar 29, 2026
d9d96f5
refactor: ๋ณด๋“œ ์ดˆ๊ธฐํ™” ๋กœ์ง ๋งค์ง ๋„˜๋ฒ„ ์ƒ์ˆ˜ํ™”
dhyepark Mar 30, 2026
e96778d
chore: ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์ œ๊ฑฐ
dhyepark Mar 30, 2026
b21e8d7
refactor: Piece ๊ฐ์ฒด์˜ ๋™๋“ฑ์„ฑ ๋น„๊ต๋ฅผ ์œ„ํ•œ equals ๋ฐ hashCode ์žฌ์ •์˜
dhyepark Mar 30, 2026
f5aded6
refactor: ์ค‘๋ณต ๊ฒ€์ฆ ๋กœ์ง ์ œ๊ฑฐ
dhyepark Mar 30, 2026
4d6eb29
refactor: ์žฌ์ž…๋ ฅ ๋กœ์ง while๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝ
dhyepark Mar 30, 2026
179241b
chore: ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
dhyepark Mar 30, 2026
78fb80f
refactor: view ๊ด€๋ จ ์ƒ์ˆ˜ ์ด๋™
dhyepark Mar 30, 2026
9091b22
refactor: ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ƒ์ˆ˜ํ™”
dhyepark Mar 30, 2026
944b092
chore: ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์‚ญ์ œ
dhyepark Mar 30, 2026
6af0144
refactor: if๋ฌธ ์ค‘๊ด„ํ˜ธ ์ถ”๊ฐ€
dhyepark Mar 30, 2026
c2e041d
refactor: ํฌ์˜ ๋ชฉ์ ์ง€ ํƒ์ƒ‰ ๋กœ์ง ์ •๋ฆฌ ๋ฐ ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ
dhyepark Mar 30, 2026
acef1fb
chore: TODO ์ฃผ์„ ์ถ”๊ฐ€
dhyepark Mar 30, 2026
954f4f7
refactor: ๋ณ€์ˆ˜ private์œผ๋กœ ๋ณ€๊ฒฝ
dhyepark Mar 30, 2026
c5d3dae
refactor: ์ถœ๋ ฅ ๋กœ์ง ๊ฐ€๋…์„ฑ ๊ฐœ์„  ๋ฐ ์กฐํšŒ ํšจ์œจ ํ–ฅ์ƒ
dhyepark Mar 30, 2026
a02b19b
chore: ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
dhyepark Mar 30, 2026
4241395
refactor: playerTurn ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ
dhyepark Mar 30, 2026
0d01995
refactor: ์ธ์ ‘ ๋Œ€๊ฐ์„  ์กฐํšŒ ๋กœ์ง ๊ฐœ์„ 
dhyepark Mar 30, 2026
e37b843
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Mar 30, 2026
99dcbd3
refactor: ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ์ œ๊ฑฐ
dhyepark Mar 30, 2026
9d657f6
refactor: ํด๋ž˜์Šค ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋ฐ ํŒจํ‚ค์ง€ ์ด๋™
dhyepark Mar 30, 2026
8a6d117
chore: ๋ถˆํ•„์š”ํ•œ ์ž„ํฌํŠธ ์ œ๊ฑฐ
dhyepark Mar 31, 2026
b9074a0
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Mar 31, 2026
0062494
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Mar 31, 2026
e83e2b9
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Mar 31, 2026
8deb26b
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Mar 31, 2026
a78d9db
chore: ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
dhyepark Mar 31, 2026
332e529
refactor: ์กธ/๋ณ‘ ๊ตฌ๋ถ„ ์ œ๊ฑฐ ๋ฐ SOLDIER๋กœ ํ†ต์ผ
dhyepark Mar 31, 2026
37287a7
refactor: null ํฌํ•จ ์ƒ์„ฑ์ž ์ œ๊ฑฐ
dhyepark Mar 31, 2026
77c0599
refactor: canMove() ์ •์˜ ๋ฐ ์ „๋žต ํด๋ž˜์Šค ๋‚ด try-catch ์ œ๊ฑฐ
dhyepark Mar 31, 2026
40022e4
refactor: try-catch ์ œ๊ฑฐ
dhyepark Mar 31, 2026
63e0e94
refactor: ๋ณด๋“œํŒ ์ •์˜ ์ƒ์ˆ˜ ์ด๋™
dhyepark Apr 1, 2026
fbee38a
refactor: ๋ณ€์ˆ˜ ์ถ•์•ฝ ์ œ๊ฑฐ
dhyepark Apr 1, 2026
7b15c69
refactor: ๋ฐฉํ–ฅ ๊ฒฐ์ • ๋กœ์ง Function ํ™œ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ
dhyepark Apr 1, 2026
37bac28
refactor: Runner ํด๋ž˜์Šค๋ช… ๋ณ€๊ฒฝ
dhyepark Apr 1, 2026
b7db144
refactor: BoardDTO์™€ PlayerDTO ๊ฐ ๋„๋ฉ”์ธ ํŒจํ‚ค์ง€๋กœ ์ด๋™ ๋ฐ Board์˜ getter ์ ‘๊ทผ ์ œ์–ด์ž deโ€ฆ
dhyepark Apr 1, 2026
a65c89d
refactor: PieceDTO Piece ๋„๋ฉ”์ธ ํŒจํ‚ค์ง€๋กœ ์ด๋™ ๋ฐ getter ์ ‘๊ทผ์ œ์–ด์ž default๋กœ ๋ณ€๊ฒฝ
dhyepark Apr 1, 2026
70060c7
Path์˜ makePath ๋ฉ”์„œ๋“œ๋ช… add๋กœ ๋ณ€๊ฒฝ
dhyepark Apr 1, 2026
2dd6e73
refactor: ๋งค๊ฐœ๋ณ€์ˆ˜ ์ถ•์•ฝ ์ œ๊ฑฐ
dhyepark Apr 1, 2026
b2f29c6
refactor: PlayerDTO ๋ณ€ํ™˜ ๋กœ์ง DTO๋กœ ์ด๋™
dhyepark Apr 1, 2026
225896e
refactor: Position์˜ ๋ณด๋“œ ๋ฒ”์œ„ ๊ฒ€์ฆ ๋กœ์ง ์ค‘๋ณต ์ œ๊ฑฐ
dhyepark Apr 1, 2026
4a6ab76
refactor: Position ์ด๋™ ๋กœ์ง Optional ๋ฐ˜ํ™˜(tryMove)์œผ๋กœ ๋ณ€๊ฒฝ
dhyepark Apr 2, 2026
8b0c10c
test: setUp ๋ฉ”์„œ๋“œ ์ ‘๊ทผ ์ œ์–ด์ž default๋กœ ๋ณ€๊ฒฝ
dhyepark Apr 2, 2026
eb7366f
refactor: ๊ธฐ๋ฌผ ์ด๋™ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ๋กœ ์ค‘๋ณต ๊ณ„์‚ฐ ์ œ๊ฑฐ ๋ฐ PieceSelection ๋„์ž…
dhyepark Apr 2, 2026
6cd93d9
refactor: EmptyPiece ๋„์ž… ๋ฐ null ์ฒดํฌ ๋กœ์ง ๊ฐœ์„ 
dhyepark Apr 2, 2026
0062b4e
refactor: ๋ถˆํ•„์š”ํ•œ null ์ฒดํฌ ์ œ๊ฑฐ
dhyepark Apr 2, 2026
2a448d9
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Apr 2, 2026
42d5896
refactor: movePiece ๋‚ด ๋ฐฉ์–ด์  ๊ฒ€์ฆ ๋กœ์ง ์ถ”๊ฐ€ ๋ฐ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„
dhyepark Apr 2, 2026
1927274
refactor: ์ถ•์•ฝ๋œ ๋ณ€์ˆ˜๋ช… ์ˆ˜์ •
dhyepark Apr 2, 2026
adb296d
refactor: Path ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ํ•˜์—ฌ ๋งˆ/์ƒ ๋กœ์ง ์ค‘๋ณต ์ œ๊ฑฐ
dhyepark Apr 2, 2026
9034a38
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Apr 2, 2026
7c687e6
refactor: Path ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ํ•˜์—ฌ ํฌ/์ฐจ ๋กœ์ง ์ค‘๋ณต ์ œ๊ฑฐ
dhyepark Apr 2, 2026
8c3440c
refactor: ์žฌ์‹œ๋„ ๋ฉ”์„œ๋“œ null ๋Œ€์‹  Optional ๋ฐ˜ํ™˜์œผ๋กœ ๋ณ€๊ฒฝ
dhyepark Apr 3, 2026
6ad3d70
refactor: ์žฌ์‹œ๋„ ๋ฉ”์„œ๋“œ null ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •
dhyepark Apr 3, 2026
20dc50d
refactor: Optional ํ™œ์šฉํ•˜์—ฌ null ์‚ฌ์šฉ ์ œ๊ฑฐ
dhyepark Apr 3, 2026
cab0746
refactor: Optional ํ™œ์šฉํ•˜์—ฌ null ์‚ฌ์šฉ ์ œ๊ฑฐ
dhyepark Apr 3, 2026
c5955f0
refactor: Optional ํ™œ์šฉํ•˜์—ฌ null ์‚ฌ์šฉ ์ œ๊ฑฐ
dhyepark Apr 3, 2026
6cb5762
refactor: Optional ํ™œ์šฉํ•˜์—ฌ null ์‚ฌ์šฉ ์ œ๊ฑฐ
dhyepark Apr 3, 2026
2b74d1b
test: ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ์ˆ˜์ •
dhyepark Apr 3, 2026
fc798c9
refactor: name ํ•„๋“œ๋กœ euqlas(), hashCode() ์žฌ์ •์˜
dhyepark Apr 3, 2026
17df4d0
refactor: ์ง„์˜์ด NONE์ธ ๊ฒฝ์šฐ, opposite()์—์„œ NONE ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •
dhyepark Apr 3, 2026
6912d59
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Apr 4, 2026
2c08edd
feat: ๊ถ&์‚ฌ ์ „๋žต ๊ตฌํ˜„์ฒด ์ถ”๊ฐ€
dhyepark Apr 4, 2026
69ad2f9
docs: ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‚ฌํ•ญ ์ •๋ฆฌ
dhyepark Apr 6, 2026
02bede2
feat: ์ฐจ ๊ถ์„ฑ ๋‚ด ๋Œ€๊ฐ์„  ์ด๋™ ๋กœ์ง ๊ตฌํ˜„
dhyepark Apr 6, 2026
b03e3db
docs: ๊ตฌํ˜„ ์‚ฌํ•ญ ์—…๋ฐ์ดํŠธ
dhyepark Apr 6, 2026
c0d6d75
feat: ํฌ ๊ถ์„ฑ ๋‚ด ๋Œ€๊ฐ์„  ์ด๋™ ๋กœ์ง ๊ตฌํ˜„
dhyepark Apr 6, 2026
1752d36
docs: ๊ตฌํ˜„ ์‚ฌํ•ญ ์—…๋ฐ์ดํŠธ
dhyepark Apr 6, 2026
9b73dfa
chore: ๋นˆ ์ค„ ์ถ”๊ฐ€
dhyepark Apr 6, 2026
c701936
feat: ์กธ/๋ณ‘ ๊ถ์„ฑ ๋‚ด ์ด๋™ ๋กœ์ง ๊ตฌํ˜„
dhyepark Apr 6, 2026
ce4d7ea
docs: ๊ตฌํ˜„ ์‚ฌํ•ญ ์—…๋ฐ์ดํŠธ
dhyepark Apr 6, 2026
20ca9a6
test: ์ฃผ์„ ์ˆ˜์ •
dhyepark Apr 6, 2026
38984a9
feat: ๊ถ ์žกํž ์‹œ, ๊ฒŒ์ž„ ์ข…๋ฃŒ ๊ตฌํ˜„
dhyepark Apr 7, 2026
3e21c72
refactor: ๊ถ ๊ธฐ๋ฌผ ์ด๋ฆ„ GENERAL๋กœ ๋ณ€๊ฒฝ
dhyepark Apr 7, 2026
2d3e117
docs: ๊ตฌํ˜„ ์‚ฌํ•ญ ์—…๋ฐ์ดํŠธ
dhyepark Apr 7, 2026
bf401fd
refactor: ๊ฒŒ์ž„ ์ข…๋ฃŒ ๋ฌธ๊ตฌ ์ง„์˜ ํฌํ•จํ•˜๋„๋ก ๋ณ€๊ฒฝ
dhyepark Apr 7, 2026
a33ab99
feat: ์ ์ˆ˜ ๊ณ„์‚ฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„
dhyepark Apr 7, 2026
d7659e7
docs: ๊ตฌํ˜„ ์‚ฌํ•ญ ์—…๋ฐ์ดํŠธ
dhyepark Apr 7, 2026
95683bd
feat: ์žฅ๊ธฐ ๊ฒŒ์ž„ ์ €์žฅ์„ ์œ„ํ•œ Repository ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ Fake ๊ตฌํ˜„์ฒด ์ถ”๊ฐ€
dhyepark Apr 8, 2026
377c95a
test: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dhyepark Apr 8, 2026
ea20693
refactor: GameManager ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒŒ์ž„ ์‹คํ–‰ ๋กœ์ง๊ณผ ๋„๋ฉ”์ธ ๊ณ„์ธต ๋ถ„๋ฆฌ
dhyepark Apr 8, 2026
419f077
chore: MySQL JDBC ๋“œ๋ผ์ด๋ฒ„ ์˜์กด์„ฑ ์ถ”๊ฐ€
dhyepark Apr 8, 2026
9f9ed4d
feat: DBConnection ๊ตฌํ˜„
dhyepark Apr 8, 2026
e6dc70c
refactor: ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ์ˆ˜์ •
dhyepark Apr 8, 2026
3d805ac
feat: JDBC๋กœ ๊ฒŒ์ž„ ์ƒํƒœ ์ €์žฅ ๋ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„
dhyepark Apr 9, 2026
64f22ec
refactor: SQL ์ฟผ๋ฆฌ, ์ปฌ๋Ÿผ๋ช…, ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ƒ์ˆ˜ํ™”
dhyepark Apr 9, 2026
ed32917
docs: ๊ตฌํ˜„ ์‚ฌํ•ญ ์—…๋ฐ์ดํŠธ
dhyepark Apr 9, 2026
914eed2
merge: ์›๋ณธ ๋ธŒ๋žœ์น˜ ์ตœ์‹ ํ™” ๋ฐ ์ถฉ๋Œ ํ•ด๊ฒฐ
dhyepark Apr 9, 2026
3f1d790
refactor: ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์ œ๊ฑฐ
dhyepark Apr 9, 2026
2ae4204
fix: ๊ฒŒ์ž„ ์žฌ์‹œ์ž‘ ์‹œ, ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด ํ„ด ์ดˆ๊ธฐํ™” ๋ฒ„๊ทธ ์ˆ˜์ •
dhyepark Apr 10, 2026
b0e4c54
fix: ํ”Œ๋ ˆ์ด์–ด ํ„ด ์ €์žฅ ๋ฒ„๊ทธ ์ˆ˜์ •
dhyepark Apr 10, 2026
e57de48
chore: ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์ œ๊ฑฐ
dhyepark Apr 10, 2026
9f2f437
refactor: ํ”Œ๋ ˆ์ด์–ด ์กฐํšŒ ๋ฉ”์„œ๋“œ ๋‚ด, ํ„ด ์กฐํšŒ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •
dhyepark Apr 10, 2026
cecfeab
refactor: DataSource ๋„์ž… ๋ฐ AppConfig๋ฅผ ํ†ตํ•œ DI ์ ์šฉ
dhyepark Apr 11, 2026
3e3a854
refactor: ๋กœ๊น… ์ถ”๊ฐ€ ๋ฐ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ˆ˜์ •
dhyepark Apr 11, 2026
2877d0c
refactor: ํ…Œ์ŠคํŠธ ์ „์šฉ ํด๋ž˜์Šค ํ…Œ์ŠคํŠธ ํŒจํ‚ค์ง€๋กœ ์ด๋™
dhyepark Apr 11, 2026
bca207b
refactor: ์ตœ์‹  ๊ฒŒ์ž„ ID ์กฐํšŒ ๋กœ์ง ์‹ค์ œ ๋™์ž‘๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ˆ˜์ •
dhyepark Apr 11, 2026
745cdb0
refactor: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
dhyepark Apr 11, 2026
abe7d2c
refactor: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜ ์ œ๊ฑฐ
dhyepark Apr 11, 2026
2d5897b
refactor: ์ ์ˆ˜ ํ•ฉ์‚ฐ ๋กœ์ง ๊ฐœ์„ 
dhyepark Apr 11, 2026
7efffe8
refactor: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜ ์ œ๊ฑฐ
dhyepark Apr 11, 2026
3d48adb
refactor: ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ๋„์ž…์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ ์˜๋„ ๋ช…ํ™•ํ™”
dhyepark Apr 11, 2026
52866b9
refactor: equals/hashCode ์žฌ์ •์˜
dhyepark Apr 11, 2026
eb57775
refactor: ๋„๋ฉ”์ธ ๊ฐ์ฒด ๋Œ€์‹  DTO ์‚ฌ์šฉํ•˜์—ฌ Repository ์ €์žฅ ๋กœ์ง ๊ฐœ์„ 
dhyepark Apr 12, 2026
3446bf3
docs: ์‹คํ–‰ ๊ฐ€์ด๋“œ ๋ณด์™„ ๋ฐ ERD ์ถ”๊ฐ€
dhyepark Apr 12, 2026
3bf2bba
chore: ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์ถ”๊ฐ€
dhyepark Apr 12, 2026
cd54176
refactor: ๊ฒŒ์ž„ ์‹คํ–‰ ํ๋ฆ„ ์ œ์–ด ํด๋ž˜์Šค๋ช… ๋ณ€๊ฒฝ
dhyepark Apr 12, 2026
16d36bd
fix: ํ„ด ์กฐํšŒ ๋ฉ”์„œ๋“œ ๋ฒ„๊ทธ ์ˆ˜์ •
dhyepark Apr 13, 2026
61ba532
refactor: ํด๋ž˜์Šค๋ช… ๋ณ€๊ฒฝ์— ๋งž์ถฐ ๋ฉ”์„œ๋“œ๋ช… ๋ณ€๊ฒฝ
dhyepark Apr 13, 2026
071226b
refactor: Turn ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝ ๋ฐ Players ์‹๋ณ„์—์„œ turn ํ•„๋“œ ์ œ์™ธ
dhyepark Apr 13, 2026
2da1644
chore: H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜์กด์„ฑ ์ถ”๊ฐ€
dhyepark Apr 13, 2026
49407fe
refactor: ๋ณด๋“œ ์กฐํšŒ ๋ฉ”์„œ๋“œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋กœ์ง ์ˆ˜์ •
dhyepark Apr 13, 2026
d65acd8
test: JdbcJanggiRepository ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
dhyepark Apr 13, 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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,6 @@ out/

### VS Code ###
.vscode/

.DS_Store
**/.DS_Store
61 changes: 52 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,13 +174,16 @@
- [x] [๊ทœ์น™] ๋„์ฐฉ ์œ„์น˜์— ๊ฐ™์€ ํŒ€(์•„๊ตฐ) ๊ธฐ๋ฌผ์ด ์žˆ์œผ๋ฉด ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.
- [ ] [๊ทœ์น™] ์ด๋™ ์ดํ›„ ์ž์‹ ์˜ '๊ถ'์ด ์ƒ๋Œ€์—๊ฒŒ ์žกํž ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜ํ•œ ์ƒํƒœ(์žฅ๊ตฐ)๊ฐ€ ๋œ๋‹ค๋ฉด, ๊ทธ ์ด๋™์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
Comment thread
Chocochip101 marked this conversation as resolved.

- [x] **[Domain]** ๊ฐœ๋ณ„ ๊ธฐ๋ฌผ์˜ ์ด๋™ ๊ทœ์น™์„ ๊ฒ€์ฆํ•œ๋‹ค. (โ€ป **๊ถ์„ฑ ์˜์—ญ ๋ฐฐ์ œ** ๋ฃฐ ์ ์šฉ)
- [x] [๊ทœ์น™] **๊ถ/์‚ฌ**: (๊ถ์„ฑ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ) ํ˜„์žฌ ์œ„์น˜์—์„œ ์ƒํ•˜์ขŒ์šฐ 1์นธ์”ฉ๋งŒ ์ด๋™ ๊ฐ€๋Šฅํ•˜๋‹ค.
- [x] **[Domain]** ๊ฐœ๋ณ„ ๊ธฐ๋ฌผ์˜ ์ด๋™ ๊ทœ์น™์„ ๊ฒ€์ฆํ•œ๋‹ค.
- [x] [๊ทœ์น™] **๊ถ/์‚ฌ**: ๊ถ์„ฑ ๋‚ด์—์„œ ๋ชจ๋“  ๋ฐฉํ–ฅ์œผ๋กœ 1์นธ ์ด๋™ ๊ฐ€๋Šฅํ•˜๋‹ค.
- [x] [๊ทœ์น™] **์ฐจ**: ์ƒํ•˜์ขŒ์šฐ๋กœ ๊ฑฐ๋ฆฌ ์ œํ•œ ์—†์ด ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, ์ด๋™ ๊ฒฝ๋กœ ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด ์žˆ์œผ๋ฉด ๋›ฐ์–ด๋„˜์„ ์ˆ˜ ์—†๋‹ค.
- [ ] [๊ทœ์น™] **ํฌ**: ์ด๋™ ๊ฒฝ๋กœ ์‚ฌ์ด์— ๋ฐ˜๋“œ์‹œ ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด ํ•˜๋‚˜ ์ด์ƒ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๋„˜๋Š” ๊ธฐ๋ฌผ์ด 'ํฌ'์ด๋ฉด ์•ˆ ๋œ๋‹ค. ๋˜ํ•œ ๋„์ฐฉ ์œ„์น˜์˜ ๊ธฐ๋ฌผ์ด 'ํฌ'์ธ ๊ฒฝ์šฐ์—๋Š” ์žก์„ ์ˆ˜ ์—†๋‹ค.
- [x] [๊ทœ์น™]: ์ง„์˜ ์ƒ๊ด€์—†์ด ๊ถ์„ฑ ๋‚ด๋กœ ์ง„์ž…ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฑฐ๋ฆฌ ์ œํ•œ ์—†์ด ๋Œ€๊ฐ์„  ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
- [x] [๊ทœ์น™] **ํฌ**: ์ด๋™ ๊ฒฝ๋กœ ์‚ฌ์ด์— ๋ฐ˜๋“œ์‹œ ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด ํ•˜๋‚˜ ์ด์ƒ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๋„˜๋Š” ๊ธฐ๋ฌผ์ด 'ํฌ'์ด๋ฉด ์•ˆ ๋œ๋‹ค. ๋˜ํ•œ ๋„์ฐฉ ์œ„์น˜์˜ ๊ธฐ๋ฌผ์ด 'ํฌ'์ธ ๊ฒฝ์šฐ์—๋Š” ์žก์„ ์ˆ˜ ์—†๋‹ค.
- [x] [๊ทœ์น™]: ์ง„์˜ ์ƒ๊ด€์—†์ด ๊ถ์„ฑ ๋‚ด๋กœ ์ง„์ž…ํ•˜๋Š” ๊ฒฝ์šฐ, ๋Œ€๊ฐ์„ ์„ ํฌํ•จํ•˜์—ฌ ํฌ๋ฅผ ์ œ์™ธํ•œ ๊ธฐ๋ฌผ์„ ๋›ฐ์–ด๋„˜์„ ์ˆ˜ ์žˆ๋‹ค.
- [x] [๊ทœ์น™] **๋งˆ**: ์ง์ง„ ํ•œ ์นธ ํ›„ ๋Œ€๊ฐ์„  ํ•œ ์นธ ์ด๋™ํ•œ๋‹ค. ์ง์ง„ํ•˜๋Š” ์ฒซ ์นธ์— ๊ธฐ๋ฌผ์ด ์žˆ์œผ๋ฉด ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค (๋ฉฑ).
- [x] [๊ทœ์น™] **์ƒ**: ์ง์ง„ ํ•œ ์นธ ํ›„ ๋Œ€๊ฐ์„ ์œผ๋กœ ๋‘ ์นธ ์ด๋™ํ•œ๋‹ค. ์ด๋™ ๊ฒฝ๋กœ(์ง์„  1์นธ, ๋Œ€๊ฐ์„  1์นธ)๊ฐ€ ๋ง‰ํ˜€ ์žˆ์œผ๋ฉด ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค (๋ฉฑ).
- [x] [๊ทœ์น™] **์กธ/๋ณ‘**: ํ•œ ์นธ์”ฉ ์ „์ง„ ๋ฐ ์ขŒ์šฐ ์ด๋™๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. (ํ›„ํ‡ด ๋ถˆ๊ฐ€)
-[x] [๊ทœ์น™]: ์ƒ๋Œ€๋ฐฉ์˜ ๊ถ์„ฑ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐˆ ๊ฒฝ์šฐ, ๋Œ€๊ฐ์„ ์„ ํฌํ•จํ•˜์—ฌ ์ „์ง„ ์ด๋™๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

- [x] **[UI]** ์„ ํƒํ•œ ๊ธฐ๋ฌผ์ด ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํšจํ•œ ์œ„์น˜ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•œ๋‹ค.

Expand All @@ -189,17 +192,57 @@
- [x] **[Domain]** ๊ฒ€์ฆ์„ ํ†ต๊ณผํ•˜๋ฉด ๊ธฐ๋ฌผ์„ ์ด๋™์‹œํ‚ค๊ณ  ์žฅ๊ธฐํŒ์„ ๊ฐฑ์‹ ํ•œ๋‹ค.


------------------------ โœ‚๏ธ 1์ฐจ ๊ตฌํ˜„ ๋ฐ PR ํฌ์ธํŠธ ------------------------
## 4. ์ŠนํŒจ ํŒ์ • ๋ฐ ๊ฒŒ์ž„ ์ข…๋ฃŒ (1์ฐจ PR ์ดํ›„ ๊ตฌํ˜„)

- [x] **[Domain]** ์ƒ๋Œ€์˜ '๊ถ'์ด ์žกํ˜”๋Š”์ง€ ํŒ๋‹จํ•˜์—ฌ ๊ฒŒ์ž„ ์ข…๋ฃŒ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
- [x] [๊ทœ์น™] ๊ธฐ๋ฌผ ์ด๋™ ํ›„, ํ•œ์ชฝ์˜ '๊ถ'์ด ๋ณด๋“œํŒ์—์„œ ์‚ฌ๋ผ์กŒ๋‹ค๋ฉด ์ฆ‰์‹œ ๊ฒŒ์ž„์ด ๋๋‚œ๋‹ค.

## 4. ์ŠนํŒจ ํŒ์ • ๋ฐ ๊ฒŒ์ž„ ์ข…๋ฃŒ (1์ฐจ PR ์ดํ›„ ๊ตฌํ˜„)
- [x] **[Domain]** ํ˜„์žฌ ๋‚จ์•„ ์žˆ๋Š” ๊ธฐ๋ฌผ์˜ ์ด์ ์„ ๊ตฌํ•œ๋‹ค.
- [x] [๊ทœ์น™] ๊ถ์„ ์žก์œผ๋ฉด ๊ฒŒ์ž„์ด ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ถ์˜ ์ ์ˆ˜๋Š” 0์œผ๋กœ ํ•œ๋‹ค.
- [x] [๊ทœ์น™] ์ฐจ: 13์ 
- [x] [๊ทœ์น™] ํฌ: 7์ 
- [x] [๊ทœ์น™] ๋งˆ: 5์ 
- [x] [๊ทœ์น™] ์ƒ: 3์ 
- [x] [๊ทœ์น™] ์‚ฌ: 3์ 
- [x] [๊ทœ์น™] ์กธ/๋ณ‘: 2์ 

- [x] **[UI]** ์ตœ์ข… ์ŠนํŒจ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
- [x] [์ถœ๋ ฅ] ์ƒ๋Œ€๋ฐฉ์˜ ์žฅ์„ ์žก์€ ์ง„์˜(ํ”Œ๋ ˆ์ด์–ด)์„ ์Šน์ž๋กœ ์ถœ๋ ฅํ•œ๋‹ค.


## 5. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ๋ฐ ์˜์†์„ฑ ๊ด€๋ฆฌ

- [x] **[Infrastructure]** JDBC๋ฅผ ์ด์šฉํ•ด MySQL์„ ์—ฐ๋™ํ•œ๋‹ค. `class DBConnection`
- [x] [๊ทœ์น™] `DB_URL`, `DB_USER`, `DB_PASSWORD`๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ด DB๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.

- [x] **[Persistence]** ๊ฒŒ์ž„ ์ƒํƒœ ๋ฐ ๋ณด๋“œ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค. `class JdbcJanggiRepository`
- [x] [๊ทœ์น™] ์ƒˆ๋กœ์šด ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ, ํ”Œ๋ ˆ์ด์–ด ์ •๋ณด ๋ฐ ์ดˆ๊ธฐํ™”๋œ ํ„ด์„ ์ €์žฅํ•œ๋‹ค. `public Long save(Players players)`
- [x] [๊ทœ์น™] ๊ธฐ๋ฌผ ์ด๋™ ์‹œ๋งˆ๋‹ค ํ˜„์žฌ ์žฅ๊ธฐํŒ์˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. `public void updateGameStatus`
- [x] [๊ทœ์น™] ํ„ด ๋ณ€๊ฒฝ๊ณผ ๋ณด๋“œ ์ƒํƒœ ๊ฐฑ์‹ ์ด ์›์ž์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋„๋ก ํŠธ๋žœ์žญ์…˜์„ ๋ณด์žฅํ•œ๋‹ค.
- [x] [๊ทœ์น™] ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ , ์ง„ํ–‰ ์ค‘์ธ ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๊ฒŒ์ž„ ID๋ฅผ ์กฐํšŒํ•œ๋‹ค. `public Optional<Long> findInProgressGameId`
- [x] [๊ทœ์น™] ์ €์žฅ๋œ ๊ฒŒ์ž„ ID๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ด์ „ ๊ฒŒ์ž„์˜ ํ”Œ๋ ˆ์ด์–ด, ํ„ด, ๋ณด๋“œ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•œ๋‹ค.
- [x] [๊ทœ์น™] ์ŠนํŒจ ๊ฒฐ์ • ์‹œ, ํ•ด๋‹น ๊ฒŒ์ž„์˜ ์ข…๋ฃŒ ์ƒํƒœ(`is_finished`)๋ฅผ ๋ฐ˜์˜ํ•œ๋‹ค. `public void finishGame`

- [x] **[Database]** ๊ฒŒ์ž„ ์˜์†ํ™”๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ๋ฅผ ์„ค๊ณ„ํ•œ๋‹ค.
Comment thread
Chocochip101 marked this conversation as resolved.
- [x] `game`: ๊ฒŒ์ž„ ๊ธฐ๋ณธ ์ •๋ณด ๋ฐ ํ˜„์žฌ ํ„ด, ์ข…๋ฃŒ ์—ฌ๋ถ€ ๊ด€๋ฆฌ
- [x] `board_state`: ๊ฐ ๊ฒŒ์ž„ ID๋ณ„ ๊ธฐ๋ฌผ์˜ ์ข…๋ฅ˜, ์ง„์˜, ์œ„์น˜, ๊ณ ์œ  ๋ฒˆํ˜ธ ๊ด€๋ฆฌ

![db_diagram.png](images/db_diagram.png)

## 6. ์‹คํ–‰ ๋ฐฉ๋ฒ•

**โœ… ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ ํ™˜๊ฒฝ์— `MySQL`์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.**

1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ: janggi_db (๋˜๋Š” ์›ํ•˜๋Š” ์ด๋ฆ„)
2. ํ…Œ์ด๋ธ” ์ƒ์„ฑ: `src/main/resources/schema.sql` ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜์—ฌ ํ•„์š”ํ•œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑ

- [ ] **[Domain]** ์ƒ๋Œ€์˜ '๊ถ'์ด ์žกํ˜”๋Š”์ง€ ํŒ๋‹จํ•˜์—ฌ ๊ฒŒ์ž„ ์ข…๋ฃŒ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
- [ ] [๊ทœ์น™] ๊ธฐ๋ฌผ ์ด๋™ ํ›„, ํ•œ์ชฝ์˜ '๊ถ'์ด ๋ณด๋“œํŒ์—์„œ ์‚ฌ๋ผ์กŒ๋‹ค๋ฉด ์ฆ‰์‹œ ๊ฒŒ์ž„์ด ๋๋‚œ๋‹ค.
### ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์œ„ํ•ด ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜

- [ ] **[UI]** ์ตœ์ข… ์ŠนํŒจ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
- [ ] [์ถœ๋ ฅ] ์ƒ๋Œ€๋ฐฉ์˜ ์žฅ์„ ์žก์€ ์ง„์˜(ํ”Œ๋ ˆ์ด์–ด)์„ ์Šน์ž๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
- `DB_URL`: JDBC ์—ฐ๊ฒฐ ์ฃผ์†Œ (์˜ˆ: jdbc:mysql://localhost:3306/janggi_db)
- `DB_USER`: MySQL ์‚ฌ์šฉ์ž ์ด๋ฆ„
- `DB_PASSWORD`: MySQL ๋น„๋ฐ€๋ฒˆํ˜ธ
Comment thread
Chocochip101 marked this conversation as resolved.

โžก๏ธ IntelliJ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, `Run/Debug Configurations`์˜ `Environment variables` ํ•ญ๋ชฉ์—์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

## 3๏ธโƒฃ ์ž…์ถœ๋ ฅ ์š”๊ตฌ ์‚ฌํ•ญ

Expand Down
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,14 @@ repositories {
}

dependencies {
implementation 'com.mysql:mysql-connector-j:8.4.0'
implementation 'org.slf4j:slf4j-api:2.0.12'
implementation 'ch.qos.logback:logback-classic:1.5.3'
testImplementation platform('org.junit:junit-bom:5.11.4')
testImplementation platform('org.assertj:assertj-bom:3.27.3')
testImplementation('org.junit.jupiter:junit-jupiter')
testImplementation('org.assertj:assertj-core')
testImplementation 'com.h2database:h2:2.2.224'
}

java {
Expand Down
Binary file added images/db_diagram.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 4 additions & 7 deletions src/main/java/janggi/Application.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package janggi;

import janggi.view.InputView;
import janggi.view.OutputView;
import janggi.config.AppConfig;

public class Application {

public static void main(String[] args) {
InputView inputView = new InputView();
OutputView outputView = new OutputView();
JanggiGame janggiGame = new JanggiGame(outputView, inputView);
janggiGame.run();
inputView.close();
AppConfig appConfig = new AppConfig();
GameRunner gameRunner = appConfig.gameRunner();
gameRunner.run();
}
}
88 changes: 88 additions & 0 deletions src/main/java/janggi/GameRunner.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package janggi;

import janggi.domain.board.Board;
import janggi.domain.game.Players;
import janggi.domain.game.PlayersSaveDTO;
import janggi.domain.game.Side;
import janggi.domain.repository.JanggiRepository;
import janggi.view.InputView;
import janggi.view.OutputView;
import java.util.Optional;
import java.util.function.Supplier;

public class GameRunner {
private final OutputView outputView;
private final InputView inputView;
private final JanggiRepository repository;

public GameRunner(OutputView outputView, InputView inputView, JanggiRepository repository) {
this.outputView = outputView;
this.inputView = inputView;
this.repository = repository;
}

public void run() {
Optional<Long> lastGameId = repository.findInProgressGameId();

if (lastGameId.isPresent() && isContinued()) {
continuallyPlay(lastGameId.get());
return;
}

startNewGame();
inputView.close();
}

private void startNewGame() {
Players players = initialPlayers();
Long gameId = repository.save(PlayersSaveDTO.from(players));
Board board = Board.initialize();

new JanggiGame(outputView, inputView, repository, board, gameId).play(players);
}

private void continuallyPlay(Long id) {
Board board = repository.findBoardById(id);
Players players = repository.findPlayersById(id);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

ํ•œ ํ„ด์—์„œ ๊ฒŒ์ž„์„ ์ข…๋ฃŒํ•ด๋„, ๋ฌด์กฐ๊ฑด ์ดˆ ํ„ด์œผ๋กœ ์‹œ์ž‘๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋„ค์š”. ํ•ด๋‹น ์ผ€์ด์Šค๋Š” ํ…Œ์ŠคํŠธ๋กœ ์ปค๋ฒ„๊ฐ€ ๋˜๊ณ  ์žˆ๋‚˜์š”?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

JanggiRepository์— findTurnById(Long gameId)๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๊ณ  DB์—๋„ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋ณต๊ตฌํ•  ๋•Œ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋ฐ, ์ด๋ฅผ ์ด์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์„๊นŒ์š”?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

JanggiRepository์˜ findPlayersById์—์„œ findTurnById์„ ํ†ตํ•ด ํ„ด ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค!
ํ„ด ์Šค์œ„์น˜ -> ์ €์žฅ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ €์žฅ -> ํ„ด ์Šค์œ„์น˜ ์ˆœ์„œ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋‘์–ด์„œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. playerTurn ๋‚ด์˜ ๋ณด๋“œ ์ •๋ณด ์—…๋ฐ์ดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ play์˜ ํ„ด ์Šค์œ„์น˜ ์ดํ›„๋กœ ์˜ฎ๊ฒจ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค!

outputView.printResumeNotice();

new JanggiGame(outputView, inputView, repository, board, id).play(players);
}

private Players initialPlayers() {
return retry(() -> {
String choPlayerName = readPlayerName(Side.CHO);
String hanPlayerName = readPlayerName(Side.HAN);
return Players.createInitial(choPlayerName, hanPlayerName);
});
}

private String readPlayerName(Side side) {
outputView.printPlayerNameNotice(side.getDisplayName());
return inputView.readPlayerName();
}

private boolean isContinued() {
return retry(() -> {
outputView.printContinueGameNotice();
return inputView.readContinueAnswer();
});
}

private <T> T retry(Supplier<T> supplier) {
Optional<T> result = Optional.empty();
while (result.isEmpty()) {
result = tryOnce(supplier);
}
return result.get();
}

private <T> Optional<T> tryOnce(Supplier<T> supplier) {
try {
return Optional.of(supplier.get());
} catch (IllegalArgumentException e) {
outputView.printLine(e.getMessage());
return Optional.empty();
}
}
}
77 changes: 45 additions & 32 deletions src/main/java/janggi/JanggiGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,62 +2,82 @@

import janggi.domain.board.Board;
import janggi.domain.board.PieceSelection;
import janggi.domain.game.Player;
import janggi.domain.game.PlayerResultDTO;
import janggi.domain.game.Players;
import janggi.domain.board.Position;
import janggi.domain.game.Side;
import janggi.domain.board.BoardDTO;
import janggi.domain.game.PlayerDTO;
import janggi.domain.repository.JanggiRepository;
import janggi.view.InputView;
import janggi.view.OutputView;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;

public class JanggiGame {

private final OutputView outputView;
private final InputView inputView;
private final Board board;
private final JanggiRepository repository;
private final Long gameId;

public JanggiGame(OutputView outputView, InputView inputView) {
public JanggiGame(OutputView outputView, InputView inputView, JanggiRepository repository, Board board,
Long gameId) {
this.outputView = outputView;
this.inputView = inputView;
this.board = Board.initialize();
this.repository = repository;
this.board = board;
this.gameId = gameId;
}

public void run() {
Players players = initialPlayers();
public void play(Players players) {
printBoard();
play(players);
}

private Players initialPlayers() {
String choPlayerName = readPlayerName(Side.CHO);
String hanPlayerName = readPlayerName(Side.HAN);
while (true) {
Player current = players.getCurrentPlayer();
PlayerDTO currentPlayerDTO = PlayerDTO.from(current);
printPlayerTurnNotice(currentPlayerDTO);

playerTurn(currentPlayerDTO);

if (board.isGameOver()) {
handleGameOver(currentPlayerDTO, players);
break;
}

return Players.of(choPlayerName, hanPlayerName);
players.switchTurn();
repository.updateGameStatus(this.gameId, board, players.getTurn());
}
}

private void printBoard() {
outputView.printBoardSettingNotice();
outputView.printBoardStatus(BoardDTO.from(board));
}

private void play(Players players) {
while (true) {
PlayerDTO currentPlayer = players.getCurrentPlayer();
printPlayerTurnNotice(currentPlayer);
playerTurn(currentPlayer);
players.switchTurn();
}
}

private void playerTurn(PlayerDTO currentPlayer) {
Side currentSide = currentPlayer.side();
PieceSelection pieceSelection = selectMovablePiece(currentSide);
movePiece(pieceSelection.selected(), pieceSelection.destinations());
}

private void handleGameOver(PlayerDTO winner, Players players) {
repository.finishGame(this.gameId);
outputView.printWinnerNotice(winner.side(), winner.name());

List<PlayerResultDTO> playerResults = new ArrayList<>();
for (Player player : players) {
double score = board.calculateScore(player.getSide());
playerResults.add(new PlayerResultDTO(player.getName(), player.getSide(), score));
}
outputView.printTotalScores(playerResults);
}

private PieceSelection selectMovablePiece(Side currentSide) {
return retry(() -> {
outputView.printSelectPiecePosition();
Expand Down Expand Up @@ -99,31 +119,24 @@ private Position readTargetPosition() {
});
}

private String readPlayerName(Side side) {
return retry(() -> {
outputView.printPlayerNameNotice(side.getDisplayName());
return inputView.readPlayerName();
});
}

private void printPlayerTurnNotice(PlayerDTO currentPlayer) {
outputView.printPlayerTurnNotice(currentPlayer.name(), currentPlayer.side().getDisplayName());
}

private <T> T retry(Supplier<T> supplier) {
T result = null;
while (result == null) {
Optional<T> result = Optional.empty();
while (result.isEmpty()) {
result = tryOnce(supplier);
}
return result;
return result.get();
}

private <T> T tryOnce(Supplier<T> supplier) {
private <T> Optional<T> tryOnce(Supplier<T> supplier) {
try {
return supplier.get();
return Optional.of(supplier.get());
} catch (IllegalArgumentException e) {
outputView.printLine(e.getMessage());
return null;
return Optional.empty();
}
}
}
Loading