Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
34a775b
docs: ์—์•ฝ ์ทจ์†Œ ์‹œ ๋Œ€๊ธฐ๊ฐ€ ์˜ˆ์•ฝ์œผ๋กœ ์Šน๊ฒฉ๋˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ ๋ฌธ์„œ ์ž‘์„ฑ
2Jaeheon Jun 3, 2026
82ccae6
feat: ์˜ˆ์•ฝ ์ทจ์†Œ ์‹œ ์˜ˆ์•ฝ ๋Œ€๊ธฐ๋กœ ์ด๋™ํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€
2Jaeheon Jun 3, 2026
14b40f0
test: ๋Œ€๊ธฐ ์Šน๊ฒฉ ์ค‘ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ •์ƒ์ ์œผ๋กœ ๋กค๋ฐฑ๋˜๋Š”์ง€ ๊ฒ€์ฆ
2Jaeheon Jun 3, 2026
336ab76
chore: ์ฝ”๋“œ ํฌ๋งคํŒ… ์ˆ˜์ • ๋ฐ ๊ฐ„๊ฒฉ ์กฐ์ •
2Jaeheon Jun 3, 2026
5b1e9ef
fix: ์˜ˆ์•ฝ ๋Œ€๊ธฐ์ƒ์„ฑ ์‹œ ๋Œ€๊ธฐ์ˆœ๋ฒˆ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ์กฐํšŒ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •
2Jaeheon Jun 3, 2026
71017b4
fix: ์˜ˆ์•ฝ์ƒ์„ฑ์—์„œ ๋Œ€๊ธฐ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋กœ์ง ์“ฐ๊ธฐ ํŠธ๋ Œ์žญ์…˜ ์ œ๊ฑฐ
2Jaeheon Jun 3, 2026
5d04fa8
test: ์˜ˆ์•ฝ ๋Œ€๊ธฐ ์Šน๊ฒฉ API ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
2Jaeheon Jun 3, 2026
1177005
docs: ์š”๊ตฌ์‚ฌํ•ญ ์ •๋ฆฌ ๋ฐ ์ž‘์„ฑ
2Jaeheon Jun 3, 2026
8266e30
chore: ์ฟผ๋ฆฌ๋ฌธ ๋‚ด ? ๋Œ€์ฒดํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
2Jaeheon Jun 6, 2026
a0a212b
docs: ์˜ˆ์•ฝ ์ƒ์„ฑ ์‹œ ์˜ˆ์•ฝ ์ˆœ๋ฒˆ ๊ณ„์‚ฐ ์•ˆ ํ•จ์„ API ๋ฌธ์„œ์— ์ถ”๊ฐ€
2Jaeheon Jun 6, 2026
b04c7ed
refactor: ์˜ˆ์•ฝ ๋Œ€๊ธฐ์˜ ์ˆœ๋ฒˆ ๊ณ„์‚ฐ์˜ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ
2Jaeheon Jun 6, 2026
57dcbeb
fix: admin ์ฐฝ์— ์˜ˆ์•ฝ๊ณผ ๋Œ€๊ธฐ ๋ชจ๋‘ ๋ณด์ด๊ฒŒ ์ˆ˜์ •
2Jaeheon Jun 6, 2026
40a8fff
refactor: decorator ํŒจํ„ด ๋Œ€์‹  MockSpy ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ์ง„ํ–‰ํ•˜๋„๋ก ์ˆ˜์ •
2Jaeheon Jun 6, 2026
4edb8b3
refactor: ์˜ˆ์•ฝ ๋Œ€๊ธฐ ์ƒ์„ฑ ์‹œ ์ˆœ๋ฒˆ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •
2Jaeheon Jun 7, 2026
224bdda
refactor: ์˜ˆ์•ฝ ์Šฌ๋กฏ ๊ฐœ๋…์„ Reservation ๋„๋ฉ”์ธ์— ๋„์ž…
2Jaeheon Jun 7, 2026
66800c2
refactor: ์˜ˆ์•ฝ ์Šฌ๋กฏ ๊ฐœ๋…์„ Waitlist ๋„๋ฉ”์ธ์— ๋„์ž…
2Jaeheon Jun 7, 2026
5c0eccf
refactor: ์˜ˆ์•ฝ๊ณผ ๋Œ€๊ธฐ๋ฅผ slot ์ฐธ์กฐ๋กœ ๊ตฌ์กฐ ๋ณ€๊ฒฝ
2Jaeheon Jun 7, 2026
dc3f598
refactor: ๋Œ€๊ธฐ ์ˆœ๋ฒˆ๊ณผ ๋Œ€๊ธฐ ์Šน๊ฒฉ ์กฐํšŒ ๋กœ์ง์„ slot ๊ธฐ์ค€์œผ๋กœ ์กฐํšŒํ•˜๋„๋ก ์ˆ˜์ •
2Jaeheon Jun 7, 2026
c2180b4
feat: ์˜ˆ์•ฝ ์Šฌ๋กฏ์— ๋Œ€๊ธฐ ์‹ ์ฒญ ์‹œ ์‘๋‹ต ์ˆœ๋ฒˆ ์ค‘๋ณต ๊ฒ€์ฆ ํ…Œ์ŠคํŠธ
2Jaeheon Jun 7, 2026
3780a63
refactor: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ƒ์„ฑ์ž ์ œ๊ฑฐ ๋ฐ slot์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์ฐพ์•„ ์ˆ˜์ •
2Jaeheon Jun 7, 2026
9a15f96
fix: ํ”„๋ก ํŠธ์—์„œ ๋Œ€๊ธฐ ์ƒ์„ฑ ์‹œ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ ๋ณด์ด๊ฒŒ ์ˆ˜์ •
2Jaeheon Jun 7, 2026
9885ae2
refactor: ์˜ˆ์•ฝ ์‚ญ์ œ ๋ฐ ์Šน๊ฒฉ ๋กœ์ง์—์„œ ์‚ญ์ œ๋ฅผ ๋Œ€๊ธฐ ์กฐํšŒ๋ณด๋‹ค ์šฐ์„ ์‹œํ•˜๊ฒŒ ์ˆ˜์ •
2Jaeheon Jun 7, 2026
0244269
refactor: ์กฐํšŒ ์„ฑ๋Šฅ ๊ฐœ์„ 
2Jaeheon Jun 8, 2026
3ee4265
feat: ํ…Œ๋งˆ์™€ ์˜ˆ์•ฝ์‹œ๊ฐ„์„ JPA ์—”ํ‹ฐํ‹ฐ๋กœ ๋งคํ•‘
2Jaeheon Jun 17, 2026
4efba5f
feat: ์˜ˆ์•ฝ๊ณผ ์Šฌ๋กฏ ์ €์žฅ์†Œ๋ฅผ JPA๋กœ ์ „ํ™˜
2Jaeheon Jun 17, 2026
c44e3bb
feat: ์˜ˆ์•ฝ ์กฐํšŒ ์‹œ ์—ฐ๊ด€ ๋ฐ์ดํ„ฐ๋ฅผ fetch join์œผ๋กœ ํ•จ๊ป˜ ์กฐํšŒ
2Jaeheon Jun 18, 2026
ec7f5d0
feat: ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๊ด€์ฐฐ
2Jaeheon Jun 18, 2026
740495e
feat: ๋‚ด ์˜ˆ์•ฝ ๋ชฉ๋ก ์กฐํšŒ ๊ธฐ๋Šฅ
2Jaeheon Jun 20, 2026
943731a
test: n+1 ๋ฌธ์ œ ํ…Œ์ŠคํŠธ
2Jaeheon Jun 20, 2026
ffbc214
feat: ์˜ˆ์•ฝ ๋Œ€๊ธฐ jpa ๋กœ์ง ์ „ํ™˜
2Jaeheon Jun 22, 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
31 changes: 24 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,19 +94,36 @@

