๋”ฐ๋‹ฅ ํด๋ฆญ๋งŒ ๋ง‰์œผ๋ฉด ๋๋‚  ์ค„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค

2026. 2. 15. 17:27ยท๊ฐœ๋ฐœ/๊ธฐ์ˆ 

๋™์‹œ ์‚ฝ์ž… ์ด์Šˆ(๋”ฐ๋‹ฅ ์ด์Šˆ)

๊ฐœ๋… ๋ฐ ๋ฌธ์ œ์ 

๋”ฐ๋‹ฅ ์ด์Šˆ๋ž€ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋ฒ„ํŠผ์„ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ฒˆ ํด๋ฆญํ•ด์„œ ๋™์ผํ•œ API ์š”์ฒญ์ด ์งง์€ ์‹œ๊ฐ„ ์•ˆ์— ์ค‘๋ณต์œผ๋กœ ์„œ๋ฒ„์— ์ „๋‹ฌ๋˜๋Š” ํ˜„์ƒ์„ ๋งํ•œ๋‹ค.

์ค‘๋ณต ๋ฐ์ดํ„ฐ ์‚ฝ์ž…์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์ •์ฑ…์—์„œ ๋”ฐ๋‹ฅ ์ด์Šˆ๋กœ ์ธํ•œ ์ค‘๋ณต ์‚ฝ์ž…์€ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.

์ด๋•Œ ์„œ๋ฒ„์—์„œ๋Š” ๊ฐ ์š”์ฒญ์ด ๋…๋ฆฝ์ ์ธ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ˆœํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฒ€์ฆ๋งŒ์œผ๋กœ๋Š” ๋™์‹œ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.

 

๋ฌธ์ œ ์ƒํ™ฉ

ํ˜„์žฌ ๋ฉ˜ํ† ๋ง ์˜ˆ์•ฝ์˜ ์ •์ฑ…์€ ํ•œ ์‚ฌ๋žŒ์ด ๊ฐ™์€ ๋ฉ˜ํ† ๋ง์„ ์ค‘๋ณต ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ •์ฑ…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ ์ƒํ™ฉ์€ ๋”ฐ๋‹ฅ ์š”์ฒญ์œผ๋กœ ์ธํ•œ ์ค‘๋ณต ์‚ฝ์ž…์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋‘ ๊ฐœ์˜ ์š”์ฒญ์ด ๊ฑฐ์˜ ๋™์‹œ์— ๋“ค์–ด์™€ ๋ชจ๋‘ ์•„์ง ์˜ˆ์•ฝ์ด ์—†๋‹ค๊ณ  ํŒ๋‹จํ•œ ๋’ค ๊ฐ๊ฐ ์˜ˆ์•ฝ์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.
๊ทธ ๊ฒฐ๊ณผ, ํ•œ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ™์€ ๋ฉ˜ํ† ๋ง์— ๋Œ€ํ•ด ๋™์‹œ์— ๋‘ ๊ฐœ์˜ ์˜ˆ์•ฝ์„ ๊ฐ€์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๋™์‹œ์„ฑ์œผ๋กœ ์ธํ•œ ๋”ฐ๋‹ฅ ๋ฌธ์ œ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ 1์ฐจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ๋‘ ๋ฒˆ ํด๋ฆญํ–ˆ์„ ๋•Œ ์š”์ฒญ์„ ํ•˜๋‚˜์”ฉ ๋ณด๋‚ด์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ์˜ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ๋“œ๋Ÿฌ๋‚˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด์„œ ์„œ๋ฒ„์—์„œ๋„ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ์ œ์–ดํ•ด ๋ณด์ž.

 

๋ชฉํ‘œ

  • ๋™์‹œ์„ฑ์œผ๋กœ ์ธํ•œ ์ค‘๋ณต ์‚ฝ์ž… ํ•ด๊ฒฐ
  • ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ์™€ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ์ ์ ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š”๋‹ค.
  • ์ค‘๋ณต ์‚ฝ์ž…์€ DB ๋ ˆ๋ฒจ์—์„œ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ DB ๋ ˆ๋ฒจ์—์„œ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š”๋‹ค.
  • ๊ตฌํ˜„ ๋‚œ์ด๋„๊ฐ€ ๋„ˆ๋ฌด ๋†’์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š”๋‹ค.

ํ™˜๊ฒฝ ์ •๋ณด

์„œ๋ฒ„ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ

  • EC2 t4g.small ๋‹จ์ผ ์ธ์Šคํ„ด์Šค
  • Java 21
  • Spring Boot 3.5
  • Spring Data JPA

DB ํ™˜๊ฒฝ

  • EC2 t4g.small ๋‹จ์ผ ์ธ์Šคํ„ด์Šค
  • MySQL 8.0

DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

  • Flyway

ํ…Œ์ด๋ธ” ์ •๋ณด

์ด๋ฒˆ ๋ฌธ์ œ์˜ ๋Œ€์ƒ์ด ๋˜๋Š” Reservation(์˜ˆ์•ฝ) ํ…Œ์ด๋ธ”์ด๋‹ค.

 

์ธ๋ฑ์Šค ์ •๋ณด

 

๋™์‹œ์„ฑ์ด ๋ฐœ์ƒํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง

 

 

์›์ธ ๋ถ„์„

์›์ธ์€ ๋™์‹œ์— ์˜ˆ์•ฝํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋‘ ๋ฒˆ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋™์‹œ์— ์š”์ฒญ์ด ๋“ค์–ด์™€์„œ ์ƒ๊ธฐ๋Š” ๊ฒฝ์Ÿ์ƒํƒœ๊ฐ€ ์›์ธ์ด๋‹ค.

