Skip to content

[๐Ÿš€ ์‚ฌ์ดํด2 - ๋ฏธ์…˜ (์˜ˆ์•ฝ ๋ณ€๊ฒฝ/์ทจ์†Œ์™€ ์—๋Ÿฌ ์ฒ˜๋ฆฌ)] ๋ณด์˜ˆ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#445

Merged
echo724 merged 43 commits into
woowacourse:boyekimfrom
boyekim:step2
May 19, 2026

Conversation

@boyekim

@boyekim boyekim commented May 14, 2026

Copy link
Copy Markdown

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

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

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

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

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

1. ์˜ˆ์•ฝ ์ƒ์„ฑ ์ •์ฑ… ๊ฒ€์ฆ ์ถ”๊ฐ€

  • ์ง€๋‚˜๊ฐ„ ๋‚ ์งœ์˜ ์˜ˆ์•ฝ ์ƒ์„ฑ์„ ๊ฑฐ๋ถ€ํ•˜๋„๋ก ๊ฒ€์ฆ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋Š˜ ๋‚ ์งœ์˜ ์˜ˆ์•ฝ์ธ ๊ฒฝ์šฐ, ํ˜„์žฌ ์‹œ๊ฐ๋ณด๋‹ค ์ด์ „ ์‹œ๊ฐ„์€ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†๋„๋ก ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ™์€ ๋‚ ์งœ + ์‹œ๊ฐ„ + ํ…Œ๋งˆ ์กฐํ•ฉ์— ์ด๋ฏธ ์˜ˆ์•ฝ์ด ์กด์žฌํ•˜๋ฉด ์ค‘๋ณต ์˜ˆ์•ฝ์œผ๋กœ ๊ฑฐ๋ถ€ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ์—์„œ ์‹œ๊ฐ„ ์˜์กด ๋กœ์ง์„ ์•ˆ์ •์ ์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋„๋ก Clock์„ ์ฃผ์ž…๋ฐ›๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

2. ๊ด€๋ฆฌ์ž์™€ ์‚ฌ์šฉ์ž์˜ ์˜ˆ์•ฝ ์‚ญ์ œ ์ •์ฑ… ๋ถ„๋ฆฌ

๊ด€๋ฆฌ์ž ์‚ญ์ œ์™€ ์‚ฌ์šฉ์ž ์‚ญ์ œ์˜ ์ •์ฑ…์ด ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ด€๋ฆฌ์ž๋Š” ์ง€๋‚œ ์˜ˆ์•ฝ๋„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๋Š” ์ด๋ฏธ ์ง€๋‚œ ๋‚ ์งœ/์‹œ๊ฐ„์˜ ์˜ˆ์•ฝ์„ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

4. ์˜ˆ์™ธ ์‘๋‹ต ๊ตฌ์กฐ ์ •๋ฆฌ

์—๋Ÿฌ ์‘๋‹ต์€ ์•„๋ž˜ ํ˜•ํƒœ๋กœ ์ฃผ์–ด์ง€๋Š”๋ฐ์š”, ๋ณดํ†ต ์–ด๋–ค ์‹์œผ๋กœ ๋‚ด๋ ค์ฃผ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!!

{
  "code": "ERROR_CODE",
  "message": "์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ๋ฉ”์‹œ์ง€"
}

5. ์ด์ „ ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ์— ๋Œ€ํ•ด

Not found ์˜ˆ์™ธ์— ๋Œ€ํ•ด

#347 (comment)
https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.4 ์š”๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ํ˜„์žฌ ์ƒํ™ฉ์—์„œ NOT_FOUND๊ฐ€ ์–ด์ƒ‰ํ•œ ์ƒํ™ฉ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์–ด์š”. ๊ทธ๋ž˜์„œ ์šฐ์„  ์ฝ”๋“œ๋ฅผ 200์œผ๋กœ ์ˆ˜์ •ํ•˜์ง€๋Š” ์•Š์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค..!!
๋‹ค๋งŒ ๋ง์”€ํ•ด์ฃผ์‹  ์„œ๋น„์Šค์˜ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ๋„ˆ๋ฌด ์ข‹์•˜์Šต๋‹ˆ๋‹ค! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ใ…Žใ…Ž ๋‹ค์Œ์— ๋ง์”€ํ•ด์ฃผ์‹  ์ƒํ™ฉ์„ ๋งˆ์ฃผํ•˜๋ฉด ์ด๋Ÿฐ ํ•ด๊ฒฐ์ ์„ ๋ฐ”๋กœ ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š” ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค~!