- [x] ์ด๋ฏธ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์˜ˆ์•ฝ๋œ ์Šฌ๋กฏ(๋‚ ์งœ+์‹œ๊ฐ„+ํ…Œ๋งˆ)์— ๋Œ€๊ธฐ๋ฅผ ์‹ ์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค.
- [x] ์˜ˆ์•ฝ ๋Œ€๊ธฐ ํ…Œ์ด๋ธ” ์ถ”๊ฐ€
- [x] ์˜ˆ์•ฝ์ด ์กด์žฌํ•˜๋Š” ์˜ˆ์•ฝ์„ ๋“ฑ๋กํ•  ๋•Œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž(์ด๋ฆ„)์ด๋ฉด ๋Œ€๊ฐ€ ์ˆœ๋ฒˆ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ณ , ์•„๋‹ˆ๋ฉด(๋™์ผํ•œ ์‚ฌ์šฉ์ž) ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.
- [x] ์˜ˆ์•ฝ์ด ์กด์žฌํ•˜๋Š” ์Šฌ๋กฏ์„ ๋“ฑ๋กํ•  ๋•Œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž(์ด๋ฆ„)์ด๋ฉด ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ณ , ์•„๋‹ˆ๋ฉด(๋™์ผํ•œ ์‚ฌ์šฉ์ž) ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.
- [x] ๊ฐ™์€ ์Šฌ๋กฏ์— ๋Œ€ํ•œ ๋Œ€๊ธฐ๋Š” ์‹ ์ฒญ ์ˆœ์„œ๋Œ€๋กœ ์ˆœ๋ฒˆ์ด ๋ถ€์—ฌ๋œ๋‹ค.
- [x] ๊ฐ™์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ™์€ ์Šฌ๋กฏ์— ์ค‘๋ณต ๋Œ€๊ธฐํ•  ์ˆ˜ ์—†๋‹ค.
- [x] ์‚ฌ์šฉ์ž๋Š” ๋ณธ์ธ์˜ ๋Œ€๊ธฐ๋ฅผ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋‹ค.

