Home > Troubleshooting > πŸ”[Troubleshooting] πŸš€ Delete API

πŸ”[Troubleshooting] πŸš€ Delete API
Troubleshooting Backend Development Spring Boot

πŸš€ Delete API!

πŸ‘ 잘 κ΅¬ν˜„λœ λΆ€λΆ„

1. λͺ…ν™•ν•œ 계측 뢄리

  • ControllerλŠ” HTTP μš”μ²­ μ²˜λ¦¬μ— 집쀑
  • ServiceλŠ” λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 λ‹΄λ‹Ή
  • RepositoryλŠ” 데이터 μ ‘κ·Ό κ³„μΈ΅μœΌλ‘œ μ—­ν•  뢄리
  • 각 κ³„μΈ΅μ˜ μ±…μž„μ΄ λͺ…ν™•ν•˜κ²Œ κ΅¬λΆ„λ˜μ–΄ μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•©λ‹ˆλ‹€

2. RESTful URI 섀계

@DeleteMapping("/delete/student/{studentId}")
  • λ¦¬μ†ŒμŠ€(student) μ€‘μ‹¬μ˜ URI 섀계
  • μ μ ˆν•œ HTTP λ©”μ„œλ“œ(DELETE) μ‚¬μš©
  • RESTful 원칙을 잘 μ€€μˆ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€

3. νŠΈλžœμž­μ…˜ 관리

@Transactional
public void deleteStudent(String studentId) { ... }
  • @Transactional μ–΄λ…Έν…Œμ΄μ…˜μ„ ν†΅ν•œ μ›μžμ„± 보μž₯
  • μ‚­μ œ μž‘μ—…μ˜ μ•ˆμ •μ„± 확보

πŸ€” κ°œμ„ μ΄ ν•„μš”ν•œ λΆ€λΆ„

1. μœ„ν—˜ν•œ 이쀑 μ‚­μ œ 둜직

πŸ“Œ ν˜„μž¬ μ½”λ“œμ˜ 문제점

@Transactional
public void deleteStudent(String studentId) {
    // 1단계: deleteByStudentId()μ—μ„œ 이미 DELETE 쿼리 μ‹€ν–‰
    Student deletedStudent = studentRepository.deleteByStudentId(studentId);
    
    // 2단계: 이미 μ‚­μ œλœ μ—”ν‹°ν‹°λ₯Ό λ‹€μ‹œ μ‚­μ œ μ‹œλ„ (λΆˆν•„μš”ν•˜κ³  μœ„ν—˜!)
    studentRepository.delete(deletedStudent);
}

μ™œ λ¬Έμ œμΈκ°€?

  • deleteBy... λ©”μ„œλ“œλŠ” λ‚΄λΆ€μ μœΌλ‘œ DELETE 쿼리λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€
  • 이미 μ‚­μ œλœ μ—”ν‹°ν‹°λ₯Ό λ‹€μ‹œ μ‚­μ œν•˜λ € μ‹œλ„ν•˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€
  • λΆˆν•„μš”ν•œ 쀑볡 둜직으둜 ν˜Όλž€μ„ μ•ΌκΈ°ν•©λ‹ˆλ‹€

βœ… κ°œμ„ λœ μ½”λ“œ

@Transactional
public void deleteStudent(String studentId) {
    // 1단계: μ—”ν‹°ν‹° 쑴재 μ—¬λΆ€ 확인
    Student student = studentRepository.findByStudentId(studentId)
        .orElseThrow(() -> new IllegalArgumentException("μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν•™μƒμž…λ‹ˆλ‹€."));
    
    // 2단계: 쑰회된 μ—”ν‹°ν‹° μ‚­μ œ
    studentRepository.delete(student);
}

κ°œμ„  효과

  • λͺ…ν™•ν•œ μ‚­μ œ ν”„λ‘œμ„ΈμŠ€: 쑰회 β†’ 검증 β†’ μ‚­μ œ
  • μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 학생 ID μš”μ²­ μ‹œ λͺ…μ‹œμ μΈ μ˜ˆμ™Έ 처리
  • μ½”λ“œμ˜ μ˜λ„κ°€ λͺ…ν™•ν•˜μ—¬ μœ μ§€λ³΄μˆ˜μ„± ν–₯상

2. λΆ€μ μ ˆν•œ HTTP 응닡 μƒνƒœ μ½”λ“œ

πŸ“Œ ν˜„μž¬ μ½”λ“œμ˜ 문제점

@DeleteMapping("/delete/student/{studentId}")
public void deleteStudent(@PathVariable String studentId) {
    studentService.deleteStudent(studentId);
    // 기본적으둜 200 OK λ°˜ν™˜
}

μ™œ λ¬Έμ œμΈκ°€?

  • μ‚­μ œ 성곡 μ‹œ λ°˜ν™˜ν•  본문이 μ—†λŠ”λ° 200 OKλ₯Ό λ°˜ν™˜
  • REST API ν‘œμ€€μ— λ”°λ₯΄λ©΄ 본문이 없을 λ•ŒλŠ” 204 No Contentκ°€ 적절

βœ… κ°œμ„ λœ μ½”λ“œ

@DeleteMapping("/delete/student/{studentId}")
public ResponseEntity<Void> deleteStudent(@PathVariable String studentId) {
    studentService.deleteStudent(studentId);
    return ResponseEntity.noContent().build(); // 204 No Content
}

κ°œμ„  효과

  • REST API ν‘œμ€€μ„ μ •ν™•νžˆ μ€€μˆ˜
  • ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λͺ…ν™•ν•œ 의미 전달 (μ‚­μ œ μ™„λ£Œ, λ°˜ν™˜ λ³Έλ¬Έ μ—†μŒ)
  • API λ¬Έμ„œν™” μ‹œ 더 λͺ…ν™•ν•œ μŠ€νŽ™ 제곡

πŸ“ μš”μ•½

ꡬ뢄 λ‚΄μš© μ€‘μš”λ„
βœ… μœ μ§€ 계측 뢄리, RESTful 섀계, νŠΈλžœμž­μ…˜ 관리 -
⚠️ μˆ˜μ • ν•„μˆ˜ 이쀑 μ‚­μ œ 둜직 제거 πŸ”΄ λ†’μŒ
πŸ’‘ ꢌμž₯ HTTP 204 μƒνƒœ μ½”λ“œ μ‚¬μš© 🟑 쀑간

μ΅œμ’… ꢌμž₯ 사항

  1. Service 계측: 쑰회 ν›„ μ‚­μ œ νŒ¨ν„΄μœΌλ‘œ λ³€κ²½ν•˜μ—¬ μ•ˆμ •μ„± 확보
  2. Controller 계측: ResponseEntity<Void>둜 λͺ…μ‹œμ μΈ 204 응닡 λ°˜ν™˜
  3. 이λ₯Ό 톡해 더 μ•ˆμ „ν•˜κ³  ν‘œμ€€μ„ μ€€μˆ˜ν•˜λŠ” APIλ₯Ό μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€