본문 바로가기

사이드 프로젝트/To do list

[Spring project] Spring Boot Todo 리스트 관리: Todo 데이터 수정 및 삭제 처리

이번 포스팅에서는 Spring Boot와 JPA를 사용하여 Task 엔티티의 데이터를 수정하고 삭제하는 방법을 다룬다. 특히, 특정 엔티티를 삭제할 때 연관된 데이터도 함께 삭제해야 하는 시나리오와 트랜잭션 관리를 중심으로 설명할 예정이다.

 

1. 수정 처리: Task 엔티티의 데이터 수정


Spring Boot에서 특정 엔티티의 필드만 수정하는 것은 매우 간단하다. 아래는 Task 엔티티의 taskNm(할 일 이름)과 modifyDt(수정일)를 수정하는 예제이다.

Task 수정 메서드 구현

Controller.java

@PostMapping("/{totoNo}/tasks/{taskNo}/edit")
public String updateTaskNameAndDate(@PathVariable int totoNo, @PathVariable int taskNo, @ModelAttribute Task task) {
    try {
        Task existingTask = taskService.getTaskById(taskNo, totoNo);

        if (existingTask != null) {
            existingTask.setTaskNm(task.getTaskNm());  // Task 이름 수정
            existingTask.setModifyDt(task.getModifyDt());  // 수정일자 변경
            taskService.saveTask(existingTask);  // 수정된 Task 저장
        }
    } catch (Exception e) {
        return "redirect:/totos/" + totoNo + "/tasks";
    }

    return "redirect:/totos/" + totoNo + "/tasks";
}

 

 

  • @ModelAttribute를 통해 수정된 값을 받아와 Task의 필드를 업데이트한다.
  • 수정된 값을 서비스 계층에서 저장한다.

TaskService.java

@Service
public class TaskService {
    
    @Transactional
    public Task getTaskById(int taskNo, int totoNo) {
        // Task 조회 로직
    }

    @Transactional
    public void saveTask(Task task) {
        // JPA repository의 save 메서드로 Task 저장
        taskRepository.save(task);
    }
}

 

 

트랜잭션을 적용하여 수정 작업이 완료되면 자동으로 데이터베이스에 커밋되도록 설정한다.

 

2. 삭제 처리: Task 삭제와 연관 데이터 삭제


엔티티 삭제 시 중요한 점은 연관된 데이터를 함께 삭제하는 것이다. 이번 예제에서는 Toto 엔티티를 삭제할 때, 그와 연결된 Task 엔티티들도 함께 삭제하는 작업을 다룬다.

Toto와 연관된 Task 삭제

TotoController.java

 

 

@DeleteMapping("/{totoNo}")
@ResponseBody
public Map<String, String> deleteToto(@PathVariable int totoNo) {
    Map<String, String> response = new HashMap<>();

    try {
        // 서비스에서 totoNo에 해당하는 Task와 Toto 삭제
        totoService.deleteTotoById(totoNo);
        response.put("status", "success");
        response.put("redirectUrl", "/totos");
    } catch (Exception e) {
        response.put("status", "error");
        response.put("message", "삭제에 실패했습니다.");
        response.put("redirectUrl", "/totos");
    }

    return response;
}

 

TotoService.java

@Service
public class TotoService {

    private final TotoRepository totoRepository;
    private final TaskService taskService;

    public TotoService(TotoRepository totoRepository, TaskService taskService) {
        this.totoRepository = totoRepository;
        this.taskService = taskService;
    }

    @Transactional
    public void deleteTotoById(int totoNo) {
        // 먼저 totoNo에 해당하는 모든 Task 삭제
        taskService.deleteTasksByTotoNo(totoNo);
        
        // 그 후 Toto 삭제
        totoRepository.deleteById(totoNo);
    }
}

 

TaskService에서 totoNo로 연결된 Task 삭제

@Service
public class TaskService {

    private final TaskRepository taskRepository;

    public TaskService(TaskRepository taskRepository) {
        this.taskRepository = taskRepository;
    }

    @Transactional
    public void deleteTasksByTotoNo(int totoNo) {
        taskRepository.deleteByTotoNo(totoNo);
    }
}

 

Repository

public interface TaskRepository extends JpaRepository<Task, Integer> {
   ...
    // totoNo로 연결된 모든 Task 삭제
    void deleteByTotoNo(int totoNo);
}

 

트랜잭션 적용의 중요성

Spring Boot에서 데이터베이스 수정 및 삭제 작업은 반드시 트랜잭션 안에서 이루어져야 한다. 이를 위해 @Transactional 어노테이션을 서비스 메서드에 추가하여 트랜잭션이 활성화된 상태에서 안전하게 작업이 이루어지도록 설정한다.

 

 


 

이로써 Spring Boot에서 수정 및 삭제 기능을 구현하고, 트랜잭션을 관리하는 방법을 다뤘다. 삭제 시 연관된 데이터까지 안전하게 삭제하는 방법과 트랜잭션의 중요성을 강조하며, JS로 비동기 요청 처리하는 방법도 함께 다뤘다.