<!--
- [ ] ์˜ˆ์•ฝ์ด ์ทจ์†Œ๋  ๋•Œ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์˜ 1๋ฒˆ์ด ์˜ˆ์•ฝ์œผ๋กœ ๋ฐ”๋€๋‹ค. (์‚ฌ์ดํด2)
- ์˜ˆ์•ฝ ์ทจ์†Œ -> ์˜ˆ์•ฝ ๋Œ€๊ธฐ ์Šฌ๋กฏ ํ™•์ธ -> ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์˜ 1๋ฒˆ์„ ์˜ˆ์•ฝ ์ถ”๊ฐ€ -> ๋Œ€๊ธฐ ์ˆœ๋ฒˆ 1๋ฒˆ ์‚ญ์ œ (์‚ฌ์ดํด2)
- [x] ์˜ˆ์•ฝ์ด ์ทจ์†Œ๋  ๋•Œ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์˜ 1๋ฒˆ์ด ์˜ˆ์•ฝ์œผ๋กœ ๋ฐ”๋€๋‹ค.
1. ์ทจ์†Œํ•  ์˜ˆ์•ฝ์„ ์กฐํšŒํ•œ๋‹ค.
2. ์ทจ์†Œํ•  ์˜ˆ์•ฝ๊ณผ ๊ฐ™์€ ์Šฌ๋กฏ์˜ ๋Œ€๊ธฐ 1๋ฒˆ์„ ์กฐํšŒํ•œ๋‹ค.
3. ๊ธฐ์กด ์˜ˆ์•ฝ์„ ์‚ญ์ œํ•œ๋‹ค.
4. ๋Œ€๊ธฐ 1๋ฒˆ์ด ์žˆ์œผ๋ฉด ์˜ˆ์•ฝ์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
5. ์Šน๊ฒฉ๋œ ๋Œ€๊ธฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

- [ ] ์˜ˆ์•ฝ์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์˜ˆ์•ฝ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์•ฝ๋œ ์Šฌ๋กฏ์— ๋Œ€๊ธฐ๋ฅผ ์‹ ์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค. (์‚ฌ์ดํด2)
- [ ] ๋ณ€๊ฒฝ๋œ ์˜ˆ์•ฝ์˜ ๊ฐ€์žฅ ๋น ๋ฅธ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์ด ์˜ˆ์•ฝ๋œ๋‹ค. (์‚ฌ์ดํด2)
-->
### ์˜ˆ์•ฝ ๋Œ€๊ธฐ ์Šน์ธ ์ •์ฑ…

- [x] ์ž๋™ ์ „ํ™˜ ๋ฐฉ์‹์„ ์„ ํƒํ•œ๋‹ค.
- ์˜ˆ์•ฝ ์ทจ์†Œ ์‹œ ๊ฐ™์€ ์Šฌ๋กฏ์˜ ๋Œ€๊ธฐ 1๋ฒˆ์„ ์ฆ‰์‹œ ์˜ˆ์•ฝ์œผ๋กœ ์Šน๊ฒฉํ•œ๋‹ค.
- ๋ณ„๋„ ๊ด€๋ฆฌ์ž ์Šน์ธ ํ™”๋ฉด ์—†์ด ์‚ฌ์šฉ์ž์˜ ์ทจ์†Œ ํ๋ฆ„ ์•ˆ์—์„œ ๋นˆ ์Šฌ๋กฏ์„ ๋ฐ”๋กœ ์ฑ„์›Œ ์‚ฌ์šฉ์ž ๋Œ€๊ธฐ ๊ฒฝํ—˜์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.
- [x] ๋Œ€๊ธฐ ์Šน๊ฒฉ ํ›„ ๋‚จ์€ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์€ ์กฐํšŒ ์‹œ ์ƒ์„ฑ ์‹œ๊ฐ๊ณผ ID ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐํ•œ๋‹ค.
- [x] ๋Œ€๊ธฐ ์ทจ์†Œ ํ›„ ๋‚จ์€ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์€ ์กฐํšŒ ์‹œ ์ƒ์„ฑ ์‹œ๊ฐ๊ณผ ID ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐํ•œ๋‹ค.

### ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„

- [x] ์˜ˆ์•ฝ ์ทจ์†Œ, ๋Œ€๊ธฐ 1๋ฒˆ์˜ ์˜ˆ์•ฝ ์Šน๊ฒฉ, ์Šน๊ฒฉ๋œ ๋Œ€๊ธฐ ์‚ญ์ œ๋Š” ํ•˜๋‚˜์˜ ์ƒํƒœ ์ „์ด์ด๋ฏ€๋กœ ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ๋Š”๋‹ค.
- [x] ์Šน๊ฒฉ ์ค‘ ์ค‘๊ฐ„ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ธฐ์กด ์˜ˆ์•ฝ ์‚ญ์ œ์™€ ์Šน๊ฒฉ ์˜ˆ์•ฝ ์ƒ์„ฑ์ด ํ•จ๊ป˜ ๋กค๋ฐฑ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธ๋กœ ํ™•์ธํ•œ๋‹ค.
- [x] ์˜ˆ์•ฝ ์ƒ์„ฑ์—์„œ ์˜ˆ์•ฝ ์ €์žฅ ์‹คํŒจ ํ›„ ๋Œ€๊ธฐ ์ €์žฅ์œผ๋กœ ์ „ํ™˜๋˜๋Š” ํ๋ฆ„์€ ์˜ˆ์•ฝ ์ €์žฅ๊ณผ ๋Œ€๊ธฐ ์ €์žฅ์˜ ํŠธ๋žœ์žญ์…˜์„ ๋ถ„๋ฆฌํ•œ๋‹ค.

### API ํ™•์ธ ์‹œ๋‚˜๋ฆฌ์˜ค

