Home > Backend Development > πŸ“š[Backend Development] κ³„μΈ΅ν˜• λŒ€λŒ“κΈ€μ—μ„œ λŒ“κΈ€μ„ μ‚­μ œν•˜λ©΄ μ–΄λ–€ ν˜„μƒμ΄ λ°œμƒν• κΉŒμš”? 1️⃣

πŸ“š[Backend Development] κ³„μΈ΅ν˜• λŒ€λŒ“κΈ€μ—μ„œ λŒ“κΈ€μ„ μ‚­μ œν•˜λ©΄ μ–΄λ–€ ν˜„μƒμ΄ λ°œμƒν• κΉŒμš”? 1️⃣
Backend Ddevelopment

β€œπŸ“š[Backend Development] κ³„μΈ΅ν˜• λŒ€λŒ“κΈ€μ—μ„œ λŒ“κΈ€μ„ μ‚­μ œν•˜λ©΄ μ–΄λ–€ ν˜„μƒμ΄ λ°œμƒν• κΉŒμš”? 1️⃣”

🍎 Intro.

  • λŒ“κΈ€μ„ μ‚­μ œν•˜λŠ” λ°©μ‹μ—λŠ” μ—¬λŸ¬ 가지가 μžˆμŠ΅λ‹ˆλ‹€.
    • λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ™Έλž˜ ν‚€(Foreign Key) μ„€μ • 및 μ‚­μ œ 정책에 따라 λ‹€λ₯Έ ν˜„μƒμ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

βœ…1️⃣ λŒ“κΈ€ 2의 ꡬ쑰 뢄석.

  • λŒ“κΈ€ 2λŠ” λŒ“κΈ€ 1의 μžμ‹ λŒ“κΈ€(λŒ€λŒ“κΈ€).
  • λŒ“κΈ€ 3, λŒ“κΈ€ 5λŠ” λŒ“κΈ€ 2의 μžμ‹ λŒ€λŒ“κΈ€.
  • 즉, λŒ“κΈ€ 2λ₯Ό μ‚­μ œν•˜λ©΄ λŒ“κΈ€ 3κ³Ό λŒ“κΈ€ 5κ°€ κ³ μ•„ μƒνƒœ(λΆ€λͺ¨ μ—†λŠ” μƒνƒœ)κ°€ 됨.

βœ…2️⃣ λŒ“κΈ€ 2 μ‚­μ œ μ‹œ λ°œμƒν•  수 μžˆλŠ” μ‹œλ‚˜λ¦¬μ˜€

πŸ“Œ μ‹œλ‚˜λ¦¬μ˜€ 1️⃣: 연쇄 μ‚­μ œ (Cascading Delete)

  • λŒ“κΈ€ 2λ₯Ό μ‚­μ œν•˜λ©΄ λŒ“κΈ€ 3κ³Ό λŒ“κΈ€ 5도 ν•¨κ»˜ μ‚­μ œλ¨.
  • ON DELETE CASCADE μ˜΅μ…˜μ΄ μ„€μ •λ˜μ–΄ μžˆλŠ” 경우 λ°œμƒ.

πŸ‘‰ κ²°κ³Ό.

  • μ‚­μ œ ν›„ λ‚¨μ•„μžˆλŠ” λŒ“κΈ€ λͺ©λ‘:
λŒ“κΈ€ 1
λŒ“κΈ€ 4
λŒ“κΈ€ 6
  • λŒ“κΈ€ 3κ³Ό λŒ“κΈ€ 5κΉŒμ§€ ν•¨κ»˜ μ‚­μ œλ˜λ―€λ‘œ, ν•΄λ‹Ή μŠ€λ ˆλ“œ 전체가 사라짐.

πŸ“Œ μ‹œλ‚˜λ¦¬μ˜€ 2️⃣: κ³ μ•„ λŒ“κΈ€ 처리 (Orphan Handling)

  • λŒ“κΈ€ 2λ₯Ό μ‚­μ œν•˜λ©΄ λŒ“κΈ€ 3κ³Ό λŒ“κΈ€ 5의 λΆ€λͺ¨(parent_id)λ₯Ό NULL둜 μ„€μ •.
    • 즉, λŒ“κΈ€ 3κ³Ό λŒ“κΈ€ 5κ°€ 독립적인 μ΅œμƒμœ„ λŒ“κΈ€μ΄ 됨.
  • λŒ“κΈ€ 4와 λŒ“κΈ€ 6의 계측 κ΅¬μ‘°λŠ” μœ μ§€λ¨ ➞ λŒ“κΈ€ 6의 parent_id = 4

πŸ‘‰ κ²°κ³Ό.

  • μ‚­μ œ ν›„ λ‚¨μ•„μžˆλŠ” λŒ“κΈ€ λͺ©λ‘:
λŒ“κΈ€ 1
λŒ“κΈ€ 3  (κΈ°μ‘΄ λŒ“κΈ€ 2의 μžμ‹ β†’ μ΅œμƒμœ„ λŒ“κΈ€λ‘œ 이동)
λŒ“κΈ€ 5  (κΈ°μ‘΄ λŒ“κΈ€ 2의 μžμ‹ β†’ μ΅œμƒμœ„ λŒ“κΈ€λ‘œ 이동)
λŒ“κΈ€ 4
  β”” λŒ“κΈ€ 6