๋กœ๊น…์— ๋Œ€ํ•ด

#347 (comment)
์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ž์›์— ๋Œ€ํ•ด ์ง€์†ํ•ด์„œ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ๋•Œ์—๋Š”, ์บ์‹ฑ์ด ์ž˜๋ชป๋˜์–ด์žˆ๋Š” ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ๊ตฌ ์ถ”์ ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ์š”!
์š” ์ƒํ™ฉ๋ณด๋‹ค ๋ง์”€ํ•ด์ฃผ์‹  ์ƒํ™ฉ โฌ‡๏ธ

๊ณผ๋„ํ•œ ์‚ญ์ œ ์š”์ฒญ์ด๋ผ(์˜ˆ๋ฅผ ๋“ค๋ฉด ๋””๋„์Šค ๊ณต๊ฒฉ ์ฒ˜๋Ÿผ ๊ณผ๋„ํ•œ ๊ณต๊ฒฉ์œผ๋กœ ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜์‹œํ‚ค๋Š” ํ˜•ํƒœ) โ†’ rate limiting ๋„์ž…
์ž˜๋ชป๋œ id๋ฅผ ์–ด๋”˜๊ฐ€์—์„œ ๋ฐ›์•„์„œ โ†’ id ์ƒ์„ฑ/๋ฐ˜ํ™˜ ๋ถ€๋ถ„ ํ…Œ์ŠคํŠธ๋กœ ๊ฒ€์ฆ

์ด ๋” ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”?! ์—์ฝ”์˜ ๊ฒฝํ—˜์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค

๊ฐ€๋Šฅ ์‹œ๊ฐ„ ์กฐํšŒ api์— ๋Œ€ํ•ด

#347 (comment)
๋‚จ๊ฒจ์ฃผ์‹ 
"๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„์„ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ ์กฐํšŒ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” times ๋ณด๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋” ๋‚ดํฌ๋˜์–ด์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค."
๋ผ๋Š” ๋ง์— ํฌ๊ฒŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค~! ์—”๋“œํฌ์ธํŠธ ์ˆ˜์ •ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

errors์˜ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด

#347 (comment)
์ฝ”๋ฉ˜ํŠธ ๋ฐ˜์˜ํ•˜์—ฌ ํŒจํ‚ค์ง€ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค!

boyekim added 17 commits May 12, 2026 15:11
@echo724 echo724 self-requested a review May 14, 2026 16:28

@echo724 echo724 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š” ๋ณด์˜ˆ!
์‚ฌ์ดํด2๋„ ๊น”๋”ํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ์ž˜ ์ž‘์„ฑํ•ด์ฃผ์…จ๋„ค์š”! ๋Œ€๋ถ€๋ถ„์˜ ์˜ˆ์™ธ/์—๋Ÿฌ ์ผ€์ด์Šค๊ฐ€ ์ปค๋ฒ„๋๊ณ  ๋ฉ”์„ธ์ง€์™€ ํƒ€์ž…๋„ ์ ์ ˆํ•˜๊ฒŒ ์ž˜ ์‚ฌ์šฉํ•˜์‹  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๋ณ€๊ฒฝ ์š”์ฒญ์—์„œ๋Š”

  1. ์ปจํŠธ๋กค๋Ÿฌ, e2e ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์•„์˜ˆ ์—†๋Š”๋ฐ ์‹ค์ œ๋กœ ์š”์ฒญ ๋ฐ”๋””๊ฐ€ ๋น„๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๊ฐ’์˜ ์š”์ฒญ์ด ์ •์ƒ ์ฒ˜๋ฆฌ๋กœ ๋˜๋Š” ๊ฒฝ์šฐ๋“ค์ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ๊ฒ€์ฆ์ด ๋์„ ๊ฒƒ ๊ฐ™์•„์š”. ํ•œ ๋ฒˆ ๋ฌธ์ œ ์ƒํ™ฉ ์ปค๋ฉ˜ํŠธ๋กœ ๋‚จ๊ฒผ์œผ๋‹ˆ ํ™•์ธํ•ด๋ณด์‹œ๊ณ  ํ•ด๋‹น ์ผ€์ด์Šค๋“ค ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ๋“ค ์ž‘์„ฑํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!
  2. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ช‡๋ช‡ ์˜ˆ์™ธ ์ƒํ™ฉ ์ปค๋ฒ„๊ฐ€ ์•ˆ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ™•์ธํ•ด๋ณด์‹œ๊ณ  ์ ์ ˆํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•ด์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