- [x] `DELETE /reservations/{id}?name={name}` ์š”์ฒญ ํ›„ ๋Œ€๊ธฐ 1๋ฒˆ์ด `RESERVED`๋กœ ์กฐํšŒ๋˜๊ณ  ๋‚จ์€ ๋Œ€๊ธฐ์ž์˜ `waitingOrder`๊ฐ€ 1๋กœ ์žฌ์ •๋ ฌ๋œ๋‹ค.
- [x] `DELETE /waitlists/{id}?name={name}` ์š”์ฒญ ํ›„ ๋‚จ์€ ๋Œ€๊ธฐ์ž์˜ `waitingOrder`๊ฐ€ 1, 2๋กœ ์žฌ์ •๋ ฌ๋œ๋‹ค.
---

### ๋‚ด ์˜ˆ์•ฝ ๋ชฉ๋ก
Expand Down
4 changes: 3 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,17 @@ java {
}

repositories {
maven { url 'https://jitpack.io' }
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'com.github.Uechann:my-sql-logger:v1.0.1'
runtimeOnly 'com.h2database:h2'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
Expand Down
15 changes: 14 additions & 1 deletion docs/api๋ช…์„ธ.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,14 @@ Content-Type: application/json
}

### ์ƒ์„ฑ, ๋Œ€๊ธฐ ์‘๋‹ต
#### status, waitingOrder ํ•ด์„ ๊ทœ์น™
status๋Š” ์˜ˆ์•ฝ ์‹ ์ฒญ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

- RESERVED: ์˜ˆ์•ฝ์ด ํ™•์ •๋œ ์ƒํƒœ์ด๋ฉฐ, ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์ด ์—†์œผ๋ฏ€๋กœ waitingOrder๋Š” null์ด๋‹ค.
- WAITING: ์˜ˆ์•ฝ ๋Œ€๊ธฐ ์ƒํƒœ์ด๋‹ค.
- POST /reservations ์ƒ์„ฑ ์‘๋‹ต์—์„œ๋Š” WAITING ์ƒํƒœ์—ฌ๋„ waitingOrder๊ฐ€ null์ผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฐ’์€ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์ด ์—†๋‹ค๊ฐ€ ์•„๋‹ˆ๋ผ ์ƒ์„ฑ ์‘๋‹ต์—์„œ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.
- ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ GET /reservations?name={name} ์กฐํšŒ ์‘๋‹ต์—์„œ ํ™•์ธํ•œ๋‹ค.

HTTP/1.1 201 Created
Content-Type: application/json

Expand Down Expand Up @@ -157,12 +165,14 @@ Content-Type: application/json

```http request
### ์‚ญ์ œ ์š”์ฒญ
DELETE /waitlists/{id} HTTP/1.1
DELETE /waitlists/{id}?name=๋ธŒ๋ผ์šด HTTP/1.1

### ์‚ญ์ œ ์‘๋‹ต
HTTP/1.1 204 No Content
```

- ๋Œ€๊ธฐ ์ทจ์†Œ ํ›„ ๊ฐ™์€ ์Šฌ๋กฏ์— ๋‚จ์€ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์€ ์ƒ์„ฑ ์‹œ๊ฐ๊ณผ ID ๊ธฐ์ค€์œผ๋กœ ์žฌ๊ณ„์‚ฐ๋œ๋‹ค.

### ํ…Œ๋งˆ API

```http request
Expand Down Expand Up @@ -317,6 +327,9 @@ DELETE /reservations/{id}?name=๋ธŒ๋ผ์šด HTTP/1.1
HTTP/1.1 204 No Content
```

- ์˜ˆ์•ฝ ์ทจ์†Œ ์‹œ ๊ฐ™์€ ์Šฌ๋กฏ์˜ ๋Œ€๊ธฐ 1๋ฒˆ์ด ์ž๋™์œผ๋กœ ์˜ˆ์•ฝ ์Šน๊ฒฉ๋œ๋‹ค.
- ์Šน๊ฒฉ๋œ ๋Œ€๊ธฐ๋Š” ๋Œ€๊ธฐ ๋ชฉ๋ก์—์„œ ์ œ๊ฑฐ๋˜๊ณ , ๊ฐ™์€ ์Šฌ๋กฏ์— ๋‚จ์€ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ์€ ์ƒ์„ฑ ์‹œ๊ฐ๊ณผ ID ๊ธฐ์ค€์œผ๋กœ ์žฌ๊ณ„์‚ฐ๋œ๋‹ค.

### ์—๋Ÿฌ ์‘๋‹ต ๋ช…์„ธ

| ์ƒํ™ฉ | ์ƒํƒœ ์ฝ”๋“œ |
Expand Down
40 changes: 40 additions & 0 deletions docs/jpa/DIRTY_CHECKING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
## ๊ด€์ฐฐ: DirtyChecking

### ์‹œ๋„ํ•œ ์ฝ”๋“œ

Theme๊ฐ์ฒด๋ฅผ DB์— ์ €์žฅํ•œ ๋’ค, Theme์˜ changeName() ์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ
๊ฐ์ฒด ๋‚ด๋ถ€์˜ ์†์„ฑ์„ ๋ฐ”๊พธ๊ณ  flush()๋ฅผ ํ˜ธ์ถœํ•จ.