์ฆ‰, Race Condition์ด๋‹ค.

 

validateNoOngoinReservation()์—์„œ ์ค‘๋ณต์˜ˆ์•ฝ ๊ฒ€์ฆ์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์š”์ฒญ์ด ๋™์‹œ์— ๋“ค์–ด์™€์„œ ๋งŒ์•ฝ, DB์— ํ•ด๋‹น ๋ฉ˜ํ† ๋ง์— ๋Œ€ํ•œ ์˜ˆ์•ฝ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋‘˜ ๋‹ค ๊ฒ€์ฆ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์˜ˆ์•ฝ์ด ๋‘ ๋ฒˆ ์‚ฝ์ž…๋˜๊ฒŒ ๋œ๋‹ค.

์œ„์—์„œ ๋ดค๋˜ ๊ทธ๋ฆผ์„ ๋‹ค์‹œ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ํŽธํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋ณตํ•ฉ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค

๊ฐ€์žฅ ๋จผ์ € DB ์ œ์•ฝ ์กฐ๊ฑด์„ ์ƒ๊ฐํ–ˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” ๊ฐ™์€ ๋ฉ˜ํ† ๋ง์— ๋Œ€ํ•ด์„œ ์ค‘๋ณต ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘๋ณต์€ ์˜ˆ์•ฝ์˜ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

์ฆ‰, ์˜ˆ์•ฝ์€ ์‚ฌ์šฉ์ž, ๋ฉ˜ํ† ๋ง, ์ƒํƒœ๋กœ ์ค‘๋ณต๋˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณตํ•ฉ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ด ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Reservation์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณตํ•ฉ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•ด ์ฃผ์ž.

(member_id, mentoring_id, status)

flyway ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

ALTER TABLE reservation
ADD CONSTRAINT uk_reservation_member_mentoring_status UNIQUE (mentee_id, mentoring_id, status);

๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์— ๋‘ ๊ฐœ์˜ Http ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜๋„ ์žˆ์—ˆ์ง€๋งŒ, ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ ์‘๋‹ต ์‹œ๊ฐ„์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ http ํ…Œ์ŠคํŠธ๋กœ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

๊ฒฐ๊ณผ๋Š” ์„ฑ๊ณต์ ์œผ๋กœ ํ•˜๋‚˜๋Š” ์„ฑ๊ณตํ–ˆ๊ณ , ํ•˜๋‚˜๋Š” ์‹คํŒจํ•˜์—ฌ ๋™์‹œ์„ฑ ์ œ์–ด๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋˜์—ˆ๋‹ค. ์„ฑ๊ณต ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ์†๋„๋„ 130ms์œผ๋กœ ๋‚˜์˜์ง€ ์•Š๋‹ค. ์‹คํŒจ ์‘๋‹ต์†๋„๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋“ฑ์œผ๋กœ ์ธํ•ด ์กฐ๊ธˆ ๋А๋ฆฐ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹จ์ˆœํ•˜๊ฒŒ ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์œผ๋กœ ํ•ด๊ฒฐ ํ•œ ์ค„ ์•Œ์•˜์œผ๋‚˜, ์‚ฌ์‹ค ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

 

์ž ๊น, ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง€๋Š” ์ค‘๋ณต ์‚ฝ์ž…

๋ฉ˜ํ‹ฐ์˜ ๋ฉ˜ํ† ๋ง ์˜ˆ์•ฝ๋ถ€ํ„ฐ ์ข…๋ฃŒ๊นŒ์ง€์˜ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋ฉ˜ํ† ๋ง์„ ์˜ˆ์•ฝํ•˜๊ณ  ๋ฉ˜ํ† ๊ฐ€ ์Šน์ธ(๋˜๋Š” ๊ฑฐ์ ˆ -> ๊ฑฐ์ ˆํ•˜๋ฉด ์˜ˆ์•ฝ ๊ฑฐ์ ˆ)ํ•˜๋ฉด ๋ฉ˜ํ† ๋ง์ด ์ง„ํ–‰๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฉ˜ํ† ๋ง์ด ๋๋‚˜๋ฉด ์ข…๋ฃŒ๋œ๋‹ค.

์ด๋•Œ ๋ฉ˜ํ† ๋ง์˜ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ ์˜ˆ์•ฝ์˜ ์ƒํƒœ๋„ ๋ณ€๊ฒฝ๋œ๋‹ค.

์˜ˆ์•ฝ์˜ ์ƒํƒœ๋Š” ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด "๋Œ€๊ธฐ/์Šน์ธ/๊ฑฐ์ ˆ/์™„๋ฃŒ"์˜ 4๊ฐ€์ง€ ์ƒํƒœ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

ํ•ด๋‹น ์˜ˆ์•ฝ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ ์˜ˆ์•ฝ์˜ ์ค‘๋ณต ์‚ฝ์ž…์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

 

1. ์˜ˆ์•ฝ์ด ์Šน์ธ๋˜๊ธฐ ์ „, ๋Œ€๊ธฐ ์ƒํƒœ์ธ ๊ฒฝ์šฐ

๋ฉ˜ํ† ๋ง ์Šน์ธ์ด ๋Œ€๊ธฐ ์ค‘์ธ ๊ฒฝ์šฐ, ๋ฉ˜ํ‹ฐ๋Š” ๊ฐ™์€ ๋ฉ˜ํ† ๋ง์œผ๋กœ ์˜ˆ์•ฝ์„ ์‹ ์ฒญํ•  ์ˆ˜ ์—†๋‹ค.

