Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
1cb85a2
refactor: ์ •์ฑ…์˜ Clock ์˜์กด์„ฑ์„ ์ƒ์„ฑ์ž ์ฃผ์ž…์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ๋ฏธ๋Ÿฌ ์ •์ฑ… ์ œ๊ฑฐ
softmoca Jun 3, 2026
08cca51
feat: ์˜ˆ์•ฝ ์‹œ์  ๋น„๊ต๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ’ ๊ฐ์ฒด ReservationDateTime ์ถ”๊ฐ€
softmoca Jun 3, 2026
09706f7
test(domain): ReservationTest ์ •์ฑ… ํ˜‘๋ ฅ์„ ์‹ค์ œ ์ •์ฑ…+๊ฒฐ๊ณผ ๊ฒ€์ฆ์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์ˆ˜๋™ ์Šคํ… ์ œ๊ฑฐ
softmoca Jun 3, 2026
c081d12
refactor: ์‹œ์  ๊ฒ€์ฆ์„ '๋„๋ฉ”์ธ ์‹œ์  ๋น„๊ต + ์ •์ฑ… ์กฐํ•ฉ' ๊ตฌ์กฐ๋กœ ์ „ํ™˜
softmoca Jun 3, 2026
d62b9db
refactor(test): JdbcWaitingRepositoryTest๋ฅผ ๋‹ค๋ฅธ Repository ์Šฌ๋ผ์ด์Šค์™€ ๊ฐ™์€ ์›์น™์œผโ€ฆ
softmoca Jun 4, 2026
3e1f340
refactor: ReservationTimeServiceTest์—์„œ ์ž‰์—ฌ findAvailable ๊ฒ€์ฆ ์ œ๊ฑฐ
softmoca Jun 4, 2026
9fc6c7a
docs : ์„œ๋น„์Šค ํ†ตํ•ฉํ…Œ์ŠคํŠธ ์ฃผ์„ ์„ค๋ช…๊ธฐ๋ก ๊ตฌ์ฒด์ ์œผ๋กœ ์ˆ˜์ •
softmoca Jun 4, 2026
55f9d3c
refactor: ReservationServiceTest์˜ ๊ฒ€์ฆ ๋ชจ๋“œ๋ฅผ ๋ช…์‹œํ•˜๊ณ  ์‚ฌ์ „ ์กฐํšŒ ์‹คํŒจ ๋ถ„๊ธฐ ๋ณด์™„
softmoca Jun 4, 2026
cd35843
refactor: WaitingService ๊ฒ€์ฆ์„ ํ†ตํ•ฉ ๋ฉ”์ธ์œผ๋กœ ํ™•์ •ํ•˜๊ณ  Mock ๋น„๊ต๋ณธ์„ ํ•™์Šต ๊ธฐ๋ก์œผ๋กœ park
softmoca Jun 4, 2026
b3d1b9e
chore(test): @MockBean โ†’ @MockitoBean ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (web ์Šฌ๋ผ์ด์Šค 6๊ฐœ)
softmoca Jun 4, 2026
cc436cc
fix: ์Šฌ๋กฏ+์ด๋ฆ„ ์œ ๋‹ˆํฌ ์ œ์•ฝ ์ถ”๊ฐ€ ์ค‘๋ณต ๋Œ€๊ธฐ DB ๋ฐฉ์–ด์„ 
softmoca Jun 5, 2026
994763c
docs : waiting ์œ ๋‹ˆํฌ ์ œ์•ฝ ๋ช…์„ธ ์ถ”๊ฐ€
softmoca Jun 5, 2026
2a3adaa
feat : ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„ ์ ์šฉ
softmoca Jun 5, 2026
6c6c460
test : ์ž๋™ ์Šน๊ฒฉ ์ค‘๊ฐ„ ์‹คํŒจ ์‹œ ์ „์ฒด ๋กค๋ฐฑ ์ฆ๋ช…
softmoca Jun 5, 2026
1d5a34d
test : ๋Œ€๊ธฐ ์ทจ์†Œ ์žฌ์ •๋ ฌ ์ค‘๊ฐ„ ์‹คํŒจ ์‹œ ์ „์ฒด ๋กค๋ฐฑ ์ฆ๋ช… ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
softmoca Jun 5, 2026
059ef3a
docs : WaitingServiceMockTest ์‚ฌ์ดํด 2 ์žฌ๊ฒ€ํ†  ๊ฒฐ๊ณผ ๊ธฐ๋ก
softmoca Jun 5, 2026
fc66f42
docs : ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„์™€ ๊ทผ๊ฑฐ ๋ฌธ์„œ ์ถ”๊ฐ€
softmoca Jun 5, 2026
cb68c89
test : ํ…Œ์ŠคํŠธ๋ช… ์ˆ˜์ • ๋ฐ ์ฃผ์„ ์ถ”๊ฐ€๋กœ ์˜๋„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋˜๋„๋ก ๊ฐœ์„ 
softmoca Jun 6, 2026
069852f
style : ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์ œ๊ฑฐ
softmoca Jun 6, 2026
7a3e4fa
feat : wirte๋ฅผ ํ•˜๋Š” ๋ชจ๋“  ์—ฐ์‚ฐ ๋ฉ”์„œ๋“œ์— ํŠธ๋žœ์žญ์…˜ ์ ์šฉ
softmoca Jun 7, 2026
f70a199
refactor : ์–ผ๋ฆฌํ‹ฐ๋Ÿฐ ์ ์šฉ ๋ฐ ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ๋กœ ๊ฐœ๋…์„ฑ ๊ฐœ์„ 
softmoca Jun 7, 2026
d34b4e8
refactor: ์˜ˆ์•ฝ ์‹œ์  ๋ฉ”์„œ๋“œ๋ช…์„ ๋„๋ฉ”์ธ ์šฉ์–ด๋กœ ๋ณ€๊ฒฝ
softmoca Jun 7, 2026
3e462ed
refactor: ์˜ˆ์•ฝ ์‹œ์  ๋น„๊ต ๋ฉ”์„œ๋“œ๋ช…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณ€๊ฒฝ
softmoca Jun 7, 2026
bbf3097
docs : ํ•™์Šต ๊ธฐ๋ก ๋ฌธ์„œ ์ถ”๊ฐ€
softmoca Jun 18, 2026
47cd79a
docs : ํ•™์Šต ๋ฌธ์„œ ๋ชจ๋ธ ๋‚ด์šฉ ์ˆ˜์ •
softmoca Jun 18, 2026
7b4e868
[1๋‹จ๊ณ„] ๋งคํ•‘ ๋ณ€ํ™˜ โ€” ThemeยทReservationTime๋ฅผ JPA @Entity๋กœ ์ „ํ™˜ + ํ—ฅ์‚ฌ๊ณ ๋‚  ์–ด๋Œ‘ํ„ฐํ™”
softmoca Jun 18, 2026
e750596
[1๋‹จ๊ณ„] ๋ฌธ์„œ โ€” 02-step1-jpa-mapping 1-1 ๋Œ€ํญ ํ™•์žฅ (์‹ค์ธก ๋ฐœํ–‰ SQLยท๊ด€์ฐฐยท๊ฐญยท๊ฒฐ์ • A/B/C)
softmoca Jun 18, 2026
6f6f64b
[1๋‹จ๊ณ„] ๊ตฌ JdbcThemeRepository ์ œ๊ฑฐ โ€” ThemeRepositoryAdapter(JPA)๋กœ ๋Œ€์ฒด
softmoca Jun 18, 2026
c5bf25f
[1๋‹จ๊ณ„] ๊ตฌ JdbcReservationTimeRepository ์ œ๊ฑฐ โ€” ReservationTimeRepositoryAโ€ฆ
softmoca Jun 18, 2026
ed9b2ba
[1๋‹จ๊ณ„] JdbcThemeRepositoryTest ์ œ๊ฑฐ โ€” ๋Œ€์ƒ ํด๋ž˜์Šค(JdbcThemeRepository) ์‚ญ์ œ๋กœ ๋ฌดํšจํ™”
softmoca Jun 18, 2026
822857e
[1๋‹จ๊ณ„] JdbcReservationTimeRepositoryTest ์ œ๊ฑฐ โ€” ๋Œ€์ƒ ํด๋ž˜์Šค(JdbcReservationTiโ€ฆ
softmoca Jun 18, 2026
8ef9f43
[1๋‹จ๊ณ„] ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘(1-2) โ‘ /โ‘ก โ€” ReservationยทWaiting @Entity + @ManyToOne ์ „ํ™˜
softmoca Jun 18, 2026
42d9fa2
[1๋‹จ๊ณ„] ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘(1-2) โ‘ข โ€” ๊ณผ๋„๊ธฐ ๊ตฐ๋”๋”๊ธฐ ์ œ๊ฑฐ (JPQL ์Šน๊ฒฉ + create-drop)
softmoca Jun 18, 2026
f3c7193
[1๋‹จ๊ณ„] schema.sql ์ œ๊ฑฐ โ€” 4๊ฐœ ํ…Œ์ด๋ธ” ๋ชจ๋‘ @Entity, Hibernate(create-drop)๊ฐ€ DDL ์†Œ์œ 
softmoca Jun 18, 2026
cb59c26
[1๋‹จ๊ณ„] ๊ตฌ JdbcReservationRepository ์ œ๊ฑฐ โ€” ReservationRepositoryAdapter(Jโ€ฆ
softmoca Jun 18, 2026
7bd89e8
[1๋‹จ๊ณ„] ๊ตฌ JdbcWaitingRepository ์ œ๊ฑฐ โ€” WaitingRepositoryAdapter(JPA)๋กœ ๋Œ€์ฒด
softmoca Jun 18, 2026
b77b800
[1๋‹จ๊ณ„] JdbcReservationRepositoryTest ์ œ๊ฑฐ โ€” ๋Œ€์ƒ ํด๋ž˜์Šค ์‚ญ์ œ๋กœ ๋ฌดํšจํ™”
softmoca Jun 18, 2026
2de1190
[1๋‹จ๊ณ„] JdbcWaitingRepositoryTest ์ œ๊ฑฐ โ€” ๋Œ€์ƒ ํด๋ž˜์Šค ์‚ญ์ œ๋กœ ๋ฌดํšจํ™”
softmoca Jun 18, 2026
0b2c3e7
[1๋‹จ๊ณ„] ๋ฌธ์„œ โ€” 1-2 ์—ฐ๊ด€๊ด€๊ณ„ ์„น์…˜ ๋Œ€ํญ ํ™•์žฅ (์‹ค์ธก ๋ฐœํ–‰ SQLยทN+1 ์”จ์•—ยทflush ์ˆœ์„œยท๊ฒฐ์ • A/B/C)
softmoca Jun 18, 2026
126eb2b
[1๋‹จ๊ณ„] ๋ฌธ์„œ โ€” 1-3 ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๊ด€์ฐฐ 6๊ฐœ ์‹ค์ธก ์ฑ„์›€ + 1๋‹จ๊ณ„ ์ข…ํ•ฉ ์ถ”๊ฐ€
softmoca Jun 18, 2026
9f1785f
[2๋‹จ๊ณ„] ๋ฌธ์„œ โ€” ๋‚ด ์˜ˆ์•ฝ ๋ชฉ๋ก: ๊ฒฐ์ •(name ์œ ์ง€ยท๋ฉ”์„œ๋“œ์ฟผ๋ฆฌ) + mine ๊ฒฝ๋กœ N+1 ์‹ค์ธก ๊ธฐ๋ก
softmoca Jun 18, 2026
bd873dc
[3๋‹จ๊ณ„] 3-1 N+1 ํ•ด๊ฒฐ โ€” @ManyToOne EAGERโ†’LAZY + ์กฐํšŒ ๊ฒฝ๋กœ @EntityGraph fetch join
softmoca Jun 18, 2026
65dad4a
[3๋‹จ๊ณ„] ๋ฌธ์„œ โ€” 3-1 N+1(8โ†’2 fetch join) + 3-2 order_index vs JPQL rank ์‹ค์ธกยท๊ฒฐ์ •
softmoca Jun 18, 2026
2db27d0
[4๋‹จ๊ณ„] ๋ฌธ์„œ โ€” ์ž๋™ ์Šน์ธ flush ์ˆœ์„œ ์‹ค์ธก + ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„ ๊ฒฐ์ • + PR ๋ณธ๋ฌธ ์žฌ๋ฃŒ
softmoca Jun 18, 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
39 changes: 37 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,11 @@
- `Waiting` โ€” ๊ทธ ์Šฌ๋กฏ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค„. ์ˆœ๋ฒˆ์„ ๊ฐ€์ง„๋‹ค.
- `Waitings` โ€” ๋Œ€๊ธฐ๋“ค์˜ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜. ์ˆœ๋ฒˆ ๋ถ€์—ฌยท์ค‘๋ณต ๊ฒ€์ฆยท์žฌ์ •๋ ฌ ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์†Œ์œ ํ•œ๋‹ค.

์˜ˆ์•ฝ์ด ์ทจ์†Œ๋˜๋ฉด ์Šฌ๋กฏ์ด ๋น„๊ณ , ์ฒซ ๋Œ€๊ธฐ๊ฐ€ ์˜ˆ์•ฝ์œผ๋กœ ์Šน๊ฒฉ๋œ๋‹ค.
`reservation` ํ…Œ์ด๋ธ”์—๋Š” `UNIQUE(date, time_id, theme_id)`, `waiting` ํ…Œ์ด๋ธ”์—๋Š” `UNIQUE(date, time_id, theme_id, name)` ์ œ์•ฝ์„ ๋‘”๋‹ค.
์˜ˆ์•ฝ์ด ์ทจ์†Œ๋˜๋ฉด ์Šฌ๋กฏ์ด ๋น„๊ณ , ์ฒซ ๋Œ€๊ธฐ๊ฐ€ ์˜ˆ์•ฝ์œผ๋กœ ์Šน๊ฒฉ๋œ๋‹ค.
reservation ํ…Œ์ด๋ธ”์—๋Š” UNIQUE(date, time_id, theme_id), waiting ํ…Œ์ด๋ธ”์—๋Š” UNIQUE(date, time_id, theme_id, name)(๊ฐ™์€ ์‚ฌ๋žŒ ์ค‘๋ณต ๋Œ€๊ธฐ ๋ฐฉ์–ด)๊ณผ
UNIQUE(date, time_id, theme_id, order_index)(์ˆœ๋ฒˆ ์ถฉ๋Œ ๋ฐฉ์–ด)๋ฅผ ๋‘”๋‹ค. ์ „์ž๋Š” ๋ชจ๋ธ์ด ๋ฐ”๋€Œ์–ด๋„ ๋‚จ๋Š” ๋„๋ฉ”์ธ ๋ถˆ๋ณ€์‹, ํ›„์ž๋Š” ์ €์žฅ๋œ ์ˆœ๋ฒˆ ๋ชจ๋ธ์— ์ข…์†๋œ ์ œ์•ฝ์ด๋‹ค.



> ํ†ตํ•ฉ ๋ชจ๋ธ(status ์ปฌ๋Ÿผ)ยท์ ˆ์ถฉ ๋ชจ๋ธ(FK ์ฐธ์กฐ) ๋Œ€์‹  ๋ถ„๋ฆฌ ๋ชจ๋ธ์„ ํƒํ•œ ์ž์„ธํ•œ ๊ทผ๊ฑฐ๋Š” PR ๋ณธ๋ฌธ์— ํฌํ•จ.

Expand Down Expand Up @@ -184,3 +187,35 @@
- [x] ์˜ˆ์•ฝ ํŽ˜์ด์ง€(`reservations.html`)์— ์˜ˆ์•ฝ/๋Œ€๊ธฐ ์ƒํƒœ ๋ Œ๋”๋ง
- [x] ๋‚ด ์˜ˆ์•ฝ ํŽ˜์ด์ง€(`my-reservations.html`) ์˜ˆ์•ฝ/๋Œ€๊ธฐ ์ƒํƒœ ๋ Œ๋”๋ง
- [x] ๊ฐ ์ผ€์ด์Šค ์š”๊ตฌ์‚ฌํ•ญ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

## ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„์™€ ๊ทธ ๊ทผ๊ฑฐ

๋‘ ํ๋ฆ„์„ ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ๋Š”๋‹ค.
๋ฌถ๋Š” ๊ธฐ์ค€์€ "๋ถ€๋ถ„ ์‹คํŒจ ์‹œ ์–ด๋–ค ๊นจ์ง„ ์ƒํƒœ๊ฐ€ ๋‚จ๋Š”๊ฐ€"๋กœ ๋„์ถœ.
์–ด๋А ๋‹จ๊ณ„๊ฐ€ ์‹คํŒจํ•ด๋„ ๋ฐ์ดํ„ฐ ๋ชจ์ˆœ + ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ๊นจ์ง„ ์•ฝ์†์ด ๋‚จ์œผ๋ฉด, ๊ทธ ์ž‘์—…๋“ค์€ ํ•จ๊ป˜์—ฌ์•ผ ํ•œ๋‹ค.

### ์˜ˆ์•ฝ ์ทจ์†Œ โ†’ ์ž๋™ ์Šน๊ฒฉ (`deleteByOwner` , ๋‘ ํ…Œ์ด๋ธ” 4์ข… ๋ณ€๊ฒฝ)

[1] reservation DELETE(์ทจ์†Œ์ž) โ†’ [2] reservation INSERT(์Šน๊ฒฉ์ž) โ†’ [3] waiting DELETE(์Šน๊ฒฉ๋œ 1๋ฒˆ) โ†’ [4] order_index UPDATEร—N(๋‚˜๋จธ์ง€
๋‹น๊ธฐ๊ธฐ)

- **[2] ์‹คํŒจ([1]๋งŒ ์„ฑ๊ณต)** โ€” ์ทจ์†Œ์ž ์˜ˆ์•ฝ์€ ์‚ฌ๋ผ์กŒ๋Š”๋ฐ ์Šน๊ฒฉ์ด ์•ˆ ๋จ โ†’ ์Šฌ๋กฏ์ด ํ…… ๋น”. 1๋ฒˆ ๋Œ€๊ธฐ์ž๋Š” ๋ชฉ๋ก์—” "๋Œ€๊ธฐ 1๋ฒˆ"์ธ๋ฐ ์Šฌ๋กฏ์€ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์ƒํƒœ โ†’ ๋ˆ„๊ตฌ๋‚˜ ์ƒˆ๋กœ ์˜ˆ์•ฝํ•ด ๊ธฐ์กด 1๋ฒˆ์„ ์ถ”์›”. ๊ฐ€์žฅ
๋ง๊ฐ€์ง€๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค.
- **[3] ์‹คํŒจ([1,2] ์„ฑ๊ณต)** โ€” ์Šน๊ฒฉ์ž๊ฐ€ ์˜ˆ์•ฝ์ด ๋๋Š”๋ฐ ๊ทธ์˜ ๋Œ€๊ธฐ ROW๊ฐ€ ์•ˆ ์ง€์›Œ์ง โ†’ ์˜ˆ์•ฝ์ž์ด๋ฉด์„œ ๋™์‹œ์— ๋Œ€๊ธฐ 1๋ฒˆ. ๋‚ด ๋ชฉ๋ก์— ๊ฐ™์€ ์Šฌ๋กฏ์ด ๋‘ ์ค„๋กœ ์ค‘๋ณต ๋…ธ์ถœ.
- **[4] ์‹คํŒจ([1,2,3] ์„ฑ๊ณต)** โ€” ์Šน๊ฒฉ์€ ๋์ง€๋งŒ ๋’ท์ˆœ๋ฒˆ์ด ์•ˆ ๋‹น๊ฒจ์ง โ†’ ์ˆœ๋ฒˆ์— ๊ตฌ๋ฉ(1 ์—†์ด 2,3๋งŒ). ์ดํ›„ ๊ทธ ์Šฌ๋กฏ ๋Œ€๊ธฐ ์‹ ์ฒญ์ด ์ถฉ๋Œ(500).

โ†’ ์…‹ ๋‹ค ๋ฐ์ดํ„ฐ ๋ชจ์ˆœ + ๊นจ์ง„ ์•ฝ์†์ด๋ฏ€๋กœ 4์ข…์„ ํ•œ ๊ฒฝ๊ณ„๋กœ ๋ฌถ๋Š”๋‹ค.

### ๋Œ€๊ธฐ ์ทจ์†Œ โ†’ ์ˆœ๋ฒˆ ์žฌ์ •๋ ฌ (`cancelByOwner` ยท waiting ํ•œ ํ…Œ์ด๋ธ” 2์ข… ๋ณ€๊ฒฝ)

[1] waiting DELETE(์ทจ์†Œ ๋Œ€์ƒ) โ†’ [2] order_index UPDATEร—N(๋’ค ์ˆœ๋ฒˆ ๋‹น๊ธฐ๊ธฐ)

- **[2] ์‹คํŒจ([1]๋งŒ ์„ฑ๊ณต)** โ€” ๋Œ€๊ธฐ๋Š” ๋น ์กŒ๋Š”๋ฐ ์žฌ์ •๋ ฌ์ด ์•ˆ ๋จ โ†’ ์ˆœ๋ฒˆ์— ๊ตฌ๋ฉ([1,2,3]์—์„œ 2 ์ทจ์†Œ ์‹œ [1,3]). 3๋ฒˆ์ด๋˜ ์‚ฌ๋žŒ์ด ๊ณ„์† "๋Œ€๊ธฐ 3๋ฒˆ"์ธ๋ฐ ์•ž์—” 1๋ช…๋ฟ โ†’ ํ‘œ์‹œ ์ˆœ๋ฒˆ๊ณผ ์‹ค์ œ ์ค„
๊ธธ์ด ๋ถˆ์ผ์น˜. ์ดํ›„ ๊ทธ ์Šฌ๋กฏ ์‹ ์ฒญ์ด ์ถฉ๋Œ(500).

โ†’ 2์ข…์„ ํ•œ ๊ฒฝ๊ณ„๋กœ ๋ฌถ๋Š”๋‹ค.

### ๊ฒ€์ฆ

์ด ๊นจ์ง„ ์ƒํƒœ๋“ค์€ ๊ฐ ๋‹จ๊ณ„๊ฐ€ ์‹คํŒจํ•  ๋•Œ ์ƒ๊ธฐ์ง€๋งŒ **๋ชจ๋‘ ํ•˜๋‚˜์˜ `@Transactional` ๊ฒฝ๊ณ„๊ฐ€ ๋ง‰๋Š”๋‹ค.** ๋”ฐ๋ผ์„œ ๊ฒ€์ฆ์€ ์Œ“์ธ ๋ณ€๊ฒฝ์ด ๊ฐ€์žฅ ๋งŽ์€ [4](์žฌ์ •๋ ฌ) ์‹คํŒจ ํ•˜๋‚˜๋กœ ๋Œ€ํ‘œํ•˜๊ณ (๊ฐ™์€ ํšŒ๊ท€๋ฅผ ์ค‘๋ณต ๊ฒ€์ฆํ•˜์ง€
์•Š์Œ), ๋‚˜๋จธ์ง€ ๋ ์ƒํƒœ๋Š” ์ด ๋ฌธ์„œ๋กœ ๋‚จ๊ธด๋‹ค. โ†’ `ReservationPromotionTransactionTest`, `WaitingCancelTransactionTest`.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'

implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
Expand Down
166 changes: 166 additions & 0 deletions docs/00-overview.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
# 00 ยท ๋ฏธ์…˜ ๊ฐœ์š” & ํ•™์Šต ๋ฐฉํ–ฅ

> JPA ์ „ํ™˜ + ์˜ˆ์•ฝ ๋Œ€๊ธฐ ๋ฏธ์…˜์˜ ํฐ ๊ทธ๋ฆผ. ์ด ๋ฌธ์„œ๋Š” ํฐ ๊ทธ๋ฆผ์„ ์žก๋Š” ๋‹จ๊ณ„์—์„œ ์ž‘์„ฑํ•˜๊ณ , ๋‹จ๊ณ„๊ฐ€ ์ง„ํ–‰๋˜๋ฉฐ ๊ฐฑ์‹ ํ•œ๋‹ค.
> ๐Ÿ–Š๏ธ ๊ฐ€์ด๋“œ ๋ธ”๋ก(์ด ์ธ์šฉ๋ฌธ๋“ค)์€ ์ดˆ์•ˆ์šฉ. ์™„์„ฑ ์‹œ ์ง€์›Œ๋„ ๋จ.

---

## ๋ฉ”ํƒ€

| ํ•ญ๋ชฉ | ๊ฐ’ |
|--------------|---------------------------------------|
| ์ €์žฅ์†Œ | `softmoca/spring-roomescape-waiting` |
| ์‹œ์ž‘ ๋ธŒ๋žœ์น˜ | `step2` (JdbcTemplate ๋ฐฉํƒˆ์ถœ ์ฝ”๋“œ) |
| ์ž‘์—… ๋ธŒ๋žœ์น˜ | `step3-jpa` |
| ๋‹จ์ผ PR ๋งˆ๊ฐ | 06-18(๋ชฉ) 18:00 |
| JPA ์„ค๊ณ„ ํ† ๋ก  | 06-19(๊ธˆ) 10:40~11:30, ๊ฐ•์˜์žฅ |
| ์ž๊ธฐ์ ๊ฒ€ยท์‚ฌํ›„์„ค๋ฌธ ๋งˆ๊ฐ | 06-22(์›”) 18:00 |
| ์ปค๋ฐ‹ ํ‘œ๊ธฐ | `[1๋‹จ๊ณ„] ๋งคํ•‘ ๋ณ€ํ™˜` ์‹ ๋‹จ๊ณ„ prefix (PR ๋ณธ๋ฌธ ๊ฒฝ๊ณ„์šฉ) |

---

## ์ด ๋ฏธ์…˜์˜ ๋ณธ์งˆ

์ƒˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ฒ• ์•”๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ **๋‚ด ์–ด๋…ธํ…Œ์ด์…˜ ํ•œ ์ค„์ด ๋งŒ๋“œ๋Š” ์‹ค์ œ SQL์„ ์ถ”์ **ํ•˜๋Š” ๋ฏธ์…˜. JPA๊ฐ€ ์ž๋™ํ™”ํ•œ ๋งŒํผ ๊ฐ์ถฐ์ง„ SQL์„, ๋‚ด JDBC ์ฝ”๋“œ๋ฅผ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋กœ ์˜ฎ๊ธฐ๋ฉฐ ๋‹ค์‹œ ๋ˆˆ์— ๋ณด์ด๊ฒŒ ๋งŒ๋“ ๋‹ค. "
๋‚ด๊ฐ€ ์“ด SQL = ๋‚˜๊ฐ€๋Š” SQL"์ด๋˜ JDBC์˜ ํˆฌ๋ช…์„ฑ์„ ์ž๋™ํ™”์™€ ๋งž๋ฐ”๊พผ ๋น„์šฉ์„ ์†์œผ๋กœ ๋งŒ์ง„๋‹ค.

> ์ž๋™์œผ๋กœ ๋ฌด์—‡์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ชจ๋ฅด๋ฉด ์˜๋„์™€ ๋‹ค๋ฅธ SQL์ด ๋‚˜๊ฐ€๋„ ๊ทธ ์‚ฌ์‹ค ์ž์ฒด๋ฅผ ๋ชจ๋ฅธ๋‹ค. ๋ฌด์—‡์ด ์–ด๋””๋กœ ์˜ฎ๊ฒจ๊ฐ€๊ณ  ๋ฌด์—‡์ด ์ƒˆ๋กœ ์ƒ๊ธฐ๋Š”์ง€ **๋‚ด ์ฝ”๋“œ ์œ„์—์„œ** ๋ณธ๋‹ค.

## ํ•™์Šต ๋ชฉํ‘œ (LMS)

- JdbcTemplate โ†” JPA ํ‘œํ˜„๋ ฅ ์ฐจ์ด๋ฅผ ๋‚ด ์ฝ”๋“œ ์œ„์—์„œ ๋น„๊ต
- ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ(1์ฐจ ์บ์‹œยทdirty checkingยท์“ฐ๊ธฐ ์ง€์—ฐยทflushยทfetch) ์ง์ ‘ ๊ด€์ฐฐ + ๋ฐœํ–‰ SQL ์ถ”์ 
- ์—ฐ๊ด€๊ด€๊ณ„ ๊ฒฐ์ •(๋‹จ/์–‘๋ฐฉํ–ฅยทํŽ˜์น˜ยทcascadeยทorphanRemoval)์˜ ๊ทผ๊ฑฐยทํ•œ๊ณ„ ์„ค๋ช…
- N+1 ๋ฐœ๊ฒฌ + fetch joinยท`@EntityGraph`ยทJPQL ๋น„๊ต
- ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„ยท๋™์‹œ์„ฑ ์˜์‹ํ•˜๋ฉฐ ๋„๋ฉ”์ธ ๋กœ์ง(์ž๋™ ์Šน์ธ) ์œ„์น˜ ๊ฒฐ์ •

---

## ์ง„ํ–‰ ๋ฐฉ์‹ & 1์ฃผ ํ๋ฆ„

1์ฃผ ๋ฏธ์…˜, ๋ณ„๋„ OT ์—†์Œ. **์‚ฌ์ „ํ•™์Šต โ†’ 0~4๋‹จ๊ณ„ ๋ณธ์ธ ํŽ˜์ด์Šค โ†’ PR โ†’ JPA ์„ค๊ณ„ ํ† ๋ก  โ†’ ์ž๊ธฐ์ ๊ฒ€** ์ˆœ.

| ์ผ | ํ™œ๋™ |
|------------------|-------------------------------------|
| ์›” | LMSยท์‚ฌ์ „ํ•™์Šต ํ†ต๋… โ†’ ๋ฐฉํƒˆ์ถœ ์ฝ”๋“œ ๋™์ž‘ ํ™•์ธ โ†’ 0๋‹จ๊ณ„ ์‹œ์ž‘ |
| ํ™”~๋ชฉ | 0~4๋‹จ๊ณ„ ๋ณธ์ธ ํŽ˜์ด์Šค (์ปค๋ฐ‹ยทํ‘ธ์‹œ) |
| **๋ชฉ 18:00** | **PR ์ œ์ถœ (๋งˆ๊ฐ)** |
| ๊ธˆ | JPA ์„ค๊ณ„ ํ† ๋ก  (10:40~11:30, ๊ฐ•์˜์žฅ) |
| ํ† ~์ผ | ์ž๊ธฐ์ ๊ฒ€ + LMS+ ์‚ฐ์ถœ๋ฌผ ์ž‘์„ฑ |
| **๋‹ค์Œ ์ฃผ ์›” 18:00** | **์ž๊ธฐ์ ๊ฒ€ + LMS+ ์‚ฐ์ถœ๋ฌผ ๋งˆ๊ฐ** |

- **๋‹จ๊ณ„ ๊ถŒ์žฅ ์ข…๋ฃŒ์„  ์—†์Œ** โ€” ๊ฐ€๋Š” ๋งŒํผ ๋ณธ๋‹ค. 4๋‹จ๊ณ„๊นŒ์ง€ ๋ชป ๊ฐ€๋„ PR ๋ณธ๋ฌธ์— "์–ด๋””๊นŒ์ง€ ๋งŒ๋“ค๊ณ  ๋ฌด์—‡์ด ๋‚จ์•˜๋Š”์ง€" ์ ์œผ๋ฉด ๋จ.
- ๊นŠ์ดยท๋ถ„๋Ÿ‰ยท์–‘์‹ยทํŽ˜์ด์Šค๋Š” ์ž์œจ. ์šด์˜ ๊ธฐ๋ณธ ํ‹€์€ ๋‘˜๋ฟ: **โ‘  ์ฒซ PR 1ํšŒ(๋ชฉ 18:00)** **โ‘ก ์ž๊ธฐ์ ๊ฒ€+์‚ฌํ›„์„ค๋ฌธ(๋‹ค์Œ ์ฃผ ์›” 18:00)**.

### PR์€ 1ํšŒ๋งŒ

5๋‹จ๊ณ„๋กœ ๋‚˜๋‰˜์ง€๋งŒ PR์€ ์ข…๋ฃŒ ์‹œ 1ํšŒ. ๋‹จ๊ณ„๋ณ„๋กœ ์ปค๋ฐ‹ยทํ‘ธ์‹œ(`[1๋‹จ๊ณ„]โ€ฆ` prefix)ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— ํ†ตํ•ฉ PR. PR ๋ณธ๋ฌธ = 0~4๋‹จ๊ณ„ ๋„๋‹ฌ ์ง€์ ์˜ **๊ฒฐ์ •ยทSQLยทํ•œ๊ณ„ ํ†ตํ•ฉ ์ •๋ฆฌ**. ๋ง‰ํž˜์€ ์งง์€ ์‚ฌ์ดํด
์ฑ„๋„(๊ธฐ๋กยท๋™๋ฃŒ)์— ํ˜๋ ค๋ณด๋‚ธ๋‹ค.

### ์‚ฐ์ถœ๋ฌผ

| ๋‹จ๊ณ„ | ์‹œ์  | ํ•ญ๋ชฉ |
|---------|---------|-------------------------------------|
| ์‚ฌ์ „ ์„ค๋ฌธ | ์‹œ์ž‘ ์ „ | ๋„๋‹ฌ ์ƒํƒœยทJPA ๊ฒฝํ—˜ยท๋ชฉํ‘œยท๋งˆ์นœ ํ›„ ๋ชจ์Šต (โ†“ ๋‚ด ๋‹ต๋ณ€) |
| ๋‹จ๊ณ„๋ณ„ ์‘๋‹ต | ๋‹จ๊ณ„๋งˆ๋‹ค | 0~4๋‹จ๊ณ„ ์ž๊ธฐ์ง„๋‹จยทํ™•์ธ ๊ณผ์ œ ํผ ์ด 16๊ฐœ (๋„๋‹ฌํ•œ ๋‹จ๊ณ„๊นŒ์ง€) |
| ์ฒซ PR 1ํšŒ | ๋ชฉ 18:00 | ํ†ตํ•ฉ PR (๋ฐœํ–‰ SQLยท๋ง์„ค์ธ ๊ฒฐ์ •ยทํ”๋“ค๋ฆฐ ์žฅ๋ฉด์ด ํ† ๋ก  ์žฌ๋ฃŒ) |
| ์ž๊ธฐ์ ๊ฒ€ | ์›” 18:00 | 4์˜์—ญ(๋งคํ•‘/์„ค๊ณ„ ํŒ๋‹จ/ํ”ผ๋“œ๋ฐฑ ์ˆœํ™˜/์ข…ํ•ฉ) โ€” ํšŒ๊ณ ์šฉ |
| ์‚ฌํ›„ ์„ค๋ฌธ | ์ž๊ธฐ์ ๊ฒ€ ์งํ›„ | ์‚ฌ์ „์„ค๋ฌธ๊ณผ ๋น„๊ตํ•˜๋ฉฐ ์ž‘์„ฑ |
| AI ์ธํ„ฐ๋ทฐ | ์ข…๋ฃŒ ํ›„ | ๋ณ„๋„ ์•ˆ๋‚ด |

> **API ๋ช…์„ธ๋Š” ๊ณ ์ •.** ๋ช…์„ธ๋ฅผ ๋ฐ”๊พธ๋ฉด JDBCโ†”JPA SQL ๋น„๊ต๊ฐ€ ํ๋ ค์ง„๋‹ค.

---

## ์ฝ”์น˜๊ฐ€ ๋ณด๋Š” 3์ฐจ์› (์ด docs์˜ ์„ค๊ณ„ ์ถ•)

| ์ฐจ์› | ๋ฌด์—‡์„ ๋ณด๋‚˜ | ์ด docs์˜ ์–ด๋””์„œ ํšŒ์ˆ˜๋˜๋‚˜ |
|----------------|-----------------------------|-----------------------------|
| **A โ€” ๋งคํ•‘ ์ •ํ™•์„ฑ** | ์–ด๋…ธํ…Œ์ด์…˜ โ†’ ๋ฐœํ–‰ SQL์„ ์ถ”์ ํ–ˆ๋Š”๊ฐ€ | ๊ฐ ๋‹จ๊ณ„ `SQL ๊ด€์ฐฐ ๋กœ๊ทธ` (์˜ˆ์ธก vs ์‹ค์ œ) |
| **B โ€” ์„ค๊ณ„ ํŒ๋‹จ** | ๋Œ€์•ˆ ๋น„๊ตยท๊ทผ๊ฑฐยทํ•œ๊ณ„๋ฅผ ๋งํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€ | ๊ฐ ๋‹จ๊ณ„ `๊ฒฐ์ • ๊ธฐ๋ก` + `06 ์„ค๊ณ„ ํ† ๋ก ` |
| **C โ€” ํ”ผ๋“œ๋ฐฑ ์ˆœํ™˜** | SQL ๋กœ๊ทธยท์˜ˆ์™ธยทํ…Œ์ŠคํŠธยท๋ฆฌ๋ทฐยทํ† ๋ก ์„ ์‚ด๋ ค ์ผ๋Š”๊ฐ€ | ๊ฐ ๋‹จ๊ณ„ `ํ”ผ๋“œ๋ฐฑ ์ฑ„๋„ ์‹ ํ˜ธ` |

> ๐Ÿ–Š๏ธ ๊ฐ ๋‹จ๊ณ„ ๋ฌธ์„œ์˜ ๊ฒฐ์ •ยท์ธ์‚ฌ์ดํŠธ ๋์— `(A)`/`(B)`/`(C)` ํƒœ๊ทธ๋ฅผ ๋‹ฌ์•„๋‘๋ฉด, 06(ํ† ๋ก  ๊ฒฐ์ • 3๊ฐœ)ยท07(์ž๊ธฐ์ ๊ฒ€ 4์˜์—ญ)ยท๋‹จ์ผ PR ๋ณธ๋ฌธ์ด ์ž๋™์œผ๋กœ ์กฐ๋ฆฝ๋œ๋‹ค. (์ธ์ฆ์ธ๊ฐ€ ๋ฏธ์…˜์—์„œ 06์ด step
> ๋ฌธ์„œ๋ฅผ ๋‹น๊ฒจ์™”๋˜ ๊ทธ ํ๋ฆ„)

---

## ๋‚ด ์ถœ๋ฐœ์ 

### ์‚ฌ์ „์„ค๋ฌธ (์‹œ์ž‘ ์ „ ๊ธฐ๋ก โ€” ์‚ฌํ›„์„ค๋ฌธ๊ณผ ๋น„๊ต์šฉ)

**Q. JPA ๊ฒฝํ—˜์€?**
ํ† ์ด ํ”„๋กœ์ ํŠธ์—์„œ 2๋…„ ์ด์ƒ.

**Q. ๋ฏธ์…˜ ๋ชฉํ‘œ(์–ป๊ณ  ์‹ถ์€ ๊ฒƒ)?**
์šฐํ…Œ์ฝ” ์˜ค๊ธฐ ์ „์—๋Š” JPA์˜ ์ถ”์ƒํ™”๋ฅผ ์ „ํ˜€ ์˜์‹ํ•˜์ง€ ์•Š๊ณ  "ํŽธํ•œ ์Šคํƒ"์œผ๋กœ๋งŒ ์ผ๋‹ค. N+1๋„ "ํ•ด๊ฒฐ๋ฒ•์„ ์™ธ์šด" ์ˆ˜์ค€์ด์—ˆ์ง€, ๋‚ด ์ฝ”๋“œ ์–ด๋А ์ง€์ ์—์„œ ์™œ ํ„ฐ์ง€๋Š”์ง€๋Š” ๋ณด์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์“ฐ๋Š” ๊ฑด โ€” ๋‚ด ์–ด๋…ธํ…Œ์ด์…˜ ํ•œ
์ค„์ด ์–ด๋–ค SQL์„ ๋˜์ง€๋Š”์ง€์กฐ์ฐจ ๋ชจ๋ฅธ ์ฑ„ '์ž˜ ๋Œ์•„๊ฐ€๋‹ˆ ๊ดœ์ฐฎ๋‹ค'๊ณ  ๋ฏฟ๋Š” ์œ„ํ—˜ํ•œ ์ƒํƒœ๋‹ค. ์ด๋ฒˆ ๋ฏธ์…˜์—์„œ ์–ป๊ณ  ์‹ถ์€ ๊ฑด ๊ทธ ์ž๋™ํ™”์˜ ๋น„์šฉ์„ ์ง์ ‘ ๋งŒ์ ธ๋ณด๊ณ , **๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋งคํ•‘ยท์—ฐ๊ด€๊ด€๊ณ„ ๊ฒฐ์ •์ด ์‹ค์ œ ์–ด๋–ค SQLยท๋™์ž‘์„
๋งŒ๋“œ๋Š”์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ํž˜**, ๊ทธ๋ฆฌ๊ณ  ๊ทธ SQL์„ ๊ทผ๊ฑฐ๋กœ ์—ฐ๊ด€๊ด€๊ณ„ยทํŽ˜์น˜ ์ „๋žต ๊ฒฐ์ •์˜ **ํ•œ๊ณ„๊นŒ์ง€ ๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ** ๋˜๋Š” ๊ฒƒ.

**Q. ๋งˆ์นœ ํ›„ ๋ฐ”๋ผ๋Š” ๋ชจ์Šต?**
์–ด๋…ธํ…Œ์ด์…˜ยท์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์„ ๋ณผ ๋•Œ "JPA๊ฐ€ ์•Œ์•„์„œ ํ•ด์ค€๋‹ค"๋กœ ๋„˜๊ธฐ์ง€ ์•Š๊ณ  **๋ฐœํ–‰ํ•  SQL์˜ ๋ชจ์–‘์ด ๋จผ์ € ๋– ์˜ค๋ฅด๋Š”** ์ƒํƒœ. N+1์„ "ํ•ด๊ฒฐ๋ฒ•์„ ์•„๋Š” ๋ฌธ์ œ"๊ฐ€ ์•„๋‹ˆ๋ผ "๋‚ด ์ฝ”๋“œ ์–ด๋А ์ค„์—์„œ ํ„ฐ์ง€๋Š”์ง€ ๋ณด์ด๋Š” ๋ฌธ์ œ"๋กœ
๋ณด๊ณ , LAZYยท์ถ”๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ ์ƒ๊ธฐ๋Š” ์ง€์ ์„ ์ง์ ‘ ์ถ”์ . ๋‹จ/์–‘๋ฐฉํ–ฅยทEAGER vs LAZYยทfetch join vs `@EntityGraph`ยทํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„๋ฅผ ๊ด€ํ–‰์ด ์•„๋‹ˆ๋ผ **๊ฐ ์„ ํƒ์ด ๋งŒ๋“ค SQL๊ณผ ํ•œ๊ณ„ ๊ทผ๊ฑฐ๋กœ
** ์„ค๋ช….

### ์ฝ”๋“œ ์ƒํƒœ (step2)

- ํ—ฅ์‚ฌ๊ณ ๋‚  (`adapter/persistence` โ†” `domain/repository` ํฌํŠธ โ†” `application` โ†” `adapter/web`)
- **member ํ…Œ์ด๋ธ” ์—†์Œ** โ€” ์˜ˆ์•ฝ์ž๋Š” `name VARCHAR` ์ปฌ๋Ÿผ (๋ณ„๋„ ๊ฐ์ฒด ์•„๋‹˜)
- reservation / waiting **๋ถ„๋ฆฌ ๋ชจ๋ธ**, `UNIQUE(date, time_id, theme_id, name)`
- ์กฐํšŒ ํ•ต์‹ฌ ๊ฒฝ๋กœ๋Š” **3์ค‘ ์กฐ์ธ SQL ์ง์ ‘ ๋ฐ•์Œ** (reservation INNER JOIN reservation_time INNER JOIN theme)
- `waiting.order_index` = FIFO ์ˆœ๋ฒˆ์„ ์ €์žฅํ•ด ๋‘” materialized ํŒŒ์ƒ๊ฐ’

---

## 0๋‹จ๊ณ„ โ€” ๋ณ€๊ฒฝ/์œ ์ง€ ๊ฒฝ๊ณ„

**๋ฐ”๊ฟ€ ๊ฒƒ**: `build.gradle`(jdbcโ†’data-jpa) ยท `adapter/persistence`์˜ Jdbc ๊ตฌํ˜„ 4๊ฐœ(RowMapperยทKeyHolderยท์ˆ˜๊ธฐ SQL ์ œ๊ฑฐ) ยท `domain` ๊ฐ์ฒด
๋งคํ•‘(`@Entity`/`@Id`/`@GeneratedValue`/`@ManyToOne`, protected ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์ถ”๊ฐ€) ยท UPDATE ๋ฉ”์„œ๋“œ(dirty checking ๊ฒ€ํ† ) ยท
`application.properties`/DDL ์„ค์ •.

**์œ ์ง€ํ•  ๊ฒƒ**: `adapter/web` ์ปจํŠธ๋กค๋ŸฌยทDTO(API ๋ช…์„ธ ๊ณ ์ •) ยท `application` ์„œ๋น„์Šคยท`@Transactional` ๊ฒฝ๊ณ„ ยท `exception` ๊ณ„์ธตยท๋„๋ฉ”์ธ ๊ทœ์น™/์ •์ฑ… ยท ๋ถ„๋ฆฌ
๋ชจ๋ธ + UNIQUE ์ œ์•ฝ ยท `data.sql`.

**๊ฒฝ๊ณ„์˜ ํ•ต์‹ฌ ๊ฒฐ์ • (ํ™•์ • ๋Œ€๊ธฐ)**: ๋„๋ฉ”์ธ ๊ฐ์ฒด์— ์ง์ ‘ `@Entity` vs ์ˆœ์ˆ˜ ๋„๋ฉ”์ธ + ๋ณ„๋„ JPA ์—”ํ‹ฐํ‹ฐ ๋ถ„๋ฆฌ. โ†’ ์ด๋ฒˆ ๋ฏธ์…˜์€ **์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๊ด€์ฐฐ(1-3)์„ ์‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด ์ง์ ‘ ๋งคํ•‘** ์ชฝ์œผ๋กœ
์ž ์ •. ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ถ„๋ฆฌํ•ด ๊ฒฝ๊ณ„์—์„œ ๋ณ€ํ™˜ํ•˜๋ฉด entity๊ฐ€ ์ฆ‰์‹œ detach๋˜์–ด dirty checkingยทLAZY๊ฐ€ ๊ฐ€๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ. (ํ—ฅ์‚ฌ๊ณ ๋‚  ์ˆœ์ˆ˜์„ฑ ์ผ๋ถ€ ์–‘๋ณด = ์˜๋„๋œ ๋ฒ”์œ„ ํ•œ์ •, PR์— ๋ช…์‹œ)

> ๐Ÿ–Š๏ธ ์ด ๊ฒฐ์ •์€ 1๋‹จ๊ณ„ ์ง„์ž… ์‹œ ์ตœ์ข… ํ™•์ •. ํ™•์ • ํ›„ ์ด ๋ฌธ๋‹จ ๊ฐฑ์‹ .

---

## ๋Œ€ํ™” ๋กœ๋“œ๋งต (๋Œ€ํ™” ๋‹จ์œ„ โ†” ์‚ฐ์ถœ๋ฌผ)

| ๋Œ€ํ™” | ์‚ฐ์ถœ๋ฌผ |
|----------|------------------------------|
| ํ•™์Šต ๋ฐฉํ–ฅยท๊ฐœ๋… | `00-overview`, `01-concepts` |
| 1๋‹จ๊ณ„ | `02-step1-jpa-mapping` |
| 2๋‹จ๊ณ„ | `03-step2-my-reservations` |
| 3๋‹จ๊ณ„ | `04-step3-waiting` |
| 4๋‹จ๊ณ„ | `05-step4-waiting-admin` |
| ํ† ๋ก  ์ค€๋น„ | `06-design-discussion` |
| ์ž๊ธฐ์ ๊ฒ€ยทPR | `07-self-check` |

> ๋‹จ๊ณ„ ์ง„์ž… ์‹œ: ํ•ด๋‹น step ๋ฌธ์„œ๋ฅผ ๋จผ์ € ์—ด์–ด **"์ „ํ™˜ ์ „(JDBC)" ํ™•์ • โ†’ ๊ตฌํ˜„ โ†’ "์ „ํ™˜ ํ›„ยทSQL ๊ด€์ฐฐ" ์ฑ„์›€** ์ˆœ์œผ๋กœ ์ง„ํ–‰. ๋Œ€ํ™”๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ docs๋ฅผ ์ฝ๊ณ  ์‹œ์ž‘ํ•˜๋ฉด ํ๋ฆ„์ด ์•ˆ ๋Š๊ธด๋‹ค.

## docs ๊ตฌ์กฐ

```
docs/
โ”œโ”€โ”€ 00-overview.md # (์ด ๋ฌธ์„œ) ๊ฐœ์š”ยทํ•™์Šต ๋ฐฉํ–ฅยท์ฐจ์› ๋งคํ•‘ยท๋กœ๋“œ๋งตยท0๋‹จ๊ณ„ ๊ฒฝ๊ณ„
โ”œโ”€โ”€ 01-concepts.md # ์‚ฌ์ „ํ•™์Šต: ์˜์ƒยท4์งˆ๋ฌธ ๊ฐ€์„คยทํ‚ค์›Œ๋“œ ์ •์˜ยท์ฝ”๋“œ ๋‹ค์‹œ ์ฝ๊ธฐยท์ฐธ์กฐ ๋งค๋‰ด์–ผ
โ”œโ”€โ”€ 02-step1-jpa-mapping.md # 1๋‹จ๊ณ„: 1-1 ๋งคํ•‘ / 1-2 ์—ฐ๊ด€๊ด€๊ณ„ / 1-3 ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๊ด€์ฐฐ
โ”œโ”€โ”€ 03-step2-my-reservations.md # 2๋‹จ๊ณ„: ๋‚ด ์˜ˆ์•ฝ ๋ชฉ๋ก (๋ฉ”์„œ๋“œ ์ฟผ๋ฆฌ vs JPQL)
โ”œโ”€โ”€ 04-step3-waiting.md # 3๋‹จ๊ณ„: 3-1 N+1ยทfetch join / 3-2 JPQL rank
โ”œโ”€โ”€ 05-step4-waiting-admin.md # 4๋‹จ๊ณ„: ์–ด๋“œ๋ฏผยท์ž๋™ ์Šน์ธยทํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„ยทflush ์ˆœ์„œ
โ”œโ”€โ”€ 06-design-discussion.md # JPA ์„ค๊ณ„ ํ† ๋ก  ์ค€๋น„ (๊ฒฐ์ • 3๊ฐœ + ํ•œ๊ณ„)
โ””โ”€โ”€ 07-self-check.md # ์ž๊ธฐ์ ๊ฒ€ 4์˜์—ญ + ๋‹จ์ผ PR ๋ณธ๋ฌธ ์ข…ํ•ฉ
```

(๋ณ„๋„ `decisions/` ADR ํด๋” ์—†์Œ โ€” ๊ฒฐ์ • ๊ธฐ๋ก์€ ๊ฐ step ๋ฌธ์„œ์— ์ธ๋ผ์ธ. ์ธ์ฆ์ธ๊ฐ€ ๋•Œ ๋ถ„๋ฆฌ ํด๋”๊ฐ€ ๋น„์–ด๋ฒ„๋ฆฐ ๊ตํ›ˆ.)

## ์ง„ํ–‰ ์›์น™

- **๋„๋‹ฌํ•œ ๋งŒํผ์„ ๋ณธ๋‹ค** โ€” ๋ฏธ์™„์€ ๋ถ€๋„๋Ÿฌ์›Œํ•˜์ง€ ๋ง๊ณ  ์ •ํ™•ํžˆ ์ ๋Š”๋‹ค(๋ฏธ์™„ ์ •ํ™• ๊ธฐ๋ก = ํ•ต์‹ฌ ์‹ ํ˜ธ).
- **๋‹จ์ผ PR** โ€” ๋‹จ๊ณ„๋ณ„ ์ปค๋ฐ‹ยทํ‘ธ์‹œ, ๋งˆ์ง€๋ง‰์— ํ†ตํ•ฉ PR 1ํšŒ.
- **API ๋ช…์„ธ ๊ณ ์ •** โ€” ๋ช…์„ธ๋ฅผ ๋ฐ”๊พธ๋ฉด JDBCโ†”JPA SQL ๋น„๊ต๊ฐ€ ํ๋ ค์ง„๋‹ค.
- **๋ฌธ์„œ๋Ÿ‰ ์ž๋ž‘ ๊ฒฝ๊ณ„** โ€” SQL ๊ด€์ฐฐ ๋กœ๊ทธ๋Š” ๋‘๊ป๊ฒŒ, ์‚ฐ๋ฌธ์€ ์งง๊ฒŒ.
Loading