### ์˜ˆ์ธกํ•œ SQL/๋™์ž‘

Dirty Checking์„ ํ†ตํ•ด์„œ Hibernate๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์˜ฌ๋ผ์˜จ Theme์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ
๋ณด๊ณ ์žˆ๋‹ค๊ฐ€ update ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค์„œ ๋ณ€๊ฒฝ๋œ ๊ฐ์ฒด ๋‚ด๋ถ€ ์†์„ฑ์„ DB์— ํ•จ๊ป˜ ๋ฐ˜์˜ํ•จ.

```sql
UPDATE theme
SET description,
name,
thumbnail_image_url
WHERE id = ?
```

### ์‹ค์ œ SQL/๋™์ž‘

```sql
update theme
set description=?,
name=?,
thumbnail_image_url=?
where id = ?
```

### ์™œ ๊ทธ๋Ÿฐ๊ฐ€

Hibernate๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์˜ฌ๋ผ์˜จ ๊ฐ์ฒด๋ฅผ ๊ณ„์† ๋ณด๋‹ค๊ฐ€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ผ์–ด๋‚  ๋•Œ ์ด๋ฅผ DB์— ๋ฐ˜์—ฌํ•ด์คŒ

Theme ๊ฐ์ฒด๋Š” ์˜์†์„ฑ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— Hibernate๋Š” ์กฐํšŒ ์‹œ์ ์˜ ์Šค๋ƒ…์ƒท๊ณผ flush ์‹œ์ ์˜ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
name ๊ฐ’์ด ๋‹ฌ๋ผ์กŒ๊ธฐ ๋•Œ๋ฌธ์— dirty checking์— ์˜ํ•ด์„œ UPDATE SQL๋ฌธ์ด ์‹คํ–‰๋œ๋‹ค.

๋‹จ, name์„ ๋ฐ”๊ฟจ๋Š”๋ฐ, description, thumbnail_image_url๊นŒ์ง€ UPDATE ๋ฌธ์— ํฌํ•จ๋˜์—ˆ๋‹ค.
์ด๋Š” Hibernate๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋œ ์ปฌ๋Ÿผ๋งŒ์ด ์•„๋‹ˆ๋ผ ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐฑ์‹  ๊ฐ€๋Šฅํ•œ ์ปฌ๋Ÿผ๋“ค์„ ํ•จ๊ป˜
UPDATE ๋ฌธ์— ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ณ€๊ฒฝ ์ปฌ๋Ÿผ๋งŒ UPDATEํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ณ„๋„ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.
71 changes: 71 additions & 0 deletions docs/jpa/LazyInitializationException.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
## ๊ด€์ฐฐ: LazyInitializationException

### ์‹œ๋„ํ•œ ์ฝ”๋“œ

Slot์€ ReservationTime๊ณผ Theme์„ `@ManyToOne(fetch = FetchType.LAZY)`๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.

```java
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "time_id")
private ReservationTime time;
```

Slot์„ ์ €์žฅํ•œ ๋’ค EntityManager๋กœ Slot๋งŒ ์กฐํšŒํ•จ.
์ด๋•Œ ReservationTime์€ ์•„์ง ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Œ.

๊ทธ ๋’ค ํ…Œ์ŠคํŠธ ํŠธ๋žœ์žญ์…˜์„ ์ข…๋ฃŒํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜ ๋ฐ–์—์„œ `found.getTime().getStartAt()`์„ ํ˜ธ์ถœํ•จ.

```java
Slot found = entityManager.find(Slot.class, slot.getId());

TestTransaction.end();

found.getTime().getStartAt();
```

### ์˜ˆ์ธกํ•œ SQL/๋™์ž‘

Slot์„ ์กฐํšŒํ•  ๋•Œ๋Š” Slot ํ…Œ์ด๋ธ”๋งŒ ์กฐํšŒ๋  ๊ฒƒ์ด๋‹ค.
์™œ๋ƒํ•˜๋ฉด Slot์˜ time ํ•„๋“œ๋Š” LAZY์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ReservationTime์€ ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋ก์‹œ ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ์„ ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ•จ.

๊ทธ๋ฆฌ๊ณ  ํŠธ๋žœ์žญ์…˜์ด ๋๋‚œ ๋’ค์—๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹ซํžˆ๊ธฐ ๋•Œ๋ฌธ์—,
๊ทธ ์ƒํƒœ์—์„œ ํ”„๋ก์‹œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๊ณ  ํ•˜๋ฉด LazyInitializationException์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ•จ.

### ์‹ค์ œ SQL/๋™์ž‘

Slot์„ ์กฐํšŒํ•  ๋•Œ ์‹คํ–‰๋œ SQL

```sql
select s1_0.id,
s1_0.date,
s1_0.theme_id,
s1_0.time_id
from slot s1_0
where s1_0.id = ?
```

ReservationTime ํ…Œ์ด๋ธ”์€ join๋˜์ง€ ์•Š์•˜๋‹ค.
`Hibernate.isInitialized(found.getTime())` ๊ฐ’๋„ false์˜€๋‹ค.

๊ทธ ๋’ค ํŠธ๋žœ์žญ์…˜์„ ์ข…๋ฃŒํ•˜๊ณ  `found.getTime().getStartAt()`์„ ํ˜ธ์ถœํ•˜์ž
`LazyInitializationException`์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