์•„๋ž˜๋Š” ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์ž…๋‹ˆ๋‹ค! (๋ช‡๋ช‡์€ ์ฝ”๋“œ ์ปค๋ฉ˜ํŠธ๋กœ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค)

  • Not Found: ์ €๋„ ์ด ๋ถ€๋ถ„ ํฌ๋ฃจ๋“ค ๊ณตํ†ต์ ์œผ๋กœ ํ”ผ๋“œ๋ฐฑ์ด ๋“œ๋ ธ๋˜ ๋ถ€๋ถ„์ด๋ผ ์ €๋„ ์ข€ ๋” ์„ค๋ช…์„ ๋“œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ 404์˜ ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”, 1. ์‹ค์ œ url์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (์—”๋“œํฌ์ธํŠธ ๋งตํ•‘/๋ผ์šฐํ„ฐ/์ปจํŠธ๋กค๋Ÿฌ ๋“ฑ์ด ์—†๋Š” ์ƒํ™ฉ, ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ”ํžˆ ๋ณด๋Š” 404) 2. ๋น„์ง€๋‹ˆ์Šค์ ์œผ๋กœ ์œ ์ €๊ฐ€ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „์ž์˜ ๊ฒฝ์šฐ ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ๋งŒ๋“ค์—ˆ์„๋•Œ, ํ”„๋ก ํŠธ์—”๋“œ๋‚˜ ์•ฑ์€ ๋ฐฐํฌ ํ–ˆ๋Š”๋ฐ ์„œ๋ฒ„๊ฐ€ ๋ฐฐํฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์—์„œ ์š”์ฒญ ์‘๋‹ต์œผ๋กœ 404 ์ฝ”๋“œ๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์ฃ ? ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์žฅ์•  ์ƒํ™ฉ์ด๋ผ ๋ณ„๋„์˜ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•ด์ง‘๋‹ˆ๋‹ค. ๊ทผ๋ฐ ๋น„์ง€๋‹ˆ์Šค ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ์—๋„ 404๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์žฅ์•  ์ƒํ™ฉ์ด ์•„๋‹Œ๋ฐ ์žฅ์•  ์ƒํ™ฉ์œผ๋กœ ์ธ์‹๋  ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ์ด๋Ÿฐ ์ƒํ™ฉ ๋•Œ๋ฌธ์— ํŠนํžˆ ํ˜„์—…์—์„œ๋Š” ๋น„์ง€๋‹ˆ์Šค ์ผ€์ด์Šค์— ๋Œ€ํ•ด 404๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ปค๋ฉ˜ํŠธ ํ™•์ธํ•ด๋ณด์‹œ๊ณ  ์ดํ•ด ์•ˆ๋˜์‹œ๊ฑฐ๋‚˜ ๋” ๊ถ๊ธˆํ•˜์‹  ๋ถ€๋ถ„ ์žˆ์œผ๋ฉด ๋ฉ”์„ธ์ง€ ๋ณด๋‚ด์ฃผ์„ธ์š”. ํ™”์ดํŒ…์ž…๋‹ˆ๋‹ค~

