๐Ÿชฆ JPA Soft Delete

ddongseopยท2023๋…„ 11์›” 28์ผ
0

โœ… Soft Delete?

  • ์šฐ๋ฆฌ๋Š” ๋ณดํ†ต HTTP DELETE ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‹ค์ œ๋กœ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ โœ… Hard Delete ๋‹ค๋ฅธ ๋ง๋กœ โœ… ๋ฌผ๋ฆฌ ์‚ญ์ œ๋ผ๊ณ  ํ•œ๋‹ค.

  • ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์•„๋ž˜ ์ƒํ™ฉ์ด ๊ทธ ์˜ˆ์‹œ์ด๋‹ค.

1. ๊ธฐํš์ž๊ฐ€ ํƒˆํ‡ดํ•œ ์œ ์ €์˜ ๋ฐ์ดํ„ฐ๋„ ํ•„์š”๋กœ ํ•  ๊ฒฝ์šฐ (๋งˆ์ผ€ํŒ… ๋ฐ ๊ธฐํš์— ์‚ฌ์šฉ)
2. ํƒˆํ‡ดํ•œ ํšŒ์›์ด ์ž์‹ ์˜ ์ •๋ณด๋ฅผ ๋ณต๊ตฌํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒฝ์šฐ


  • ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์™„์ „ํžˆ ์‚ญ์ œํ•˜๋Š” Hard Delete๋ฅผ ํ•˜๊ณ ์‹ถ์ง€ ์•Š์•„์ง„๋‹ค,,,
  • ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ , โœ… ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ๋ผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋ฅผ ํ™œ์šฉํ•ด ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ์ธ์ง€๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์„ ํƒ์ง€๋ฅผ ๊ณ ๋ฅด๊ฒŒ ๋œ๋‹ค.
  • ์ง€๋‚œ ์•ฑ์žผ ์„œ๋น„์Šค์ธ "์—„๋น ๋„ ์–ด๋ ธ๋‹ค"์—์„œ๋Š” ํƒˆํ‡ด ํšŒ์›์— ๋Œ€ํ•ด WITHDRAW๋ผ๋Š” enum์„ ํ™œ์šฉํ•จ์œผ๋กœ์จ ํƒˆํ‡ด ํšŒ์›์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ์‹์„ ํƒํ•˜์˜€๋‹ค.
  • ์ด๋ ‡๋“ฏ โœ…Soft Delete, ์ฆ‰ โœ…๋…ผ๋ฆฌ ์‚ญ์ œ๋Š” SQL๋ฌธ์˜ DELETE ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, UPDATE ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ํŠน์ • ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์คŒ์œผ๋กœ์จ ๋ฌผ๋ฆฌ์ ์ธ ๋ฐ์ดํ„ฐ๋Š” DB์— ๋‚จ๊ธด๋‹ค.

๋…ผ๋ฆฌ ์‚ญ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ์ค‘์—๋Š” UPDATE ์ฟผ๋ฆฌ๊ฐ€ DELETE ์ฟผ๋ฆฌ๋ณด๋‹ค ๋งˆ์ดํฌ๋กœ์ดˆ ๋‹จ์œ„๋กœ ๋ดค์„ ๋•Œ ๋” ๋น ๋ฅด๋‹ค๋Š” ์ด์œ ๋„ ์žˆ๋‹ค.


โœ… Soft Delete์˜ ๋‹จ์ 

  • ํƒˆํ‡ดํ•œ ํšŒ์›์— ๋Œ€ํ•ด์„œ ํ•„๋“œ ๊ฐ’๋งŒ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋ฉด, ๋ฌผ๋ฆฌ์ ์œผ๋กœ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์—ฌ๊ฐ€๋Š” ๊ฒƒ์ด๋ฏ€๋กœ DB์˜ ์šฉ๋Ÿ‰์ด ๋งค์šฐ ์ปค์งˆ ์ˆ˜๋ฐ–์— ์—†๋‹ค.
  • ํƒˆํ‡ด ํšŒ์›์ด ๋ˆ„์ ๋ ์ˆ˜๋ก ๋ ˆ์ฝ”๋“œ๋“ค์ด ์Œ“์ด๊ฒŒ ๋˜๊ณ , ์กฐํšŒ ์„ฑ๋Šฅ์ด ๊ต‰์žฅํžˆ ๋‚ฎ์•„์ง€๊ฒŒ ๋œ๋‹ค๐Ÿ˜ญ
  • "์—„๋น ๋„ ์–ด๋ ธ๋‹ค" ๋ฐ๋ชจ๋ฐ์ด ์ดํ›„ ์Œ“์—ฌ๋ฒ„๋ฆฐ ํƒˆํ‡ด ํšŒ์› ๋ ˆ์ฝ”๋“œ๋“ค์˜ ๋ชจ์Šต
  • ํƒˆํ‡ดํ•œ ํšŒ์›๋“ค์„ ์ œ์™ธํ•˜๊ณ  SELECT ๋ฌธ์„ ๋‚ ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•  ๊ฒƒ์ด๋‹ค
