์ฐ์ ๋ถ๋ชจ์ํฐํฐ์ ์์ ์ํฐํฐ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
Ticketing ๊ณผ SelectedSeat์ 1:N ์ฐ๊ด๊ด๊ณ ๋งคํ์ด ๋งบ์ด์ ธ์๋ค.
cascade.REMOVE ์ต์ ์ ๊ฑธ์ด ํฐ์ผ ์๋งค๋ฅผ ์ทจ์ํ ๊ฒฝ์ฐ SelectedSeat๋ ์ญ์ ํ ์๊ฐ์ด์๊ณ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค.
ํ์ง๋ง selectedSeat์ ์ฐธ์กฐ ์๋ฌ๊ฐ ํฐ์ก๋ค.
Cannot delete or update a parent row: a foreign key constraint fails (`tickerBellDB`.`selected_seat`, CONSTRAINT `FKsfrjmwj259n0yrhm0f0idjnrc` FOREIGN KEY (`ticketing_id`) REFERENCES `ticketing` (`ticketing_id`))
์ฟผ๋ฆฌ๋ฅผ ์ดํด๋ณด๋ SelectedSeat์ delete ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ์ง ์๊ณ ๋ฐ๋ก ticketing delete ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๋ค.
์ด๊ฒ์ ๊ฒ ํด๋ณด๋ค๊ฐ ํด๊ฒฐ๋์ง ์์ ๋ช ์์ ์ผ๋ก SelectedSeat์ ๋ํ delete ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค๋ณด์๋ค. ํ์ง๋ง ๊ทธ๋๋ delete ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ์ง ์์๋ค.
orphanRemove๋ ๋ถ์ฌ๋ณด๊ณ ์ด๊ฒ์ ๊ฒ ๋ง ์๋ํ๋ค ticketing์ด ์์์ฑ ์ปจํ ์คํธ์ ์ฌ๋ผ๊ฐ์๋๋ฐ selectedSeat๊ณผ ์ฐ๊ด๊ด๊ณ๊ฐ ๋งบ์ด์ ธ์๋ ์ํ๋ผ SelectedSeat delete ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ์ง ์๋๊ฑธ๊น? ํ๋ ์๊ฐ์ด ๋ค์๋ค.
์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด ์์์ฑ ์ปจํ ์คํธ์ ์ฌ๋ผ๊ฐ์๋ ticketing์์ SelectedSeat๊ณผ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋์ด๋ณด์๋ค.
ticketing.setSelectedSeatList(null);
์ด๋ ๊ฒ ํ๋ delete ์ฟผ๋ฆฌ๊ฐ ์ ์์ ์ผ๋ก ์ ๋๊ฐ๋ค.
๋์ ์๊ฐ์ด ๋ง์๋..? ์์์ฑ ์ปจํ ์คํธ์ ์ฌ๋ผ๊ฐ์๋ Ticketing์ SelectedSeat๊ณผ ์ฐ๊ฒฐ๋์ด ์๋๋ฐ, SelectedSeat์ ์ญ์ ํ๋ คํ๋ ์ฟผ๋ฆฌ๊ฐ ์ ๋๋ก ๋๊ฐ์ง ์์๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ๊น์ง ์ดํด๊ฐ ๋๋๋ฐ ๊ทธ๋ ๋ค๋ฉด cascade.REMOVE ์ต์ ์ ์ฌ์ฉํ์ง ๋ชป ํ๋๊ฑด๊ฐ? ์ ๋ํ ์๋ฌธ์ด ํ๋ฆฌ์ง ์์๋ค.
์๋ ์ฝ๋๋ ๋ช ์์ ์ผ๋ก ์ญ์ ํ ๋ ํ๋ ๊ฒ ์ฒ๋ผ ์ฐ๊ด๊ด๊ณ๋ฅผ null๋ก ํด์ฃผ๊ณ ticketing ์ ์ญ์ ํด ๋ณด์์ง๋ง ์ฌ์ ํ ์๋ฌ๊ฐ ๋ด๋ค.
์ฝ์ง ๋์ ๋ต์ ์ฐพ์๋ค.
๋ฌธ์ ์ ์์ธ์ด ๋๋ ๋ถ๋ถ์ deleteByMemberAndTicketing ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒ์ด์๋ค. deleteByMemberAndTicketing์ ๊ตฌํ ๋ด์ฉ์ ์๋์ ๊ฐ๋ค. @Modifying๊ณผ @Query๋ฅผ ์ฌ์ฉํ๊ฒ ์์ธ์ด์๋ค.
@Modifying, @Query
@Modifying
- @Query ์ด๋ ธํ ์ด์ (JPQL Query, Native Query)์ ํตํด ์์ฑ๋ INSERT, UPDATE, DELETE(SELECT ์ ์ธ) ์ฟผ๋ฆฌ์์ ์ฌ์ฉ๋๋ ์ด๋ ธํ ์ด์
@Query
- @Query๋ก ์ ์๋ ๋ฒํฌ ์ฐ์ฐ JPQL์ ๊ธฐ์กด JPA์ฒ๋ผ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๊ฑฐ์ณ ์ฐ๊ธฐ์ง์ฐSQL๋ก ๋์ํ๋ ๊ฒ์ด ์๋ ๋ฐ๋ก Database์ ์ง์๋ฅผ ํจ.
๋ณดํต JPA๋ ์ฐ๊ธฐ์ง์ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ์ด ๋๋๋ ํ์ด๋ฐ, ์ฆ ๋ฉ์๋๊ฐ ๋๋ ๋ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ, ์๋ ์ฝ๋์์ "1" , "2" ๊ฐ ์ฐํ๊ณ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ์ง๋ง @Query๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ "1" ์ด ๋จผ์ ์ฐํ๊ณ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ์ ์์ํ ์ ์์๋ค.
๋ก๊ทธ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
์ ๋ฆฌํด๋ณด๋ฉด..
JPA์ cascade ์ต์ ์ DB์๋ ๋ณ๊ฐ์ด๋ค. (DDL์ ํ์ธํด๋ดค์ ๋ ๋ฐ๋ก ์ ์ฝ์กฐ๊ฑด์ด ์กด์ฌํ์ง ์์์)
๋ฐ๋ผ์ JPA cascade์ต์ ์ ์ ๋๋ก ์ฌ์ฉํ๊ธฐ ์ํด์ ์์์ฑ ์ปจํ ์คํธ์์ ์ญ์ ์์ ์ด ์ด๋ค์ ธ์ผ ํ๋ค๋ ๋ป์ด๋ค. ์ฆ em.remove()๋ก ๋ถ๋ชจ ์ํฐํฐ๊ฐ ์ ๊ฑฐ๋์ผ ์์ ์ํฐํฐ๋ cascade ์ต์ ์ผ๋ก ์ ๊ฑฐ๋ ์ ์๋ ๊ฒ ๊ฐ๋ค.
ํ์ง๋ง @Query ์ด๋ ธํ ์ด์ ๊ฐ์ ๊ฒฝ์ฐ ์ฐ๊ธฐ์ง์ฐSQL๋ก ๋์ํ๋ ๊ฒ์ด ์๋ ๋ฐ๋ก Database์ ์ง์๋ฅผ ํ๊ธฐ ๋๋ฌธ์ DB์์ ๋ฐ๋ก ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์ ๊ฑฐํด๋ฒ๋ ธ๊ณ ๊ทธ ์ฆ์ ์์ ์ํฐํฐ์์ ์ฐธ์กฐ ์๋ฌ๊ฐ ํฐ์ง ๊ฒ์ด์๋ค.
@Query ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ์ญ์ ๋ก์ง ๋ง๊ณ JPA์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ delete() ๋ฉ์๋๋ฅผ ํตํด ์ญ์ ํ์ฌ ํด๋น ์๋ฌ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
'Spring Boot, JAVA ๐ฑ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ ์คํธ ์ฝ๋์ ๋ํ ์ ๋ฆฌ ๋ฐ ๊ณ ๋ฏผ ๊ธฐ๋ก (1) | 2023.10.29 |
---|---|
JAVA ๋ฉ๋ชจ๋ฆฌ ๋์ ์ฒดํฌ ๋ฐ JVM ๋ชจ๋ํฐ๋ง (0) | 2023.10.12 |
OSIV ํํค์น๊ธฐ - sse ๊ตฌํ ์ค HikariPool-1 - Connection is not available ์๋ฌ (1) | 2023.10.07 |
[spring batch] ์คํ๋ง ๋ฐฐ์น์ ์ค์ผ์ค๋ฌ์ ์ฐจ์ด (0) | 2023.10.03 |
[spring batch] ์คํ๋ง ๋ฐฐ์น ์ดํดํ๊ณ ์ ์ฉํ๊ธฐ (0) | 2023.10.01 |