### ์™œ ๊ทธ๋Ÿฐ๊ฐ€

LAZY๋Š” ์—ฐ๊ด€ ๊ฐ์ฒด๋ฅผ ์ง€๊ธˆ ๋ฐ”๋กœ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ , ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ€์ ธ์˜ค๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

Slot์„ ์กฐํšŒํ•  ๋•Œ ReservationTime๊นŒ์ง€ ๊ฐ™์ด ์กฐํšŒํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—,
Slot์˜ time ํ•„๋“œ์—๋Š” ์ง„์งœ ReservationTime ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋‚˜์ค‘์— ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ก์‹œ๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ๋Š” ์ด ํ”„๋ก์‹œ๋ฅผ ๊ฑด๋“œ๋ฆฌ๋Š” ์ˆœ๊ฐ„ Hibernate๊ฐ€ DB์— ์ถ”๊ฐ€ SELECT๋ฅผ ๋ณด๋‚ด์„œ ์‹ค์ œ ReservationTime์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
์™œ๋ƒํ•˜๋ฉด ์•„์ง ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์‚ด์•„์žˆ๊ณ , DB ์กฐํšŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” Session์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋„ ๋‹ซํžŒ๋‹ค.
์ดํ›„์—๋Š” ํ”„๋ก์‹œ๊ฐ€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Session์ด ์—†๋‹ค.

๊ทธ๋ž˜์„œ ํŠธ๋žœ์žญ์…˜ ๋ฐ–์—์„œ ์•„์ง ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ LAZY ํ•„๋“œ์— ์ ‘๊ทผํ•˜๋ฉด LazyInitializationException์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด LazyInitializationException์€ LAZY ์ž์ฒด๊ฐ€ ๋ฌธ์ œ๋ผ๊ธฐ๋ณด๋‹ค,
ํ”„๋ก์‹œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ์ˆœ๊ฐ„์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ด๋ฏธ ๋‹ซํ˜€ ์žˆ์–ด์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ์ด๋‹ค.
80 changes: 80 additions & 0 deletions docs/jpa/fetch๊ธฐ๋ณธ๊ฐ’.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
## ๊ด€์ฐฐ: fetch ๊ธฐ๋ณธ๊ฐ’

### ์‹œ๋„ํ•œ ์ฝ”๋“œ

ํ…Œ์ŠคํŠธ์šฉ Entity๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ fetch ์˜ต์…˜์„ ๋ช…์‹œํ•˜์ง€ ์•Š์Œ.

FetchDefaultReservation์€ FetchDefaultTheme์„ `@ManyToOne`์œผ๋กœ ์ฐธ์กฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ ,
FetchDefaultTheme์€ FetchDefaultReservation ๋ชฉ๋ก์„ `@OneToMany`๋กœ ๊ฐ€์ง€๊ฒŒ ๋งŒ๋“ฆ.

```java
@ManyToOne
private FetchDefaultTheme theme;
```

```java
@OneToMany(mappedBy = "theme")
private List<FetchDefaultReservation> reservations = new ArrayList<>();
```

๊ทธ ๋’ค ๊ฐ๊ฐ์„ ์กฐํšŒํ•˜๋ฉด์„œ ์—ฐ๊ด€ ๊ฐ์ฒด๊ฐ€ ๋ฐ”๋กœ ์ดˆ๊ธฐํ™”๋˜๋Š”์ง€ ํ™•์ธํ•จ.

### ์˜ˆ์ธกํ•œ SQL/๋™์ž‘

`@ManyToOne`์€ fetch ์˜ต์…˜์„ ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์ด EAGER์ผ ๊ฒƒ์ด๋‹ค.
๊ทธ๋ž˜์„œ FetchDefaultReservation์„ ์กฐํšŒํ•  ๋•Œ FetchDefaultTheme๋„ ๊ฐ™์ด ์กฐํšŒ๋  ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ•จ.

๋ฐ˜๋Œ€๋กœ `@OneToMany`๋Š” fetch ์˜ต์…˜์„ ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์ด LAZY์ผ ๊ฒƒ์ด๋‹ค.
๊ทธ๋ž˜์„œ FetchDefaultTheme์„ ์กฐํšŒํ•  ๋•Œ reservations ๋ชฉ๋ก์€ ๋ฐ”๋กœ ์กฐํšŒ๋˜์ง€ ์•Š๊ณ ,
์‹ค์ œ๋กœ ๋ชฉ๋ก์— ์ ‘๊ทผํ•˜๋Š” ์ˆœ๊ฐ„ SELECT SQL์ด ๋‚˜๊ฐˆ ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ•จ.

### ์‹ค์ œ SQL/๋™์ž‘

`@ManyToOne`์„ ์ƒ๋žตํ–ˆ์„ ๋•Œ

```sql
select fdr1_0.id,
fdr1_0.name,
t1_0.id,
t1_0.name
from fetch_default_reservation fdr1_0
left join fetch_default_theme t1_0
on t1_0.id = fdr1_0.theme_id
where fdr1_0.id = ?
```

FetchDefaultReservation์„ ์กฐํšŒํ•˜๋Š” ์ˆœ๊ฐ„ FetchDefaultTheme๋„ ํ•จ๊ป˜ ์กฐํšŒ๋˜์—ˆ๋‹ค.
`Hibernate.isInitialized(found.getTheme())` ๊ฐ’๋„ true์˜€๋‹ค.

