๋์ ์ฝ์ ์ด์(๋ฐ๋ฅ ์ด์)
๊ฐ๋ ๋ฐ ๋ฌธ์ ์
๋ฐ๋ฅ ์ด์๋ ์ฌ์ฉ์๊ฐ ์ด๋ค ๋ฒํผ์ ๋์์ ์ฌ๋ฌ ๋ฒ ํด๋ฆญํด์ ๋์ผํ 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

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๋ ๋ฒจ์์ ๊ฐ์ ํ๋ค.
์๋น์ค ๋ก์ง๋ ๋ณ๊ฒฝ์ด ํ์ํ๋ค.

์ด๋ฌ๋ ์ฝ๋๊ฐ

์ด๋ ๊ฒ ๋ณ๊ฒฝ๋์๋ค.
๊ธฐ์กด์ ๊ฒ์ฆ ๋ก์ง 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 |
