이번 포스팅에서는 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로 비동기 요청 처리하는 방법도 함께 다뤘다.
'사이드 프로젝트 > To do list' 카테고리의 다른 글
[Spring project] 투투 리스트 프로젝트 완성: 모든 과정을 정리하며 (1) | 2024.10.21 |
---|---|
[Spring project] Spring Boot Todo 리스트 관리: 삭제 기능 구현 및 Task 입력 기능 (0) | 2024.10.13 |
[Spring project] Task 리스트 조회, 입력 (1) | 2024.10.06 |
[Spring Project] To do 리스트 조회 (0) | 2024.10.05 |
[Spring project] 테이블 설계 (0) | 2024.08.03 |