์ด๋•Œ DB์—๋Š” ๋Œ€๊ธฐ ์ƒํƒœ์˜ ์˜ˆ์•ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

2. ์˜ˆ์•ฝ์ด ์Šน์ธ๋˜์–ด ๋ฉ˜ํ† ๋ง์ด ์ง„ํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ

๋ฉ˜ํ† ๋ง์ด ์ง„ํ–‰์ค‘์ธ ๊ฒฝ์šฐ, ๋ฉ˜ํ‹ฐ๋Š” ๊ฐ™์€ ๋ฉ˜ํ† ๋ง์œผ๋กœ ์˜ˆ์•ฝ์„ ์‹ ์ฒญํ•  ์ˆ˜ ์—†๋‹ค.

์ด๋•Œ, DB์—๋Š” ์Šน์ธ ์ƒํƒœ์˜ ์˜ˆ์•ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

3. ์˜ˆ์•ฝ์ด ๊ฑฐ์ ˆ๋œ ๊ฒฝ์šฐ

๋ฉ˜ํ† ๊ฐ€ ์˜ˆ์•ฝ์„ ๊ฑฐ์ ˆํ•˜์—ฌ ๋ฉ˜ํ† ๋ง์ด ์ทจ์†Œ๋œ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๋Š” ๊ฐ™์€ ๋ฉ˜ํ† ๋ง์œผ๋กœ ๋‹ค์‹œ ์˜ˆ์•ฝ์„ ์‹ ์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ, DB์—๋Š” ๊ฑฐ์ ˆ ์ƒํƒœ์˜ ์˜ˆ์•ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ ๊ฐ™์€ ๋ฉ˜ํ‹ฐ๊ฐ€ ๊ฐ™์€ ๋ฉ˜ํ† ๋ง์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ์˜ˆ์•ฝ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ค‘๋ณต ํ—ˆ์šฉ)

 

4. ๋ฉ˜ํ† ๋ง์ด ์ข…๋ฃŒ๋˜์–ด ์˜ˆ์•ฝ์ด ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ

๋ฉ˜ํ† ๋ง์ด ๋๋‚˜๊ณ  ์ •์ƒ ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๋Š” ๊ฐ™์€ ๋ฉ˜ํ† ๋ง์œผ๋กœ ๋‹ค์‹œ ์˜ˆ์•ฝ์„ ์‹ ์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ, DB์—๋Š” ์™„๋ฃŒ ์ƒํƒœ์˜ ์˜ˆ์•ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ ๊ฐ™์€ ๋ฉ˜ํ‹ฐ๊ฐ€ ๊ฐ™์€ ๋ฉ˜ํ† ๋ง์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ์˜ˆ์•ฝ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ค‘๋ณต ํ—ˆ์šฉ)

 

์ •์ฑ… ์ •๋ฆฌ

์ •์ฑ…์„ ์ •๋ฆฌํ•˜๋ฉด ์˜ˆ์•ฝ์˜ ์ƒํƒœ(์™„๋ฃŒ, ๊ฑฐ์ ˆ)์— ๋”ฐ๋ผ์„œ ์กฐ๊ฑด๋ถ€๋กœ ์ค‘๋ณต ์‚ฝ์ž…์ด ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค.

์ฆ‰, ์ง€๊ธˆ๊ณผ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์œผ๋กœ๋Š” ์ข…๋ฃŒ๋œ ์˜ˆ์•ฝ์ด ์กด์žฌํ•ด๋„ ๋‹ค์‹œ ์˜ˆ์•ฝ์„ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

 

ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ ์ถ”๊ฐ€

์ •์ฑ…์— ๋”ฐ๋ผ์„œ ์ค‘๋ณต ํ—ˆ์šฉ์ด ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ชฉํ‘œ๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.

  • ๋™์‹œ์„ฑ์œผ๋กœ ์ธํ•œ ์ค‘๋ณต ์‚ฝ์ž… ํ•ด๊ฒฐ
  • ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ์™€ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ์ ์ ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š”๋‹ค.
  • ์ค‘๋ณต ์‚ฝ์ž…์€ DB ๋ ˆ๋ฒจ์—์„œ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ DB ๋ ˆ๋ฒจ์—์„œ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š”๋‹ค.
  • ๊ตฌํ˜„ ๋‚œ์ด๋„๊ฐ€ ๋„ˆ๋ฌด ๋†’์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š”๋‹ค.
  • + ์˜ˆ์•ฝ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ ์กฐ๊ฑด๋ถ€ ์ค‘๋ณต ์‚ฝ์ž… ํ—ˆ์šฉ

๋‹ค์‹œ, ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

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

๋‹ค์‹œ ์›๋ž˜๋Œ€๋กœ ๋Œ์•„์˜จ ์…ˆ์ด๋‹ค.

synchronized

์ž๋ฐ”์—์„œ synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฉ”์„œ๋“œ์— ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์•ฝ ์ƒ์„ฑ ๋ฉ”์„œ๋“œ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•˜๊ฒŒ ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์˜ ๊ฒ€์ฆ ๋กœ์ง์ธ validateNoOngoinReservation() ์œผ๋กœ ์˜ˆ์•ฝ ์ƒํƒœ๋ฅผ ๊ฒ€์ฆํ•˜์—ฌ ์กฐ๊ฑด๋ถ€ ์ค‘๋ณต ์‚ฝ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋งŒ์•ฝ ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค(์„œ๋ฒ„๊ฐ€ 1๋Œ€)๋ผ๋ฉด ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ์„œ๋ฒ„๊ฐ€ ๋ถ„์‚ฐํ™˜๊ฒฝ์œผ๋กœ ํ™•์žฅ๋˜์–ด ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์—์„œ DB์— ๋™์‹œ ์š”์ฒญ์„ ํ•˜๋ฉด ์ค‘๋ณต ์‚ฝ์ž…์ด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.

synchronized ๋Š” ๋‹จ์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ์˜ ๋™์‹œ ์š”์ฒญ์€ ๋ง‰์„ ์ˆ˜ ์—†๋‹ค.

 

๋˜ ํ•œ ๊ฐ€์ง€ ์ฐ์ฐํ•œ ๋ถ€๋ถ„์€, ์˜ˆ์•ฝ ์ƒํƒœ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋ถ€๋ถ„์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค. DB ๋ ˆ๋ฒจ์—์„œ๋Š” ์—ฌ์ „ํžˆ ์ค‘๋ณต ์‚ฝ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. 

 

ํ˜„์žฌ๋Š” ๋‹จ์ผ ์ธ์Šคํ„ด์Šค์ด๊ณ , ์•ž์œผ๋กœ๋„ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฐฉ์‹์„ ์ฑ„ํƒํ•ด๋„ ๋˜์ง€๋งŒ, ์—ฌ์ „ํžˆ ํ…Œ์ด๋ธ” ์ œ์•ฝ ์กฐ๊ฑด์ด ์•„๋‹ˆ๋ผ DB ์‚ฝ์ž…์€ ๋ง‰์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒํ•˜์ง€ ์•Š์•˜๋‹ค.

๋น„๊ด€์  ๋ฝ

๋น„๊ด€์  ๋ฝ์€ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค.

์ค‘๋ณต ๊ฒ€์ฆ์„ ํ•˜๋Š” ๋กœ์ง์— ๋ฝ์„ ๊ฑธ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋Š”๋ฐ, ๋ฝ์„ ๊ฑธ ์ˆ˜ ์—†๋‹ค.

validateNoOngoingReservation()๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ existsBy ์ฟผ๋ฆฌ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.

๋ฌธ์ œ๋Š” existsBy ๋ฉ”์„œ๋“œ๋Š” ๋ฝ์ด ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. Spring Data JPA์˜ existsBy ๊ณ„์—ด ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹จ์ˆœ SELECT ์กฐํšŒ๋ฅผ ํ•œ๋‹ค.

innoDB๋Š” ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ, ์ผ๋ฐ˜ SELECT ์กฐํšŒ๋Š” MVCC ๊ธฐ๋ฐ˜์˜ ์Šค๋ƒ…์ƒท ์กฐํšŒ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด Row Lock ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ฉ”์„œ๋“œ์— @Lock(LockModeType.PESSIMISTIC_WRITE)์„ ์„ค์ •ํ•ด๋„ ๋ฌด์‹œ๋œ๋‹ค.

๊ทธ๋Ÿผ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฝ์„ ๊ฑธ์–ด์•ผ ํ•œ๋‹ค.

SELECT FOR UPDATE / SELECT FOR SHARE ์ฟผ๋ฆฌ๋กœ ๋ฝ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.

์•ž์„  existsBy ๋ฉ”์„œ๋“œ๋กœ๋Š” ๋ฝ์„ ๊ฑธ ์ˆ˜ ์—†์œผ๋‹ˆ member๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ์— ๋น„๊ด€์  ๋ฝ์„ ๊ฑธ์–ด ์กฐํšŒํ•˜๋„๋ก ํ•œ๋‹ค.

๊ทธ๋Ÿผ SELECT FOR UPDATE ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ ๋ฝ์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฝ์„ ๊ฑธ๊ฒŒ ๋˜๋ฉด ๋‹ค๋ฅธ ์š”์ฒญ์€ ๊ฐ™์€ row์— ๋Œ€ํ•ด์„œ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•ด๋„ ๋ฝ์ด ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๊ฒŒ ๋˜์–ด, ๋™์‹œ์„ฑ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

๋™์‹œ์— ๊ฐ™์€ ์˜ˆ์•ฝ ์š”์ฒญ์„ ๋‘ ๊ฐœ ๋ณด๋‚ด๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋™์‹œ์„ฑ ์ œ์–ด๊ฐ€ ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋น„๊ด€์  ๋ฝ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ„๋ช… ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•˜์—ฌ ์ค‘๋ณต ์˜ˆ์•ฝ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, synchronized ์ฒ˜๋Ÿผ ๋น„๊ด€์  ๋ฝ๋„ ์˜ˆ์•ฝ ํ…Œ์ด๋ธ” ์ž์ฒด์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ์•„๋‹Œ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํ•ด๋‹น ๋ฐฉ์‹์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋”ฐ๋ผ์„œ ๋ฝ์˜ ๋ฒ”์œ„๊ฐ€ ๋‹ฌ๋ผ์ง€๊ณ , ์ค‘๋ณต์˜ˆ์•ฝ์„ ํ—ˆ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋•Œ๋ฌธ์— ๋น„๊ด€์  ๋ฝ๋„ ์„ ํƒํ•˜์ง€ ์•Š์•˜๋‹ค.

๋‚™๊ด€์  ๋ฝ

์ง€๊ธˆ์€ ๋‚™๊ด€์  ๋ฝ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค.

๋‚™๊ด€์  ๋ฝ์˜ version์€ ๊ธฐ์กด์— ์กด์žฌํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์— update ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์นด์šดํŠธ ๋œ๋‹ค.

์˜ˆ์•ฝํ•˜๊ธฐ์˜ ์ƒํ™ฉ์€ ์ค‘๋ณต ์‚ฝ์ž… ๋ฌธ์ œ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‚™๊ด€์  ๋ฝ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ์žˆ๋‹ค.

๋ฌผ๋ก  ํ˜„์žฌ MentroingStastistc๋ฅผ ํ†ตํ•ด์„œ ์˜ˆ์•ฝ ์‹œ ํ†ต๊ณ„ ํ…Œ์ด๋ธ”์— ์˜ˆ์•ฝ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋กœ์ง์„ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ MentroingStastistc์— ๋‚™๊ด€์  ๋ฝ์„ ๊ฑธ์–ด version์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ˆœ์ˆœํ•œ ์˜ˆ์•ฝ๋กœ์ง์—์„œ๋Š” ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค.

 

๋ถ„์‚ฐ ๋ฝ

๋ถ„์‚ฐ ๋ฝ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

ํ˜„์žฌ ์ธ์Šคํ„ด์Šค๋Š” ํ•œ๋Œ€์ง€๋งŒ, ์ถ”ํ›„ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋Š˜์–ด๋‚  ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋•Œ๋„ ์ •๋ง ๋ถ„์‚ฐ ๋ฝ์ด ๋‹ต์ผ๊นŒ? ์ƒ๊ฐํ•ด ๋ดค์„ ๋•Œ๋„ ๊ณ ๋ฏผ์ด ๋œ๋‹ค.

์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ์•„๋ž˜์™€ ๊ฐ™์•˜๋‹ค.

  • ๋‹ค์ค‘ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์–ผ๋งˆ๋‚˜ ๋†’์€๊ฐ€?
  • ๋ถ„์‚ฐ ๋ฝ์— ๋Œ€ํ•œ ์ง€์‹์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ, ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šธ๊นŒ?
  • ํ•ด๋‹น ๋ฌธ์ œ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ตœ์ƒ์ธ๊ฐ€?
  • ์œ ์ง€๋ณด์ˆ˜์— ๋Œ€ํ•œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š”?
  • ํ˜„์žฌ ๋ชฉํ‘œ์— ๋ถ€ํ•ฉํ•˜๋Š” ๊ธฐ์ˆ ์ธ๊ฐ€?

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

 

Generated Column + ๋ณตํ•ฉ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค (์„ ํƒํ•œ ๋ฐฉ๋ฒ•)

์œ„์—์„œ (mentoring_id, mentee_id, status) ์œ ๋‹ˆํฌ ์ œ์•ฝ ์กฐ๊ฑด์€ ์™„์ „ํ•œ ์ค‘๋ณต ์‚ฝ์ž…์„ ๋ง‰์ง€ ๋ชปํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ด์œ ๋Š” ์˜ˆ์•ฝ์ƒํƒœ ์ฆ‰, status ์˜ ์ปฌ๋Ÿผ ๊ฐ’์— ๋”ฐ๋ผ์„œ ์ค‘๋ณต์˜ˆ์•ฝ์ด ํ—ˆ์šฉ๋˜๊ณ , ํ—ˆ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿผ ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฑด ๋ฏธ์™„๋ฃŒ ์ƒํƒœ์—์„œ๋งŒ ์ค‘๋ณต ์˜ˆ์•ฝ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋ ๊นŒ?

์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ ๋‘˜ ๊ฒƒ์ด๋‹ค. ํ•œ ๊ฐ€์ง€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ํŠน์ • ์ƒํƒœ์˜ ์ปฌ๋Ÿผ์„ ์ƒ์„ฑํ•ด์„œ ๊ทธ ์ปฌ๋Ÿผ์œผ๋กœ ๋ณตํ•ฉ ์œ ๋‹ˆํฌ๋ฅผ ๋งŒ๋“ค์–ด ์ค„ ๊ฒƒ์ด๋‹ค.

์ด ๋ฐฉ์‹์€ ๋ถ€๋ถ„ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค ๋ฐฉ์‹์ด๋ผ๊ณ ๋„ ํ•˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ด๋Ÿฐ ์‹์ด๋‹ค.

status๊ฐ€ PENDING/APPROVED์ผ ๋•Œ๋งŒ (mentee_id, mentoring_id) ์ค‘๋ณต ๊ธˆ์ง€

์•ˆํƒ€๊น๊ฒŒ๋„ PostgreSQL๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ •์‹์ง€์›ํ•˜์ง€๋งŒ, MySQL์—์„œ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์•„์„œ ๋ฌธ๋ฒ•์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋‹ค.

๋Œ€์‹  ๋น„์Šทํ•˜๊ฒŒ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

Generated Column + ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค ์กฐํ•ฉ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Generated Column

Generated Column ์€ MySQL 5.7 ๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

MySQL ๊ณต์‹ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ์ƒ์„ฑ ์ปฌ๋Ÿผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

๋‹ค๋ฅธ ์ปฌ๋Ÿผ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ๊ณ„์‚ฐ๋˜๋Š” ์ปฌ๋Ÿผ์ด๋‹ค.

Generated Column ์€ ์ง์ ‘ ๊ฐ’์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ DB๊ฐ€ ์ž๋™ ๊ณ„์‚ฐํ•ด์„œ ๊ฐ€์ง€๋Š” ์ปฌ๋Ÿผ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด price, quantity ์ปฌ๋Ÿผ์ด ์žˆ์„ ๋•Œ total_price = price * quantity ์ผ ๋•Œ total_price๊ฐ€ Generated Column์ด ๋œ๋‹ค.

์ค‘์š”ํ•œ ๊ฑด total_price์˜ ๊ฐ’์€ ์‚ฌ๋žŒ์ด ๋„ฃ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ DB๊ฐ€ ๊ณ„์‚ฐํ•ด์„œ ๋„ฃ๋Š”๋‹ค.

 

๊ทœ์น™

Generated Column์€ MySQL์—์„œ ์ •ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ทœ์น™์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ์ค‘ ์ค‘์š”ํ•œ ๋ช‡ ๊ฐ€์ง€๋งŒ ์‚ดํŽด๋ณด์ž.

 

1. ๊ฒฐ์ •์ (deterministic)์ด์–ด์•ผ ํ•œ๋‹ค.

ํ•ญ์ƒ ๊ฐ™์€ ์ž…๋ ฅ์— ๋Œ€ํ•œ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. Generated Column์€ ๊ณ„์‚ฐ ์ „์šฉ ์ปฌ๋Ÿผ์ด๋‹ค. NOW() ๊ฐ™์ด ๋ณ€ํ•˜๋Š” ์š”์†Œ๋Š” ํ•ญ์ƒ ๊ธˆ์ง€ํ•œ๋‹ค.

 

2. INSERT / UPDATE ์‹œ ๊ฐ’ ์ง์ ‘ ๋„ฃ๊ธฐ ๊ธˆ์ง€

Generated Column์€ ์ง์ ‘ ๊ฐ’์„ ๋„ฃ๋Š” ์ปฌ๋Ÿผ์ด ์•„๋‹ˆ๋‹ค. DEFAULT๋ฅผ ์ œ์™ธํ•œ ์ง์ ‘ ๊ฐ’์„ ๋„ฃ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

3. AUTO_INCREMENT ์‚ฌ์šฉ ๋ถˆ๊ฐ€

์ž๋™ ์ฆ๊ฐ€ ๊ฐ’์€ "์ƒํƒœ"์ด๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ˆ˜ ๊ณ„์‚ฐ์ด ์•„๋‹ˆ๋‹ค.

 

๊ตฌ์กฐ

Generated Column ์€ VIRTUAL ์ปฌ๋Ÿผ๊ณผ STORED ์ปฌ๋Ÿผ, ๋‘ ๊ฐ€์ง€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ๊ฐ๊ฐ์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ตฌ๋ถ„ VIRTUAL STORED
๊ฐœ๋… ์กฐํšŒํ•  ๋•Œ๋งˆ๋‹ค ๊ณ„์‚ฐ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด์„œ ์ €์žฅ
๊ณ„์‚ฐ ์‹œ์  SELECT ์‹œ INSERT / UPDATE ์‹œ
๋””์Šคํฌ ๊ณต๊ฐ„ ์‚ฌ์šฉ ์•ˆ ํ•จ ์‚ฌ์šฉํ•จ
์กฐํšŒ ์†๋„ ๋А๋ฆด ์ˆ˜ ์žˆ์Œ (๋งค๋ฒˆ ๊ณ„์‚ฐ) ๋น ๋ฆ„ (์ด๋ฏธ ๊ณ„์‚ฐ๋จ)
์ €์žฅ ๋น„์šฉ ์—†์Œ ์žˆ์Œ
CPU ์‚ฌ์šฉ๋Ÿ‰ ์กฐํšŒ ์‹œ ์ฆ๊ฐ€ ์ž…๋ ฅ/์ˆ˜์ • ์‹œ ์ฆ๊ฐ€
์ธ๋ฑ์Šค ๊ฐ€๋Šฅ(InnoDB) ๊ฐ€๋Šฅ

๋ณ„๋‹ค๋ฅธ ์ง€์ •์„ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ VIRTUAL์ด๋‹ค.

 

๊ตฌํ˜„

Reservation ์—”ํ‹ฐํ‹ฐ์— Generated Column์„ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

ํ•ด๋‹น ์ปฌ๋Ÿผ์€ Generated Column์˜ ๊ทœ์น™์— ๋”ฐ๋ผ์„œ INSERT/UPDATE๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ @Column ์–ด๋…ธํ…Œ์ด์…˜์˜ ์˜ต์…˜์œผ๋กœ ๋ง‰์•„์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ์Šคํ‚ค๋งˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ Flyway๋กœ ํ•˜๊ณ  ์žˆ์œผ๋‹ˆ Flyway ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋„ ์ถ”๊ฐ€ํ•œ๋‹ค.

active_status_checker ๋ผ๋Š” ๊ฐ€์ƒ ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ์ปฌ๋Ÿผ์€ ์‹ค์ œ๋กœ DB์— ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ์กฐํšŒํ•  ๋•Œ ๊ณ„์‚ฐ๋œ๋‹ค.

status ์ปฌ๋Ÿผ์˜ ๊ฐ’์— ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

status ๊ฐ’ active_status_checker ๊ฒฐ๊ณผ
PENDING ACTIVE
APPROVED ACTIVE
COMPLETE NULL
REJECTED NULL

์ง„ํ–‰ ์ค‘ ์ƒํƒœ(PENDING, APPROVDED) -> 'ACTIVE' ๊ฐ’์œผ๋กœ ์ ์šฉ

์ข…๋ฃŒ ์ƒํƒœ (COMPLETE, REJECTED) -> NULL ์ฒ˜๋ฆฌ

์ถ”๊ฐ€๋กœ ์˜ˆ์•ฝ(Reservation)์€ Soft Delete ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋ฏ€๋กœ ์‚ญ์ œ๋ผ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์•„์žˆ๊ฒŒ ๋œ๋‹ค.

์‚ญ์ œ๋œ ์˜ˆ์•ฝ์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Soft Delete์˜ ์ƒํƒœ๋ฅผ ์กฐ๊ฑด์— ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

์œ ๋‹ˆํฌ ์ œ์•ฝ ์กฐ๊ฑด์€ NULL์€ ์ค‘๋ณต ํ—ˆ์šฉ์ด๋ผ๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด์„œ

์ง„ํ–‰ ์ค‘ ์˜ˆ์•ฝ์€ ์ค‘๋ณต ๊ธˆ์ง€, ์ข…๋ฃŒ๋œ ์˜ˆ์•ฝ์€ ์ค‘๋ณต ํ—ˆ์šฉ์ด๋ผ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ์ •์ฑ…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ๋ณตํ•ฉ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

(mentee_id, mentoring_id, active_status_checker)๋ฅผ ๋ณตํ•ฉ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋กœ ์ง€์ •ํ•ด 3๊ฐœ์˜ ์ปฌ๋Ÿผ ์กฐํ•ฉ์ด ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก DB๋ ˆ๋ฒจ์—์„œ ๊ฐ•์ œํ•œ๋‹ค.

์„œ๋น„์Šค ๋กœ์ง๋„ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค.

before

์ด๋žฌ๋˜ ์ฝ”๋“œ๊ฐ€

์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.

 

๊ธฐ์กด์˜ ๊ฒ€์ฆ ๋กœ์ง validateNoOngoingReservation()์ด ์ œ๊ฑฐ๋˜๊ณ , reservationRepository.save()์‹œ์— active_status_checker ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ๊ณ„์‚ฐ๋˜์–ด ์ค‘๋ณต ์˜ˆ์•ฝ์„ ๊ฒ€์ฆํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์™ธ(DataIntegrityViolationException)๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ ์ ˆํ•˜๊ฒŒ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.

 

DataIntegrityViolationException ๋Š” DB ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋‹ค. ํ•ด๋‹น ์˜ˆ์™ธ๋งŒ ์žก์•„์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฌด๊ฒฐ์„ฑ ๋ฌธ์ œ(์˜ˆ: FK/NOT NULL/๊ธฐํƒ€ UNIQUE)๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ “์ด๋ฏธ ์˜ˆ์•ฝ๋จ”์œผ๋กœ ์ž˜๋ชป ์•ˆ๋‚ด๋œ๋‹ค.

ํ•ด๋‹น ๋กœ์ง์—์„œ ์žกํžˆ๋Š” ์˜ˆ์™ธ๋Š” ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ์•„๋‹Œ, ์ค‘๋ณต ์˜ˆ์•ฝ์— ๋Œ€ํ•œ ์˜ˆ์™ธ๋งŒ ์žก์•„์•ผ ํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ ์˜ˆ์™ธ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์žก๊ธฐ ์œ„ํ•ด์„œ DataIntegrityViolationException ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด "์ค‘๋ณต ์˜ˆ์•ฝ"์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ธ์ง€ ํ•œ๋ฒˆ ๋” ๊ฒ€์ฆํ•ด์„œ

uk_active_reservation ์ œ์•ฝ ์œ„๋ฐ˜์ผ ๋•Œ๋งŒ ์ค‘๋ณต ์˜ˆ์•ฝ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋„๋ก ์˜ˆ์™ธ์˜ ๋ฒ”์œ„๋ฅผ ์ขํ˜”๋‹ค.

 

 

๊ฒฐ๊ณผ ๊ฒ€์ฆ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•ด ๋ณด์ž. ๊ฒ€์ฆ์˜ ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋™์‹œ์„ฑ ์ œ์–ด๊ฐ€ ์ž˜ ๋˜๋Š”์ง€
  • ํ•ดํ”ผ ์ผ€์ด์Šค์™€ ์˜ˆ์™ธ ์ผ€์ด์Šค ๋ชจ๋‘ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€

๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค. (ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์„œ ๋”ฐ๋กœ ์ฒจ๋ถ€ํ•˜์ง€ ์•Š๊ฒ ๋‹ค)

ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์€ Java์—์„œ ์ œ๊ณตํ•˜๋Š” ExecutorService ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์‹œ ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค.

์ค‘๋ณต ์˜ˆ์•ฝ ํ…Œ์ŠคํŠธ์™€ ํ•จ๊ป˜ ์ •์ƒ์ ์ธ ๊ฒฝ์šฐ์˜ ํ…Œ์ŠคํŠธ๋„ ๋ชจ๋‘ ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์„ ํƒํ•œ ๋ฐฉ๋ฒ•

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

ํ•˜์ง€๋งŒ, ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ ์˜ˆ์•ฝ ์ƒํƒœ(Status)์— ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ€ ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ, DB์˜ ๊ฐ€์ƒ ์ปฌ๋Ÿผ ์ •์˜(active_status_checker)๋„ ํ•จ๊ป˜ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค.

๋˜ํ•œ, ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ MySQL์— ์ข…์†๋œ ๋ฐฉ๋ฒ•์ด๋ผ ๋‹ค๋ฅธ DB๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ˜ธํ™˜์„ฑ์„ ๋”ฐ์ ธ๋ด์•ผ ํ•œ๋‹ค. ํ˜„์žฌ๋Š” MySQL์—์„œ ๋‹ค๋ฅธ DB๋กœ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ์„ ํƒํ–ˆ๋‹ค.

 

