diff --git a/src/main/java/com/my_medi/domain/advice/repository/AdviceRepository.java b/src/main/java/com/my_medi/domain/advice/repository/AdviceRepository.java index 22977e4f..0fda2db3 100644 --- a/src/main/java/com/my_medi/domain/advice/repository/AdviceRepository.java +++ b/src/main/java/com/my_medi/domain/advice/repository/AdviceRepository.java @@ -11,4 +11,5 @@ public interface AdviceRepository extends JpaRepository { Page findAllByUserId(Long userId, Pageable pageable); Page findAllByExpertIdAndUserId(Long expertId, Long userId, Pageable pageable); Optional findTop1ByUserIdOrderByCreatedDateDescIdDesc(Long userId); + void deleteByUserId(Long userId); } diff --git a/src/main/java/com/my_medi/domain/consultationRequest/repository/ConsultationRequestRepository.java b/src/main/java/com/my_medi/domain/consultationRequest/repository/ConsultationRequestRepository.java index 427d3bec..9fbd2588 100644 --- a/src/main/java/com/my_medi/domain/consultationRequest/repository/ConsultationRequestRepository.java +++ b/src/main/java/com/my_medi/domain/consultationRequest/repository/ConsultationRequestRepository.java @@ -84,7 +84,7 @@ ConsultationRequestRepository.RequestedAgg findRequestedAgg( int deleteByIdAndUserIdAndRequestStatus(Long id, Long userId, RequestStatus status); - + void deleteByUserId(Long userId); diff --git a/src/main/java/com/my_medi/domain/notification/repository/UserNotificationRepository.java b/src/main/java/com/my_medi/domain/notification/repository/UserNotificationRepository.java index 35c8f6ef..325e75e9 100644 --- a/src/main/java/com/my_medi/domain/notification/repository/UserNotificationRepository.java +++ b/src/main/java/com/my_medi/domain/notification/repository/UserNotificationRepository.java @@ -7,4 +7,5 @@ public interface UserNotificationRepository extends JpaRepository { Page findAllByUserId(Long userId, Pageable pageable); + void deleteByUserId(Long userId); } diff --git a/src/main/java/com/my_medi/domain/proposal/repository/ProposalRepository.java b/src/main/java/com/my_medi/domain/proposal/repository/ProposalRepository.java index 7742d74d..0ae5d663 100644 --- a/src/main/java/com/my_medi/domain/proposal/repository/ProposalRepository.java +++ b/src/main/java/com/my_medi/domain/proposal/repository/ProposalRepository.java @@ -19,4 +19,6 @@ public interface ProposalRepository extends JpaRepository { where u.id in :userIds """) List findAllByUserIdInWithUser(@Param("userIds") Set userIds); + + void deleteByUserId(Long userId); } diff --git a/src/main/java/com/my_medi/domain/report/entity/Report.java b/src/main/java/com/my_medi/domain/report/entity/Report.java index 803c2231..13362f43 100644 --- a/src/main/java/com/my_medi/domain/report/entity/Report.java +++ b/src/main/java/com/my_medi/domain/report/entity/Report.java @@ -53,7 +53,6 @@ public class Report extends BaseTimeEntity { @JoinColumn(name = "additional_test_id") private AdditionalTest additionalTest; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; diff --git a/src/main/java/com/my_medi/domain/report/repository/ReportRepository.java b/src/main/java/com/my_medi/domain/report/repository/ReportRepository.java index de599100..6ec8f31d 100644 --- a/src/main/java/com/my_medi/domain/report/repository/ReportRepository.java +++ b/src/main/java/com/my_medi/domain/report/repository/ReportRepository.java @@ -39,4 +39,8 @@ SELECT MAX(r3.id) ) """) List findLatestReportStatusByUserIds(@Param("userIds") Set userIds); + + List findIdsByUserId(Long userId); + + void deleteAllByUserId(Long userId); } diff --git a/src/main/java/com/my_medi/domain/reportResult/repository/ReportResultRepository.java b/src/main/java/com/my_medi/domain/reportResult/repository/ReportResultRepository.java index 7cae092a..a6317bb6 100644 --- a/src/main/java/com/my_medi/domain/reportResult/repository/ReportResultRepository.java +++ b/src/main/java/com/my_medi/domain/reportResult/repository/ReportResultRepository.java @@ -2,6 +2,9 @@ import com.my_medi.domain.reportResult.entity.ReportResult; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.Optional; @@ -11,4 +14,13 @@ public interface ReportResultRepository extends JpaRepository findByReportId(Long id); + + @Modifying(clearAutomatically = true, flushAutomatically = true) + @Query(""" + delete from ReportResult rr + where rr.report.id in ( + select r.id from Report r where r.user.id = :userId + ) + """) + void deleteAllByUserId(@Param("userId") Long userId); } diff --git a/src/main/java/com/my_medi/domain/schedule/repository/ScheduleRepository.java b/src/main/java/com/my_medi/domain/schedule/repository/ScheduleRepository.java index 295c809f..565a57c7 100644 --- a/src/main/java/com/my_medi/domain/schedule/repository/ScheduleRepository.java +++ b/src/main/java/com/my_medi/domain/schedule/repository/ScheduleRepository.java @@ -45,5 +45,7 @@ List findUpcomingSchedulesByExpert( List findAllByExpertIdAndMeetingDate(Long expertId, LocalDate meetingDate); List findAllByUserIdAndMeetingDate(Long userId, LocalDate meetingDate); + + void deleteAllByUserId(Long userId); } diff --git a/src/main/java/com/my_medi/domain/user/service/UserCommandServiceImpl.java b/src/main/java/com/my_medi/domain/user/service/UserCommandServiceImpl.java index 29158095..ce806a0d 100644 --- a/src/main/java/com/my_medi/domain/user/service/UserCommandServiceImpl.java +++ b/src/main/java/com/my_medi/domain/user/service/UserCommandServiceImpl.java @@ -1,8 +1,15 @@ package com.my_medi.domain.user.service; import com.my_medi.api.member.dto.RegisterMemberDto; +import com.my_medi.domain.advice.repository.AdviceRepository; +import com.my_medi.domain.consultationRequest.repository.ConsultationRequestRepository; import com.my_medi.domain.member.entity.Role; import com.my_medi.api.user.dto.UpdateUserDto; +import com.my_medi.domain.notification.repository.UserNotificationRepository; +import com.my_medi.domain.proposal.repository.ProposalRepository; +import com.my_medi.domain.report.repository.ReportRepository; +import com.my_medi.domain.reportResult.repository.ReportResultRepository; +import com.my_medi.domain.schedule.repository.ScheduleRepository; import com.my_medi.domain.user.entity.User; import com.my_medi.domain.user.repository.UserRepository; import com.my_medi.domain.user.exception.UserHandler; @@ -11,6 +18,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.util.List; import java.util.UUID; @Service @@ -20,6 +28,13 @@ public class UserCommandServiceImpl implements UserCommandService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; + private final AdviceRepository adviceRepository; + private final ConsultationRequestRepository consultationRequestRepository; + private final UserNotificationRepository userNotificationRepository; + private final ProposalRepository proposalRepository; + private final ReportRepository reportRepository; + private final ReportResultRepository reportResultRepository; + private final ScheduleRepository scheduleRepository; @Override public Long registerUser(RegisterMemberDto registerMemberDto){ @@ -52,9 +67,19 @@ public Long updateUserInformation(Long userId, UpdateUserDto dto) { public Long deleteUserAccount(Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> UserHandler.NOT_FOUND); + + adviceRepository.deleteByUserId(userId); + consultationRequestRepository.deleteByUserId(userId); + userNotificationRepository.deleteByUserId(userId); + proposalRepository.deleteByUserId(userId); + + reportResultRepository.deleteAllByUserId(userId); + reportRepository.deleteAllByUserId(userId); + + scheduleRepository.deleteAllByUserId(userId); + userRepository.delete(user); // TODO : Hard delete이나 추후 soft로 변경예정 return user.getId(); } - } diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 3fda4eef..a760bc95 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -12,7 +12,7 @@ spring: ### JPA ### jpa: hibernate: - ddl-auto: update + ddl-auto: create ### SQL INIT for Batch ### sql: init: