ν νλ‘μ νΈμμ μ§νμ€ μ μ λλ©μΈμ μꡬμ¬νμ νμ€ν¬ λλ©μΈκ³Ό μ°κ΄λμ΄ μλ νμ²λ¦¬ μμ μ΄ μμλ€.
μꡬμ¬ν
νμνν΄ κΈ°λ₯
- νν΄ μ ν΄λΉ μ¬μ©μκ° λ΄λΉν νμ€ν¬λ λ―Έν λΉ μνλ‘ λ³κ²½
μꡬμ¬νμ λ§μΆ° νμ νν΄ μ ν΄λΉ μ¬μ©μκ° λ΄λΉνκ³ μλ Task μν°ν°λ€μ assignedTo κ°μ null λ‘ λ°κΎΈλ νμ²λ¦¬κ° νμνλ€.
μ΄ λ‘μ§μ λλ©μΈ λΆλ¦¬λ₯Ό μν΄ μ΄λ²€νΈ 리μ€λ λ°©μμΌλ‘ ꡬννκΈ°λ‘ κ²°μ νλ€.
// μ μ μμ μ λ°νλ μ΄λ²€νΈ
@AllArgsConstructor
@Getter
public class UserDeletedEvent {
private Long userId;
}
μ¬μ€μ νμ²λ¦¬μ νμν κ°μ μμ λ μ μ μ ID λΏμ΄λ―λ‘ μ΄λ²€νΈ κ°μ²΄λ λ¨μνκ² κ΅¬μ±νμλ€.
public void deleteUser(...) {
...
user.softDelete();
//μ μ μμ ν μ΄λ²€νΈ λ°ν
eventPublisher.publishEvent(new UserDeletedEvent(user.getId()));
}
UserService μ μμ λ©μλ μ’ λ£ μμ μ μ΄λ²€νΈλ₯Ό λ°ννλ€.
@Component
@RequiredArgsConstructor
public class UserDeletedEventHandler {
private final TaskService taskService;
/*
μ μ μμ μ΄λ²€νΈ 리μ€λ
- μ΄λ²€νΈμμ λ°μμ¨ μμ λ μ μ μ μμ΄λκ°μΌλ‘ ν
μ€ν¬ μλΉμ€μ νμ²λ¦¬λ₯Ό μ§ν
*/
@EventListener
public void handleUserDeleted(UserDeletedEvent event) {
taskService.ownerDeletionForTask(event.getUserId());
}
}
Task λλ©μΈμμ ν΄λΉ μ΄λ²€νΈλ₯Ό μμ νμ¬ μ²λ¦¬ν μ μλλ‘ λ¦¬μ€λλ₯Ό ꡬννλ€.
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional
public class TaskService {
...
public void ownerDeletionForTask(Long userId) {
List<Task> foundTasks = taskRepository.findByAssignedTo_IdAndDeletedFalse(userId);
foundTasks.forEach(Task::unassignTask);
}
...
}
TaskService μλ ν΄λμ€ λ 벨μ @Transactionalμ΄ μ μΈλμ΄ μμ΄ μ΄λ²€νΈ 리μ€λ λ΄λΆμμ νΈμΆν ownerDeletionForTask() λ©μλ λν νΈλμμ
μ΄ μ μ©λ κ²μΌλ‘ μμνλ€.
λ°λΌμ μν°ν°μ νλ κ°μ λ³κ²½ν ν save() μμ΄λ λν° μ²΄νΉμΌλ‘ DBμ λ°μλ κ²μ΄λΌ κΈ°λνμ§λ§ μμκ³Ό λ¬λ¦¬ λ³κ²½λ κ°μ DBμ λ°μλμ§ μμλ€.
μ΄λ²€νΈ 리μ€λμμ νΈλμμ
μ΄ μ μΈλ μλΉμ€ λ©μλλ₯Ό νΈμΆνμ§λ§
νΈμΆ μμ μ΄λ νΈλμμ
κ²½κ³ λ¬Έμ λ‘ μΈν΄ λν° μ²΄νΉμ΄ λμνμ§ μμ DB λ°μμ΄ λμ§ μμλ€.
public void ownerDeletionForTask(Long userId) {
List<Task> foundTasks = taskRepository.findByAssignedTo_IdAndDeletedFalse(userId);
foundTasks.forEach(Task::unassignTask);
taskRepository.saveAll(foundTasks); //λͺ
μμ μΌλ‘ μ μ₯
}
νΈλμμ μ΄ μ μ©λμ§ μμμ νμΈνκ³ λͺ μμ μΌλ‘ saveAll()μ νΈμΆνμ¬ DB λ°μμ 보μ₯νλλ‘ μμ νλ€.
μ΄λ² νλ‘μ νΈμμ λ¨μν κ΅¬μ‘°λ‘ μ΄λ²€νΈλ₯Ό μ¬μ©ν΄λ΄€μ§λ§ λ€μν μν©μ μ μ©ν μ μλ κΈ°λ₯μ΄λΌλ μ μμ μ’μ κ²½νμ΄μλ€.
λ€μ νλ‘μ νΈμμ λ³΄λ€ μ€μ©μ μ΄κ³ μλ―Έ μλ λ°©μμΌλ‘ μ΄λ²€νΈλ₯Ό λμ
ν΄ λ³΄λ κ²λ κ³ λ―Όν΄λ³Ό μκ°μ΄λ€.
"νΈμΆ μμ μ΄λ νΈλμμ κ²½κ³ λ¬Έμ λ‘ μΈν΄" λΌλ λΆλΆμ΄ ν΅μ¬μΈ κ² κ°μλ°, μ νν μ΄λ€ μ΄μ μ μν΄μ λμνμ§ μλ 건κ°μ?