`@OneToMany`๋ฅผ ์ƒ๋žตํ–ˆ์„ ๋•Œ

Theme์„ ์กฐํšŒํ•œ ์งํ›„์—๋Š” reservations ๋ชฉ๋ก์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜๋‹ค.
`Hibernate.isInitialized(found.getReservations())` ๊ฐ’์ด false์˜€๋‹ค.

๊ทธ ๋’ค `found.getReservations().size()`์ฒ˜๋Ÿผ ๋ชฉ๋ก์— ์ ‘๊ทผํ•˜์ž ๋‹ค์Œ SQL์ด ๋‚˜๊ฐ”๋‹ค.

```sql
select r1_0.theme_id,
r1_0.id,
r1_0.name
from fetch_default_reservation r1_0
where r1_0.theme_id = ?
```

### ์™œ ๊ทธ๋Ÿฐ๊ฐ€

JPA์—์„œ `@ManyToOne`์˜ ๊ธฐ๋ณธ fetch ์ „๋žต์€ EAGER์ด๋‹ค.
๊ทธ๋ž˜์„œ ๋‹ค๋Œ€์ผ ๊ด€๊ณ„์—์„œ๋Š” ์—ฐ๊ด€๋œ ๋‹จ์ผ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•œ๋‹ค.

์ด๋ฒˆ ํ…Œ์ŠคํŠธ์—์„œ๋Š” FetchDefaultReservation์„ ์กฐํšŒํ•  ๋•Œ FetchDefaultTheme๊นŒ์ง€ left join์œผ๋กœ ํ•จ๊ป˜ ์กฐํšŒ๋˜์—ˆ๋‹ค.
์ฆ‰, Reservation ์ž…์žฅ์—์„œ๋Š” Theme์ด ์ด๋ฏธ ์ดˆ๊ธฐํ™”๋œ ์ƒํƒœ์˜€๋‹ค.

๋ฐ˜๋Œ€๋กœ `@OneToMany`์˜ ๊ธฐ๋ณธ fetch ์ „๋žต์€ LAZY์ด๋‹ค.
์ผ๋Œ€๋‹ค ๊ด€๊ณ„์—์„œ๋Š” ์—ฐ๊ด€๋œ ์ปฌ๋ ‰์…˜์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
Theme ํ•˜๋‚˜๋ฅผ ์กฐํšŒํ–ˆ๋Š”๋ฐ ๊ทธ Theme์— ์—ฐ๊ฒฐ๋œ Reservation ๋ชฉ๋ก๊นŒ์ง€ ํ•ญ์ƒ ๊ฐ€์ ธ์˜ค๋ฉด ํ•„์š” ์—†๋Š” ์กฐํšŒ๊ฐ€ ์‰ฝ๊ฒŒ ๋งŽ์•„์งˆ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ FetchDefaultTheme์„ ์กฐํšŒํ•œ ์งํ›„์—๋Š” reservations ๋ชฉ๋ก์ด ํ”„๋ก์‹œ์ฒ˜๋Ÿผ ๋‚จ์•„ ์žˆ์—ˆ๊ณ ,
์‹ค์ œ๋กœ ๋ชฉ๋ก์˜ size๋ฅผ ํ™•์ธํ•˜๋Š” ์ˆœ๊ฐ„์—์•ผ Reservation ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๋Š” SELECT SQL์ด ์‹คํ–‰๋˜์—ˆ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด `@ManyToOne`์€ ๊ธฐ๋ณธ๊ฐ’์ด EAGER์ด๊ณ , `@OneToMany`๋Š” ๊ธฐ๋ณธ๊ฐ’์ด LAZY์ด๋‹ค.
ํ•˜์ง€๋งŒ ์‹ค๋ฌด ์ฝ”๋“œ์—์„œ๋Š” ๊ธฐ๋ณธ๊ฐ’์— ๊ธฐ๋Œ€๊ธฐ๋ณด๋‹ค fetch ์ „๋žต์„ ๋ช…์‹œํ•ด์„œ ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•˜๋‹ค๊ณ  ๋А๊ปด์ง„๋‹ค.
94 changes: 94 additions & 0 deletions docs/jpa/flush์‹œ์ .md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
## ๊ด€์ฐฐ: flush ์‹œ์ 

### ์‹œ๋„ํ•œ ์ฝ”๋“œ

Theme ๊ฐ์ฒด๋ฅผ DB์— ์ €์žฅํ•œ ๋’ค ๋‹ค์‹œ ์กฐํšŒํ•ด์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์˜ฌ๋ ค๋†“์Œ.
๊ทธ ๋’ค Theme์˜ name ๊ฐ’์„ ๋ฐ”๊พธ๊ณ , ์–ด๋–ค ์‹œ์ ์— UPDATE SQL์ด ๋‚˜๊ฐ€๋Š”์ง€ ํ™•์ธํ•จ.

์ด๋ฒˆ์—๋Š” ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋ˆ ์„œ ๋ด„.