Comment thread src/main/java/roomescape/domain/reservation/ReservationController.java Outdated
Comment on lines +168 to +176
if (request.startWhen() != null) {
reservationDate = reservationDateRepository.findByDate(request.startWhen())
.orElseThrow(() -> new NotFoundException(ReservationDateErrors.RESERVATION_DATE_NOT_EXIST));
}
return reservationDate;
}

private ReservationTime getReservationTime(UpdateReservationRequest request, ReservationTime reservationTime) {
if (request.startAt() != null) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” request.startAt๊ณผ request.startWhen ๋‘˜ ๋‹ค null์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค! ์‹ค์ œ๋กœ ๋นˆ ๋ฐ”๋””๋กœ ๋ฆฌํ€˜์ŠคํŠธ๋กœ ๋ณด๋‚ด๋ฉด 204๊ฐ€ ๋œจ๋Š”๋ฐ ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ์š”?

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.

๋‘˜ ๋‹ค null์ผ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋กœ์ง์ด ์—†๋‹ค๋Š” ์˜๋ฏธ์ธ๊ฐ€์š”?!
๋นˆ ๋ฐ”๋””๋กœ ๋ณด๋‚ด๋ฉด ๊ธฐ์กด ์˜ˆ์•ฝ์˜ ์‹œ๊ฐ„๊ณผ ๋‚ ์งœ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 204๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!
์ˆ˜์ •ํ•  ๊ฒƒ์ด ์—†์œผ๋ฉด ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ž์—ฐ์Šค๋Ÿฝ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์ž˜๋ชป๋œ ์ƒ๊ฐ์ผ๊นŒ์š”??

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๋„ค๋„ค ์ œ๊ฐ€ ๋‹ค์‹œ ๋ด๋„ ๋ฌธ์žฅ์„ ๋„ˆ๋ฌด ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ์ž‘์„ฑํ–ˆ๋„ค์š”;; ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.
๋„ค๋„ค ๋‘˜ ๋‹ค null์ผ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋กœ์ง์ด ์—†๋‹ค๋Š” ์˜๋ฏธ์˜€์Šต๋‹ˆ๋‹ค! ์ž˜ ์ดํ•ดํ•˜๊ณ  ๋‹ต ๋‚จ๊ฒจ์ฃผ์…จ๋„ค์š” ใ…Žใ…Ž

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

Comment thread src/main/java/roomescape/domain/reservation/ReservationService.java Outdated
Comment thread src/main/java/roomescape/domain/reservation/ReservationService.java Outdated
Comment thread src/main/java/roomescape/domain/theme/dto/CreateThemeRequest.java Outdated
}

@Transactional
public void deleteUserReservation(Long 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.

์„œ๋น„์Šค ๋ฉ”์„œ๋“œ์ด๋‹ˆ db operation ์ด๋ฆ„๋ณด๋‹จ ๋น„์ง€๋‹ˆ์Šค ์ผ€์ด์Šค์ธ cancel๋ฅผ ์ด๋ฆ„์— ๋‹ด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ๋‚˜์ค‘์— ๋‚ด๋ถ€์ ์œผ๋กœ cancel์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์ด ๋ฐ”๋€Œ๋”๋ผ๋„ (is_cancelled๋ฅผ ๋„์ž…ํ•œ๋‹ค๊ฑฐ๋‚˜ softdelete๋ฅผ ํ•œ๋‹ค๊ฑฐ๋‚˜) ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋  ์ผ์ด ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

@boyekim boyekim May 16, 2026

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.

์˜ค ๋„ˆ๋ฌด ์ข‹์€ ๊ฒƒ ๊ฐ™์•„์š”! ๋ฐ˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค!! ์–ด๋“œ๋ฏผ์šฉ ์„œ๋น„์Šค ๋ฉ”์„œ๋“œ๋„ cancel์„ ์“ฐ๋„๋ก ๋ณ€๊ฒฝํ–ˆ์–ด์š”. ์ถ”๊ฐ€๋กœ Controller์—์„œ๋„ ๋ฉ”์„œ๋“œ ๋„ค์ด๋ฐ์„ cancel๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค!

Comment on lines +198 to +220
public boolean existsReservation(Long timeId, Long dateId, Long themeId) {
Integer count = jdbcTemplate.queryForObject(
COUNT_RESERVATION_BY_TIME_AND_DATE_AND_THEME_SQL,
Integer.class,
timeId,
dateId,
themeId
);
return count != null && count > 0;
}

@Override
public boolean existsOtherReservation(Long id, Long timeId, Long dateId, Long themeId) {
Integer count = jdbcTemplate.queryForObject(
COUNT_OTHER_RESERVATION_BY_TIME_AND_DATE_AND_THEME_SQL,
Integer.class,
id,
timeId,
dateId,
themeId
);
return count != null && count > 0;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๋‘ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ ์กด์žฌ ์—ฌ๋ถ€๋งŒ ํŒ๋‹จํ•˜๋Š”๋ฐ ์ฟผ๋ฆฌ๋Š” count๋ฅผ ์“ฐ๋„ค์š”? EXISTS ์ฟผ๋ฆฌ๊ฐ€ ์˜๋„์— ๋” ๋งž์ง€ ์•Š์„๊นŒ์š”?

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.

๊ทธ๋Ÿฌ๋„ค์š”..!! exist๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ์ฟผ๋ฆฌ๋ฌธ ๋„ค์ด๋ฐ๋„ ์˜๋„๋ฅผ ๋” ์ž˜ ๋‚˜ํƒ€๋‚ด๋„๋ก EXIST๋กœ ๋ณ€๊ฒฝํ•ด์คฌ์Šต๋‹ˆ๋‹ค.


@RestController
@RequiredArgsConstructor
public class ReservationController {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์„œ๋น„์Šค ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ์—๋Š” ์ž˜ ์ž‘์„ฑํ•ด์ฃผ์…จ๋Š”๋ฐ Controller ํ˜น์€ e2e ํ…Œ์ŠคํŠธ๋Š” ๋”ฐ๋กœ ์•ˆ๋ณด์ด๋„ค์š”? ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์ด ์–ด์ฐจํ”ผ ์„œ๋น„์Šค์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ค ์ˆ˜ ๋„ ์žˆ๋Š”๋ฐ, ๊ฐ๊ฐ์˜ ๊ด€์‹ฌ์‚ฌ์™€ ๋Œ€์ƒ์ด ์กฐ๊ธˆ์€ ๋‹ค๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?

@boyekim boyekim left a comment

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.

์•ˆ๋…•ํ•˜์„ธ์š” ์—์ฝ”! ๊ผผ๊ผผํ•˜๊ฒŒ ๋ฆฌ๋ทฐํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธ์™€ e2e ํ…Œ์ŠคํŠธ๋ฅผ ์ œ๊ฐ€ ์ž˜ ์ž‘์„ฑํ•˜๋Š” ํŽธ์ด ์•„๋‹ˆ๋‹ค๋ณด๋‹ˆ ํ•™์Šต์„ ํ•˜๋ฉฐ ์ง„ํ–‰ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ทฐ ์š”์ฒญ์ด ๋Šฆ์–ด์ ธ์„œ ์ฃ„์†กํ•ด์š”.

์ด๋ฒˆ์— ๋ฆฌ๋ทฐ ๋ฐ˜์˜์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธ, e2e ํ…Œ์ŠคํŠธ๋ฅผ ์ฒ˜์Œ์œผ๋กœ ์ข€ ํ•™์Šตํ•ด๋ณธ ๊ฒƒ ๊ฐ™์•„์š”.
ํ•™์Šตํ•˜๋ฉฐ ๊ถ๊ธˆํ•œ ์ ์ด ์ƒ๊ฒผ๋Š”๋ฐ์š”, ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค!

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

Comment thread src/main/java/roomescape/domain/reservation/ReservationController.java Outdated
Comment thread src/main/java/roomescape/domain/reservation/ReservationService.java Outdated
Comment thread src/main/java/roomescape/domain/reservation/ReservationService.java Outdated
Comment thread src/main/java/roomescape/domain/reservation/ReservationService.java Outdated
}

@Transactional
public void deleteUserReservation(Long id) {

@boyekim boyekim May 16, 2026

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.

์˜ค ๋„ˆ๋ฌด ์ข‹์€ ๊ฒƒ ๊ฐ™์•„์š”! ๋ฐ˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค!! ์–ด๋“œ๋ฏผ์šฉ ์„œ๋น„์Šค ๋ฉ”์„œ๋“œ๋„ cancel์„ ์“ฐ๋„๋ก ๋ณ€๊ฒฝํ–ˆ์–ด์š”. ์ถ”๊ฐ€๋กœ Controller์—์„œ๋„ ๋ฉ”์„œ๋“œ ๋„ค์ด๋ฐ์„ cancel๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค!

Comment on lines +168 to +176
if (request.startWhen() != null) {
reservationDate = reservationDateRepository.findByDate(request.startWhen())
.orElseThrow(() -> new NotFoundException(ReservationDateErrors.RESERVATION_DATE_NOT_EXIST));
}
return reservationDate;
}

private ReservationTime getReservationTime(UpdateReservationRequest request, ReservationTime reservationTime) {
if (request.startAt() != null) {

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.

๋‘˜ ๋‹ค null์ผ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋กœ์ง์ด ์—†๋‹ค๋Š” ์˜๋ฏธ์ธ๊ฐ€์š”?!
๋นˆ ๋ฐ”๋””๋กœ ๋ณด๋‚ด๋ฉด ๊ธฐ์กด ์˜ˆ์•ฝ์˜ ์‹œ๊ฐ„๊ณผ ๋‚ ์งœ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 204๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!
์ˆ˜์ •ํ•  ๊ฒƒ์ด ์—†์œผ๋ฉด ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ž์—ฐ์Šค๋Ÿฝ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์ž˜๋ชป๋œ ์ƒ๊ฐ์ผ๊นŒ์š”??

Comment thread src/main/java/roomescape/domain/theme/dto/CreateThemeRequest.java Outdated
Comment on lines +198 to +220
public boolean existsReservation(Long timeId, Long dateId, Long themeId) {
Integer count = jdbcTemplate.queryForObject(
COUNT_RESERVATION_BY_TIME_AND_DATE_AND_THEME_SQL,
Integer.class,
timeId,
dateId,
themeId
);
return count != null && count > 0;
}

@Override
public boolean existsOtherReservation(Long id, Long timeId, Long dateId, Long themeId) {
Integer count = jdbcTemplate.queryForObject(
COUNT_OTHER_RESERVATION_BY_TIME_AND_DATE_AND_THEME_SQL,
Integer.class,
id,
timeId,
dateId,
themeId
);
return count != null && count > 0;
}

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.

๊ทธ๋Ÿฌ๋„ค์š”..!! exist๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ์ฟผ๋ฆฌ๋ฌธ ๋„ค์ด๋ฐ๋„ ์˜๋„๋ฅผ ๋” ์ž˜ ๋‚˜ํƒ€๋‚ด๋„๋ก EXIST๋กœ ๋ณ€๊ฒฝํ•ด์คฌ์Šต๋‹ˆ๋‹ค.

@echo724 echo724 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š” ๋ณด์˜ˆ!
e2e์™€ controller ํ…Œ์ŠคํŠธ๋“ค ๋‹ค ์ž‘์„ฑํ•ด์ฃผ์…จ๋„ค์š”! ์•„๋ฌด๋ž˜๋„ ํ•™์Šต๊นŒ์ง€ ๊ฐ™์ด ํ•˜๋ฉด์„œ ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ์‰ฝ์ง€ ์•Š์•˜์„ํ…๋ฐ, ๊ณ ์ƒ ๋งŽ์œผ์…จ์Šต๋‹ˆ๋‹ค! ๋Œ€๋ถ€๋ถ„ ์ปค๋ฉ˜ํŠธ๋„ ์ž˜ ๋ฐ˜์˜ํ•ด์ฃผ์‹œ๊ณ  ํŠน๋ณ„ํžˆ ์š”์ฒญ ์‚ฌํ•ญ์ด ์—†์–ด์„œ ์ด๋ฒˆ์— ๋จธ์ง€ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! ์ด์ „ ๋ฆฌ๋ทฐ ๋ช‡๋ช‡ ์ปค๋ฉ˜ํŠธ์— ๋‹ต ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ™•์ธ ๊ฐ™์ด ํ•ด๋ณด์‹œ๊ณ  ๋‹ค์Œ ์„ ํƒ ๋ฏธ์…˜๊ณผ ๋‚จ์€ ๋ ˆ๋ฒจ๋„ ํ™”์ดํŒ…์ž…๋‹ˆ๋‹ค~!

import roomescape.support.exception.errors.ReservationErrors;

@WebMvcTest(ReservationController.class)
class ReservationControllerTest {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธ๋„ ์ œ๋Œ€๋กœ ์ž˜ ์ž‘์„ฑํ•˜์…จ๋„ค์š”! ์‹œ๊ฐ„์ƒ e2e ํ…Œ์ŠคํŠธ controllerํ…Œ์ŠคํŠธ ๋‘˜ ๋‹ค ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ์˜ค๋ž˜ ๊ฑธ๋ ธ์„ํ…๋ฐ ํ•™์Šต๋„ ํ•˜์‹œ๊ณ  ํ•˜์‹ ๊ฑฐ๋ฉด ๊ฝค๋‚˜ ์‹œ๊ฐ„์„ ์“ฐ์…จ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!


@Test
@DisplayName("์˜ˆ์•ฝ์ž ์ด๋ฆ„ ์กฐํšŒ ์‹œ ์ด๋ฆ„์ด ๋ˆ„๋ฝ๋˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.")
void getUserReservationsWithoutName() throws Exception {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

controller vs e2e ํ…Ÿ์ŠคํŠธ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ์ฃผ์…จ๋Š”๋ฐ, ํ•ด๋‹น ๊ฒฝ์šฐ๊ฐ€ ์•„๋ฌด๋ž˜๋„ controller ํ…Œ์ŠคํŠธ์— ๋“ค์–ด๊ฐ€๋ฉด ์ข‹๊ณ  e2e์— ๋“ค์–ด๊ฐ€๊ธฐ์—๋Š” ์•ˆ์ข‹์€ ์ผ€์ด์Šค ์ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  e2e์—์„œ ์˜ˆ์™ธ ์ƒํ™ฉ๊ณผ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ์ปค๋ฒ„ํ•ด๋„ ๋˜๊ธด ํ•˜์ง€๋งŒ, ์•„๋ฌด๋ž˜๋„ dependency setup๋ถ€ํ„ฐ ๊ด€๋ จ๋œ ๋ชจ๋“  ์˜์กด ๊ฐ์ฒด๋ฅผ ๋„์šฐ๊ธฐ ๋•Œ๋ฌธ์— ๋น„์šฉ์ด ๋น„์‹ธ๊ณ  ๋”ฐ๋ผ์„œ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์š”์ฒญ๊ฐ’์ด๋‚˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ˆ„๋ฝ์˜ ๊ฒฝ์šฐ, ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ฑ…์ž„์ด๊ธฐ๋„ ํ•˜๊ณ  e2e์— ๋น„ํ•ด ๋น„์šฉ์ด ์‹ธ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์˜ˆ์™ธ์™€ ์—ฃ์ง€์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•ด๋„ ๋ฌด๋ฆฌ๊ฐ€ ์—†๊ฒ ์ฃ ?

@echo724 echo724 merged commit 3755ac2 into woowacourse:boyekim May 19, 2026
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.

2 participants