๋”ฐ๋‹ฅ ์ด์Šˆ๋Š” ๋ฌด์กฐ๊ฑด ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ธ๊ฐ€?

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋”ฐ๋‹ฅ ์ด์Šˆ๋ฅผ ๋ฌด์กฐ๊ฑด ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ธ๊ฐ€? ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฌธ์ œ๋ผ๊ณ  ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋งž์ง€๋งŒ, ๋„๋ฉ”์ธ ์ •์ฑ…, ๊ทธ๋•Œ์˜ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ์ถฉ๋ถ„ํžˆ ์„ ํƒ์ง€๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋Œ“๊ธ€ ์“ฐ๊ธฐ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ๋„ ๋”ฐ๋‹ฅ ์ด์Šˆ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ๋„ ๋ง‰์•„์•ผ ํ• ๊นŒ?

๋Œ“๊ธ€ ์“ฐ๊ธฐ ๊ฐ™์€ ๊ฒฝ์šฐ ๋”ฐ๋‹ฅ์œผ๋กœ ์ธํ•œ ์ค‘๋ณต ์‚ฝ์ž…์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ •์ฑ…์ƒ ์ค‘๋ณต ๋Œ“๊ธ€์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ ๋”ฐ๋‹ฅ ํด๋ฆญ์ด์ง€๋งŒ, ๊ผญ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. ํ•ด๋‹น ์ƒํ™ฉ์—์„œ ๋จผ์ € ํ•ด์•ผ ํ•  ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ๋ถ€ํ„ฐ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋งŒ์•ฝ ๊ทธ๋ž˜๋„ ๋ฌธ์ œ๋ฅผ ๋ง‰์•„์•ผ๊ฒ ๋‹ค๋ฉด, ์šฐ์„ , ํด๋ผ์ด์–ธํŠธ์™€ ํ˜‘์˜๋ฅผ ํ†ตํ•ด์„œ 1๋ฒˆ๋งŒ ํด๋ฆญ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ œํ•œ์„ ๋‘˜ ๊ฒƒ ๊ฐ™๋‹ค.

 

์ด ์ฒ˜๋Ÿผ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ๋Œ€ํ•  ๊ฒƒ์ธ์ง€ ๊ณ ๋ฏผํ•˜๋Š” ๊ฒƒ๋„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ค‘์š”ํ•œ ๋•๋ชฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

'๊ฐœ๋ฐœ > ๊ธฐ์ˆ ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์›น์†Œ์ผ“ ์—ฐ๊ฒฐ์—์„œ ์ฟ ํ‚ค๊ฐ€ ์—†์–ด ๋ณด์˜€๋˜ ์ด์œ   (0) 2026.05.18
์ง€์—ฐ๋กœ๋”ฉ์€ ์กฐ์‹ฌํžˆ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค  (0) 2026.01.11
RestAssured์˜ Jackson ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ(feat. Spring Boot 4.0.0)  (0) 2025.11.30
Spring Boot ํ…Œ์ŠคํŠธ์—์„œ ์ปค๋„ฅ์…˜ ๊ณ ๊ฐˆ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•  (1) 2025.11.17
QueryDSL์˜ hibernate ๋ฒ„์ „ ๋ถˆ์ผ์น˜๋กœ ์ธํ•œ ์˜ˆ์™ธ ๋ฐœ์ƒ  (0) 2025.11.02
'๊ฐœ๋ฐœ/๊ธฐ์ˆ ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ์›น์†Œ์ผ“ ์—ฐ๊ฒฐ์—์„œ ์ฟ ํ‚ค๊ฐ€ ์—†์–ด ๋ณด์˜€๋˜ ์ด์œ 
  • ์ง€์—ฐ๋กœ๋”ฉ์€ ์กฐ์‹ฌํžˆ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค
  • RestAssured์˜ Jackson ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ(feat. Spring Boot 4.0.0)
  • Spring Boot ํ…Œ์ŠคํŠธ์—์„œ ์ปค๋„ฅ์…˜ ๊ณ ๊ฐˆ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
.๋„๊ธฐ
.๋„๊ธฐ
๐Ÿฅ ๐Ÿ’ป https://github.com/dye0p
  • .๋„๊ธฐ
    ๐Ÿฅ
    .๋„๊ธฐ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (24)
      • ๊ฐœ๋ฐœ (23)
        • ๊ธฐ์ˆ  (13)
        • ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค (10)
      • ์ผ์ƒ (1)
        • ์ฑ… (0)
  • ๋งํฌ

    • github
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๊ธ€์“ฐ๊ธฐ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    JPA
    7๊ธฐ
    Spring Context Caching
    Persistenct Context
    ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ
    db
    ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค
    spring
    ๋”ฐ๋‹ฅ ์ด์Šˆ
    ์ตœ์ข… ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    mysql
    ํšŒ๊ณ 
    ์ตœ์ข… ํ•ฉ๊ฒฉ
    ๋ฐฑ์—”๋“œ
    Hibernate
    ๊ธ€์“ฐ๊ธฐ ๋ฏธ์…˜
    ์ž๋ฐ”
    ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค
    java
    ์šฐํ…Œ์ฝ”
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
.๋„๊ธฐ
๋”ฐ๋‹ฅ ํด๋ฆญ๋งŒ ๋ง‰์œผ๋ฉด ๋๋‚  ์ค„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”