```
1. entityManager.flush()๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•จ
2. Theme์„ ๋ณ€๊ฒฝํ•œ ๋’ค JPQL์„ ์‹คํ–‰ํ•จ
3. Theme์„ ๋ณ€๊ฒฝํ•œ ๋’ค ํŠธ๋žœ์žญ์…˜์„ ์ข…๋ฃŒํ•จ
```

### ์˜ˆ์ธกํ•œ SQL/๋™์ž‘

Theme์˜ name ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ์ˆœ๊ฐ„ ๋ฐ”๋กœ UPDATE๊ฐ€ ๋‚˜๊ฐ€์ง€๋Š” ์•Š์„ ๊ฒƒ์ด๋‹ค.
์™œ๋ƒํ•˜๋ฉด ๊ฐ์ฒด์˜ ๊ฐ’์ด ๋ฐ”๋€ ๊ฒƒ์ด์ง€, ์•„์ง DB์™€ ๋™๊ธฐํ™”๋œ ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋Œ€์‹  flush๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‹œ์ ์— Hibernate๊ฐ€ ๋ณ€๊ฒฝ ๊ฐ์ง€๋ฅผ ํ•˜๊ณ  UPDATE SQL์„ ๋‚ ๋ฆด ๊ฒƒ์ด๋‹ค.

```sql
update theme
set description=?,
name=?,
thumbnail_image_url=?
where id = ?
```

JPQL์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” JPQL SELECT๋ฅผ ํ•˜๊ธฐ ์ „์— ๋จผ์ € UPDATE๊ฐ€ ๋‚˜๊ฐˆ ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ•จ.
์™œ๋ƒํ•˜๋ฉด JPQL์€ DB๋ฅผ ์ง์ ‘ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์กฐํšŒ ์ „์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ DB์— ๋งž์ถฐ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

### ์‹ค์ œ SQL/๋™์ž‘

๋ช…์‹œ์ ์œผ๋กœ flush()๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ

```sql
update theme
set description=?,
name=?,
thumbnail_image_url=?
where id = ?
```

JPQL์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ

```sql
update theme
set description=?,
name=?,
thumbnail_image_url=?
where id = ?
```

```sql
select t1_0.id,
t1_0.description,
t1_0.name,
t1_0.thumbnail_image_url
from theme t1_0
where t1_0.id = ?
```

ํŠธ๋žœ์žญ์…˜์„ ์ข…๋ฃŒํ–ˆ์„ ๋•Œ

```sql
update theme
set description=?,
name=?,
thumbnail_image_url=?
where id = ?
```

### ์™œ ๊ทธ๋Ÿฐ๊ฐ€

flush๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ DB์— ๋ฐ˜์˜ํ•˜๋Š” ๋™๊ธฐํ™” ์‹œ์ ์ด๋‹ค.

Theme ๊ฐ์ฒด์˜ name์„ ๋ฐ”๊ฟจ์„ ๋•Œ ๊ทธ ์ˆœ๊ฐ„ ๋ฐ”๋กœ UPDATE SQL์ด ๋‚˜๊ฐ€์ง€๋Š” ์•Š์•˜๋‹ค.
์ด๋•Œ๋Š” ์•„์ง ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ์•ˆ์˜ ๊ฐ์ฒด ์ƒํƒœ๋งŒ ๋ฐ”๋€ ์ƒํƒœ์ด๋‹ค.

๊ทธ ๋’ค entityManager.flush()๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋‹ˆ Hibernate๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ์•ˆ์˜ ์Šค๋ƒ…์ƒท๊ณผ ํ˜„์žฌ ๊ฐ’์„ ๋น„๊ตํ–ˆ๊ณ ,
name ๊ฐ’์ด ๋‹ฌ๋ผ์ง„ ๊ฒƒ์„ ํ™•์ธํ•ด์„œ UPDATE SQL์„ ์‹คํ–‰ํ–ˆ๋‹ค.

JPQL์„ ์‹คํ–‰ํ•  ๋•Œ๋„ UPDATE๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ”๋‹ค.
์ฒ˜์Œ์—๋Š” SELECT๋งŒ ๋‚˜๊ฐˆ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, JPQL์€ DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
๋งŒ์•ฝ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ DB์— ๋ฐ˜์˜ํ•˜์ง€ ์•Š๊ณ  SELECT๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜๋ฉด, DB๋Š” ์•„์ง ์˜ˆ์ „ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ Hibernate๋Š” JPQL ์‹คํ–‰ ์ง์ „์— flush๋ฅผ ๋จผ์ € ํ•ด์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ DB๋ฅผ ๋งž์ถ˜๋‹ค.

ํŠธ๋žœ์žญ์…˜์ด ๋๋‚  ๋•Œ๋„ flush๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
์ปค๋ฐ‹ ์ „์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ DB์— ๋ฐ˜์˜ํ•ด์•ผ ์ตœ์ข…์ ์œผ๋กœ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด ์ €์žฅ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ •๋ฆฌํ•˜๋ฉด flush๋Š” commit ์ž์ฒด๋Š” ์•„๋‹ˆ์ง€๋งŒ, commit ์ „์— ํ•„์š”ํ•œ DB ๋™๊ธฐํ™” ๊ณผ์ •์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  flush๋Š” ์ง์ ‘ ํ˜ธ์ถœํ•  ๋•Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ JPQL ์‹คํ–‰ ์ง์ „, ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ์ ์—๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
Loading