SELECT * FROM user WHERE social_platform = "WITHDRAW"
  • ์‚ฌ์‹ค ์œ„์™€ ๊ฐ™์ด varchar(255)๋กœ ์ •์˜๋œ ํ•„๋“œ๋กœ ์‹๋ณ„ํ•˜๊ธฐ๋ณด๋‹จ, deleted์™€ ๊ฐ™์€ bit(1) ํ•„๋“œ๋กœ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋”์šฑ ๋ฐ”๋žŒ์งํ•  ๊ฒƒ์ด๋‹ค.

โœ… JPA Soft Delete

  • JPA๋Š” ์œ„์™€ ๊ฐ™์€ Soft Delete๋ฅผ ๋”์šฑ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช‡๊ฐ€์ง€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

โœจ @SQLDelete

  • ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์€ DELETE ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ์ •์˜๋œ ์ฟผ๋ฆฌ๋กœ ๋ฐ”๊ฟ”์„œ ์‹คํ–‰ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  • ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•˜๋ฉด DELETE ์ฟผ๋ฆฌ๋ฅผ UPDATE ์ฟผ๋ฆฌ๋กœ ๋ฐ”๊ฟ”์คŒ์œผ๋กœ์จ, ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ์ž„์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • "์—„๋น ๋„ ์–ด๋ ธ๋‹ค" ์„œ๋น„์Šค์— ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜์˜€๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž

    1๏ธโƒฃ ๋จผ์ €, User ์—”ํ‹ฐํ‹ฐ deleted ๋ผ๋Š” ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด, ํƒˆํ‡ดํ•œ ์œ ์ €์ž„์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

    2๏ธโƒฃ User ์—”ํ‹ฐํ‹ฐ์˜ ํด๋ž˜์Šค level์— @SQLDelete ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•œ ๋’ค, deleted ํ•„๋“œ๋ฅผ UPDATE ํ•˜๋„๋ก SQL๋ฌธ์„ ์ž‘์„ฑํ•œ๋‹ค.

    3๏ธโƒฃ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด DELETE ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋Š” deleteById ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์•„๋ž˜์™€ ๊ฐ™์ด deleted ํ•„๋“œ๋งŒ ๋ฐ”๋€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

โœจ @Where

  • ์œ„์™€ ๊ฐ™์ด deleted ํ•„๋“œ๋ฅผ true๋กœ ๋ฐ”๊ฟจ๋”๋ผ๋„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•  ๋•Œ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š” ๊ฒƒ์€ ํ”ผํ•  ์ˆ˜ ์—†๋‹ค.

  • ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋Š” deleted ํ•„๋“œ๊ฐ€ false์ธ ๋ ˆ์ฝ”๋“œ๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ SELECT ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•œ๋‹ค.

  • ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” SELECT ์ฟผ๋ฆฌ์— ๋งค๋ฒˆ WHERE ์ ˆ์„ ๋ถ™์—ฌ์ค˜์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ๋Œ€์‹ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ @Where ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

    1๏ธโƒฃ User ์—”ํ‹ฐํ‹ฐ์˜ ํด๋ž˜์Šค level์— @Where ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์ค€ ๋’ค, ์•„๋ž˜์™€ ๊ฐ™์ด ์กฐ๊ฑด์„ ์ ์–ด์ค€๋‹ค.

    2๏ธโƒฃ ๊ทธ๋Ÿฌ๋ฉด User์™€ ๊ด€๋ จ๋œ SELECT ๋ฌธ์—์„œ deleted ํ•„๋“œ๊ฐ€ false์ธ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ์กฐํšŒ๊ฐ€ ์ผ์–ด๋‚˜๋„๋ก ์ž๋™์œผ๋กœ WHERE ์ ˆ์ด ์ž‘์„ฑ๋œ๋‹ค.


โœ… Native Query ์‚ฌ์šฉ

  • @SQLDelete, @Where ๋“ฑ์€ ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ํ•œ๋‹ค.

  • ์™œ๋ƒํ•˜๋ฉด ์‹ค๋ฌด์—์„œ๋Š” ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ์‹ค์ œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜์—ˆ๋Š”์ง€ ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ๋„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์‹ค๋ฌด๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„, ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ๋“ค๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์–ป๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ด๋Ÿฐ ๊ฒฝ์šฐ Native Query๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด WHERE ์ ˆ์„ ๋ฌด์‹œํ•˜๊ณ  SELECT ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ž์„ธํ•œ ์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™๋‹ค.

  • ์œ„์™€ ๊ฐ™์ด nativeQuery๋ฅผ true๋กœ ์ง€์ •ํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํŠนํ™”๋œ (JPQL๊ณผ ๋ฌด๊ด€ํ•œ) ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๊ฒŒ ๋˜๋ฏ€๋กœ deleted๊ฐ€ true์ธ ๋ ˆ์ฝ”๋“œ๋“ค๋„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€