๊ฐœ๋ฐœ ๊ณต๋ถ€/Spring

[ํ”Œ๋žญ๊ณ ] JPA delete() แ„แ…ฏแ„…แ…ต แ„‹แ…กแ†ซ แ„‚แ…กแ„€แ…กแ„‚แ…ณแ†ซ แ„†แ…ฎแ†ซแ„Œแ…ฆ แ„’แ…ขแ„€แ…งแ†ฏ

gmelon 2023. 9. 28. 12:48

๐Ÿ’ฅ ๋ฌธ์ œ ์ƒํ™ฉ

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 ์ฟผ๋ฆฌ๊ฐ€ ๋‚˜๊ฐ€๋„๋ก ๊ตฌ์„ฑํ•ด๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

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

แ„แ…ฆแ„‰แ…ณแ„แ…ณแ„‹แ…ฆแ„‰แ…ฅแ„†แ…กแ†ซ @Async แ„Œแ…ฅแ†จแ„‹แ…ญแ†ผแ„ƒแ…ฌแ„Œแ…ต แ„‹แ…กแ†ญแ„ƒแ…ฉแ„…แ…ฉแ†จ แ„’แ…กแ„€แ…ต  (0) 2023.12.27
[แ„‘แ…ณแ†ฏแ„…แ…ขแ†ผแ„€แ…ฉ] ์ฃผ์š”/๋ถ€๊ฐ€ ๋กœ์ง แ„แ…ณแ„…แ…ขแ†ซแ„Œแ…ขแ†จแ„‰แ…งแ†ซ แ„‡แ…ฎแ†ซแ„…แ…ตแ„’แ…กแ„€แ…ต - TransactionalEventListenerแ„‹แ…ช REQUIRES_NEW  (0) 2023.11.27
[ํ”Œ๋žญ๊ณ ] JPQL fetch join + whereแ„Œแ…ฅแ†ฏ แ„‰แ…กแ„‹แ…ญแ†ผ แ„‡แ…กแ†ผแ„‡แ…ฅแ†ธแ„€แ…ช แ„Œแ…ฉแ„€แ…ฅแ†ซ  (0) 2023.08.29
[ํ”Œ๋žญ๊ณ ] แ„‹แ…ตแ†ฏแ„ƒแ…ขแ„‹แ…ตแ†ฏแ„‹แ…ฆแ„‰แ…ฅ แ„‹แ…ตแ†ฏแ„ƒแ…ขแ„ƒแ…กแ„…แ…ฉ แ„‡แ…งแ†ซแ„€แ…งแ†ผ แ„‰แ…ต validation แ„€แ…ชแ†ซแ„…แ…งแ†ซ แ„†แ…ฎแ†ซแ„Œแ…ฆ (Custom ConstraintValidator)  (0) 2023.08.23
[ํ”Œ๋žญ๊ณ ] แ„‰แ…ณแ„‘แ…ณแ„…แ…ตแ†ผ แ„‰แ…ตแ„แ…ฒแ„…แ…ตแ„แ…ต แ„‰แ…ตแ†ฏแ„‘แ…ข แ„’แ…ขแ†ซแ„ƒแ…ณแ†ฏแ„…แ…ฅ แ„‹แ…ฆแ„‰แ…ฅ แ„Œแ…ตแ†จแ„Œแ…ฅแ†ธ แ„‹แ…จแ„‹แ…ฌแ„…แ…ณแ†ฏ แ„ƒแ…ฅแ†ซแ„Œแ…ตแ„†แ…งแ†ซ แ„‹แ…กแ†ซ แ„ƒแ…ฌแ„‚แ…ณแ†ซ แ„‹แ…ตแ„‹แ…ฒ  (0) 2023.08.20