πŸ“Œ μ‹œλ‚˜λ¦¬μ˜€ 3️⃣: λΆ€λͺ¨ λŒ“κΈ€ λŒ€μ²΄ (Reparenting)

  • λŒ“κΈ€ 2λ₯Ό μ‚­μ œν•˜λ©΄ λŒ“κΈ€ 3κ³Ό λŒ“κΈ€ 4의 λΆ€λͺ¨λ₯Ό λŒ“κΈ€ 1둜 λ³€κ²½.
    • 즉, λŒ“κΈ€ 2의 μžμ‹λ“€μ΄ λŒ“κΈ€ 1의 직접적인 μžμ‹ λŒ“κΈ€μ΄ 됨

πŸ‘‰ κ²°κ³Ό.

  • μ‚­μ œ ν›„ λ‚¨μ•„μžˆλŠ” λŒ“κΈ€ λͺ©λ‘:
λŒ“κΈ€ 1
  β”” λŒ“κΈ€ 3
  β”” λŒ“κΈ€ 5
λŒ“κΈ€ 4
  β”” λŒ“κΈ€ 6

βœ…3️⃣ λŒ“κΈ€ 2 μ‚­μ œλ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법 선택.

μ‚­μ œ 방식 μ„€λͺ… μž₯점 단점
연쇄 μ‚­μ œ (Cascade) λŒ“κΈ€ 2λ₯Ό μ‚­μ œν•˜λ©΄ λŒ“κΈ€ 3, 5도 μ‚­μ œ 데이터 μ •ν•©μ„± μœ μ§€ μœ μ €κ°€ μ˜ˆμƒμΉ˜ λͺ»ν•œ μ‚­μ œ λ°œμƒ κ°€λŠ₯
κ³ μ•„ λŒ“κΈ€ 처리 (Orphan) λŒ“κΈ€ 3κ³Ό 5κ°€ μ΅œμƒμœ„ λŒ“κΈ€μ΄ 됨 μ‚­μ œ 후에도 데이터 보쑴 UIμ—μ„œ λŒ“κΈ€ 관계가 깨질 수 있음
λΆ€λͺ¨ λŒ“κΈ€ λŒ€μ²΄(Reparenting) λŒ“κΈ€ 3κ³Ό λŒ“κΈ€ 5κ°€ λŒ“κΈ€ 1의 μžμ‹μ΄ 됨 λŒ€λŒ“κΈ€ ꡬ쑰 μœ μ§€ 데이터 μˆ˜μ •μ΄ ν•„μš”

βœ…4️⃣ MySQLμ—μ„œ μ‚­μ œ 처리 방식 예제.

1️⃣ ON DELETE CASCADE (연쇄 μ‚­μ œ)

ALTER TABLE comments ADD CONSTRAINT fk_parent
FOREIGN KEY (parent_id) REFERENCES comments (comment_id) ON DELETE CASCADE;
  • λŒ“κΈ€ 2λ₯Ό μ‚­μ œν•˜λ©΄ λŒ“κΈ€ 3κ³Ό λŒ“κΈ€ 5도 μžλ™μœΌλ‘œ μ‚­μ œλ¨.

2️⃣ λΆ€λͺ¨ λŒ“κΈ€μ„ NULL둜 μ„€μ • (κ³ μ•„ λŒ“κΈ€ 처리)

UPDATE comments SET parent_id = NULL WHERE parent_id = 2;
DELETE FROM comments WHERE comment_id = 2;
  • λŒ“κΈ€ 3κ³Ό λŒ“κΈ€ 5κ°€ λΆ€λͺ¨ 없이 μ΅œμƒμœ„ λŒ“κΈ€λ‘œ 변경됨.

3️⃣ λΆ€λͺ¨ λŒ“κΈ€ λ³€κ²½ (Reparenting)

UPDATE comments SET parent_id = 1 WHERE parent_id = 2;
DELETE FROM comments WHERE comment_id = 2;
  • λŒ“κΈ€ 3κ³Ό λŒ“κΈ€ 5κ°€ λŒ“κΈ€ 1의 μžμ‹μ΄ 됨.

βœ…5️⃣ κ²°λ‘ 

  • λŒ“κΈ€ 2λ₯Ό μ‚­μ œν•˜λ©΄ λŒ“κΈ€ 3κ³Ό λŒ“κΈ€ 5의 처리 방법에 따라 λ‹€λ₯Έ κ²°κ³Όκ°€ λ°œμƒ.
  • μ–΄λ–€ 방식이 κ°€μž₯ μ μ ˆν•œμ§€λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 UX에 따라 κ²°μ •ν•΄μ•Ό 함.
  • 보톡은 λΆ€λͺ¨ λŒ“κΈ€μ„ μ‚­μ œν•΄λ„ λŒ€λŒ“κΈ€μ΄ 남도둝 처리(κ³ μ•„ λŒ“κΈ€ 처리 or λΆ€λͺ¨ λŒ“κΈ€ λ³€κ²½)ν•˜λŠ” κ²½μš°κ°€ 많음.