๐ฅ ๋ฌธ์ ์ํฉ
JPA๋ฅผ ์ฌ์ฉํ๋ค๊ฐ xxxRepository.delete(Entity entity)
๋ฉ์๋๋ฅผ ํตํด ์ํฐํฐ๋ฅผ ์ญ์ ํ๊ณ ์ถ์๋๋ฐ ์๋ฌด๋ฆฌ ํด๋ delete ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์ง ์๋ ๋ฌธ์ ๊ฐ ์์๋ค.
์ํฐํฐ ์ญ์ ์ฝ๋
@Transactional
public void rejectOrExitSchedule(Long memberId, Long scheduleId) {
Schedule schedule = findScheduleById(scheduleId);
validateMemberNotOwner(memberId, schedule);
ScheduleMember scheduleMember = findScheduleMemberByMemberIdAndScheduleId(memberId, scheduleId);
scheduleMemberRepository.delete(scheduleMember);
}
ํ ์คํธ ์ฝ๋

ํ ์คํธ ์คํ ๊ฒฐ๊ณผ

์ํฐํฐ ๋ง๊ณ id๋ฅผ ์ธ์๋ก ๋ฐ๋ ๋ฉ์๋๋ฅผ ํตํด ์ ๊ฑฐ๋ฅผ ์๋ํด๋ JPA ๊ตฌํ์ฒด ๋ด๋ถ์์๋ ๋ค์ delete()๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ง์ฐฌ๊ฐ์ง ๊ฒฐ๊ณผ๊ฐ ๋์๋ค.
id๋ฅผ ์ธ์๋ก ๋ฐ๋ ๋ฉ์๋๋ฅผ ํตํด ์ ๊ฑฐ๋ฅผ ์๋

๊ฒฐ๊ตญ ๋ค์๊ณผ ๊ฐ์ด JPQL๋ก ์ง์ delete ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ๋ฉ์๋๋ฅผ ์์ฑํ๊ณ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์์๋ก ํด๊ฒฐํ๊ธด ํ์ง๋ง, ์ ์ด๋ฌํ ํ์์ด ๋ฐ์ํ๋์ง ์ดํด๊ฐ ๋์ง ์์ ์์ธ์ ์ฐพ์๋ณด์๋ค.
๋ ํฌ์งํ ๋ฆฌ JPQL ์ฝ๋

delete ๋ฉ์๋ ํธ์ถ
...
scheduleMemberRepository.deleteByMemberIdAndScheduleId(memberId, scheduleId);
...
์คํ ๊ฒฐ๊ณผ

๐ฉบ ์์ธ
์ฌ๊ธฐ์ ๊ธฐ ๊ฒ์ํด๋ณด๋ ์์ธ๋ก ์ ์๋ ค์ง ๋ฌธ์ ์ฌ์ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์๋ค. ๋ฌธ์ ์ ์์ธ์ ์์์ฑ ์ปจํ ์คํธ์ ์ญ์ ํ๋ ค๋ ์ํฐํฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ๋ ๋ค๋ฅธ ์ํฐํฐ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด์๋ค.
์ญ์ ํ๋ ค๊ณ ํ๋ ์ํฐํฐ๋ ์ผ์ ์ ์ฐธ์ฌํ๋ ํ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ScheduleMember
์ํฐํฐ์ด๊ณ , ์ด ์ํฐํฐ๋ ์ผ์ ์ํฐํฐ์ธ Schedule
๊ณผ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ๋๋ค.
์ํฐํฐ ์ฐ๊ด๊ด๊ณ

๋ฐ๋ผ์, ์์ ์ดํด๋ณธ ๋ฌธ์ ์ ์ฝ๋์์ ๊ฒ์ฆ ๋ก์ง ์ํ์ ์ํด Schedule(ScheduleMember๋ฅผ fetch join ํจ)์ ๋จผ์ ์กฐํํ๊ฒ ๋๋ฉด ์์์ฑ ์ปจํ ์คํธ์ Schedule ์ํฐํฐ๊ฐ ์ฌ๋ผ๊ฐ๊ฒ ๋๊ณ , ์ดํ ScheduleMember๋ฅผ ์กฐํํ๋ฉด ์ด๋ฏธ ์์์ฑ ์ปจํ ์คํธ์ ๋์ผ id์ ScheduleMember๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ select ์ฟผ๋ฆฌ ์์ด ์บ์์์ ์ํฐํฐ๊ฐ ์กฐํ๋๋ค.

๋๋ฒ๊น
์ ํตํด ์ฐธ์กฐ๊ฐ์ ํ์ธํด๋ณด๋ฉด Schedule์ List<ScheduleMember>
์ ํฌํจ๋ ScheduleMember์ ์ดํ์ ์กฐํํ ScheduleMember๊ฐ ๋์ผํ ์ธ์คํด์ค์์ ํ์ธํ ์ ์๋ค.

๐จ ํด๊ฒฐ ๋ฐฉ์
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ delete() ๋ฉ์๋ ํธ์ถ ์ ์ ๋ค๋ฅธ ์ํฐํฐ์์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋์ด์ฃผ๋ฉด ๋๋ค. ์ด ๊ฒฝ์ฐ Schedule์ ๋ฆฌ์คํธ์์ ScheduleMember๋ฅผ ์ ๊ฑฐํด์ฃผ๋ฉด ์ ์์ ์ผ๋ก delete ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Schedule
๋ค์๊ณผ ๊ฐ์ด Schedule์ scheduleMembers ๋ฆฌ์คํธ์์ ์ฃผ์ด์ง ScheduleMember์ ์ ๊ฑฐํ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ,
public void deleteScheduleMember(ScheduleMember scheduleMember) {
scheduleMembers.remove(scheduleMember);
}
์๋์ ๊ฐ์ด delete ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๊ธฐ ์ ์ ํธ์ถํด์ฃผ๋ฉด,

repository.delete()
๋ฉ์๋๋ฅผ ํตํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ๋๋ก delete ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

๋ง์ง๋ง์ผ๋ก, ์ด๋ฐ์์ผ๋ก Schedule์์ ScheduleMember๋ฅผ ์ ๊ฑฐํ๋๋ก ๊ตฌํํ ๊ฑฐ๋ฉด orphanRemoval ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ๋ณ๋๋ก ScheduleMemberRepository์ delete ๋ฉ์๋
๋ฅผ ํธ์ถํ์ง ์๊ณ Schedule์ deleteScheduleMember()
๋ง ํธ์ถํด๋ delete ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๋๋ก ๊ตฌ์ฑํด๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.