Skip to content

[๐ŸŒฑ JPA ๋ฐฉํƒˆ์ถœ ์˜ˆ์•ฝ ๋Œ€๊ธฐ] ์ด์‚ฐ(์ด์ฑ„๋ฆฐ) ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#585

Open
Rix01 wants to merge 12 commits into
woowacourse:rix01from
Rix01:jpa-rix01
Open

[๐ŸŒฑ JPA ๋ฐฉํƒˆ์ถœ ์˜ˆ์•ฝ ๋Œ€๊ธฐ] ์ด์‚ฐ(์ด์ฑ„๋ฆฐ) ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#585
Rix01 wants to merge 12 commits into
woowacourse:rix01from
Rix01:jpa-rix01

Conversation

@Rix01

@Rix01 Rix01 commented Jun 18, 2026

Copy link
Copy Markdown

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

  • ๋ฏธ์…˜์˜ ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ๋‚˜์š”?
  • Gradle test๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ†ต๊ณผํ–ˆ๋‚˜์š”?
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋‚˜์š”?

๋ฒ ์ด์Šค ์ฝ”๋“œ ์„ ํƒ ์ฒดํฌ

  • ์ด์ „ ๋ฏธ์…˜์˜ ๋‚ด ์ฝ”๋“œ์—์„œ ์‹œ์ž‘
  • ์ด์ „ ๋ฏธ์…˜์˜ ํŽ˜์–ด์˜ ์ฝ”๋“œ์—์„œ ์‹œ์ž‘

์–ด๋–ค ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜์—ฌ ๋ฆฌ๋ทฐํ•ด์•ผ ํ• ๊นŒ์š”?

๋‹จ๊ณ„๋ณ„ ๋„๋‹ฌ ์ง€์ 

  • 1๋‹จ๊ณ„: JDBC โ†’ JPA ๋งคํ•‘ ๋ณ€ํ™˜ ์™„๋ฃŒ. @Entity, @ManyToOne(fetch = LAZY), @JoinColumn ์ ์šฉ. ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘ ์œ ์ง€, cascade ๋ฏธ์ ์šฉ.
  • 2๋‹จ๊ณ„: Member ๋„๋ฉ”์ธ ์ถ”๊ฐ€. Reservation, WaitingReservation์˜ name(String) ํ•„๋“œ๋ฅผ Member ์—ฐ๊ด€๊ด€๊ณ„๋กœ ๊ต์ฒด. GET /reservations-mine ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€.
  • 3๋‹จ๊ณ„: ์˜ˆ์•ฝ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„. N๋ฒˆ์งธ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ ๊ณ„์‚ฐ์€ ์œˆ๋„์šฐ ํ•จ์ˆ˜(row_number())๊ฐ€ ํ•„์š”ํ•ด Native Query ์‚ฌ์šฉ. ๋Œ€๊ธฐ ์Šน๊ฒฉ ์‹œ ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋น„๊ด€์  ๋ฝ(@Lock(PESSIMISTIC_WRITE)) ์ ์šฉ.
  • 4๋‹จ๊ณ„: ์˜ˆ์•ฝ ์ทจ์†Œยท์ˆ˜์ • ์‹œ ์ž๋™ ์Šน๊ฒฉ ๊ตฌํ˜„ ์™„๋ฃŒ.

๋ฐœํ–‰ SQL ๋ฐœ์ทŒ

๋Œ€๊ธฐ ์ˆœ๋ฒˆ ์กฐํšŒ (Native Query)

SELECT wr.id, row_number() OVER (
    PARTITION BY wr.date_id, wr.time_id, wr.theme_id
    ORDER BY wr.created_at ASC, wr.id ASC
) AS rank
FROM waiting_reservation wr
JOIN (
    SELECT date_id, time_id, theme_id
    FROM waiting_reservation
    WHERE member_id = :memberId
) slot ON wr.date_id = slot.date_id AND wr.time_id = slot.time_id AND wr.theme_id = slot.theme_id

์Šฌ๋กฏ ๊ธฐ์ค€ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋Œ€๊ธฐ ์กฐํšŒ (JPQL + ๋น„๊ด€์  ๋ฝ)

SELECT wr.*
FROM waiting_reservation wr
JOIN reservation_date d ON wr.date_id = d.id
JOIN reservation_time t ON wr.time_id = t.id
JOIN theme th ON wr.theme_id = th.id
WHERE wr.date_id = ? AND wr.time_id = ? AND wr.theme_id = ?
ORDER BY wr.created_at ASC, wr.id ASC
LIMIT 1
FOR UPDATE

๋ง์„ค์ธ ๊ฒฐ์ •

1. ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘ ์œ ์ง€
Reservation โ†’ Theme ๋“ฑ ๋ชจ๋‘ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์œ ์ง€ํ–ˆ๋‹ค. ์–‘๋ฐฉํ–ฅ์œผ๋กœ ํ•˜๋ฉด Theme์—์„œ List<Reservation>์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ๊ทธ ๋ฐฉํ–ฅ์˜ ํƒ์ƒ‰์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์—†์—ˆ๊ณ  ๋ฌดํ•œ ์ง๋ ฌํ™” ์œ„ํ—˜๋„ ์žˆ์–ด JPQL๋กœ ์—ญ๋ฐฉํ–ฅ ์กฐํšŒ๋ฅผ ํ•˜๋Š” ์ชฝ์„ ์„ ํƒํ–ˆ๋‹ค.

2. ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ๋ฒ”์œ„
time_id, date_id, theme_id๋ฅผ Slot ๋„๋ฉ”์ธ์œผ๋กœ ๋ฌถ์œผ๋ฉด Slot ์—”ํ‹ฐํ‹ฐ ์ž์ฒด์— ๋ฝ์„ ๊ฑธ์–ด ๋” ๋ช…ํ™•ํ•œ ๋™์‹œ์„ฑ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ์ฝ”๋“œ ๋ณ€๊ฒฝ ๋ฒ”์œ„๊ฐ€ ๋„ˆ๋ฌด ์ปค์ ธ ๋„์ž…ํ•˜์ง€ ๋ชปํ–ˆ๊ณ , ํ˜„์žฌ๋Š” 1์ˆœ์œ„ ๋Œ€๊ธฐ ์กฐํšŒ ์ฟผ๋ฆฌ์— ๋น„๊ด€์  ๋ฝ์„ ๊ฑธ์–ด ์ž„์‹œ๋ฐฉํŽธ์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.


ํ”๋“ค๋ฆฐ ํ•œ ์žฅ๋ฉด

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


Rix01 and others added 12 commits June 6, 2026 12:01
- ์˜ˆ์•ฝ ์ทจ์†Œ์—์„œ ๊ธฐ์กด ์˜ˆ์•ฝ ์‚ญ์ œ ๋กœ์ง์„ ๋Œ€๊ธฐ ์Šน๊ฒฉ ์กฐํšŒ ์ „์— ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝ
- ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ๋น ์ง„ ๋ถ€๋ถ„ ๋‹ค์‹œ ์ถ”๊ฐ€
- JdbcRepository๋ฅผ JpaRepository๋กœ ์ „ํ™˜
- Member ๋„๋ฉ”์ธ ์ถ”๊ฐ€
- Reservation, WaitingReservation์˜ name ํ•„๋“œ๋ฅผ Member ์—ฐ๊ด€๊ด€๊ณ„๋กœ ๊ต์ฒด
- GET /reservations-mine ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant