diff --git a/src/main/java/kr/re/etri/autoflow/controllers/AuthController.java b/src/main/java/kr/re/etri/autoflow/controllers/AuthController.java index 15ceb85..3d7fec0 100644 --- a/src/main/java/kr/re/etri/autoflow/controllers/AuthController.java +++ b/src/main/java/kr/re/etri/autoflow/controllers/AuthController.java @@ -5,8 +5,10 @@ import java.util.stream.Collectors; import io.swagger.v3.oas.annotations.Parameter; import jakarta.servlet.http.HttpServletRequest; +import jakarta.transaction.Transactional; import jakarta.validation.Valid; +import kr.re.etri.autoflow.repository.UserProjectMapRepository; import kr.re.etri.autoflow.service.AuthService; import kr.re.etri.autoflow.service.UserService; import lombok.RequiredArgsConstructor; @@ -61,6 +63,7 @@ public class AuthController { RefreshTokenService refreshTokenService; private final AuthService authService; + private final UserProjectMapRepository userProjectMapRepository; private final UserService userService; @Operation(summary = "로그인", description = "사용자 인증 후 JWT 및 리프레시 토큰 쿠키를 반환합니다.") @@ -75,11 +78,11 @@ public class AuthController { } @Operation(summary = "회원가입", description = "새로운 사용자를 등록합니다.") - @ApiResponses({ + @ApiResponses({ @ApiResponse(responseCode = "200", description = "회원가입 성공"), @ApiResponse(responseCode = "400", description = "중복된 사용자명 또는 이메일") - }) - @PostMapping("/signup") + }) + @PostMapping("/signup") public ResponseEntity registerUser(@Valid @RequestBody SignupRequest signUpRequest) { if (userRepository.existsByUsername(signUpRequest.getUsername())) { return ResponseEntity.badRequest().body(new MessageResponse(false,"오류: 이미 사용 중인 사용자 이름입니다.")); @@ -244,13 +247,22 @@ public class AuthController { @ApiResponse(responseCode = "404", description = "해당 ID의 사용자를 찾을 수 없음") }) @DeleteMapping("/users/{id}") + @Transactional public ResponseEntity deleteUser( @Parameter(description = "사용자 ID", example = "1") @PathVariable Long id) { return userRepository.findById(id).map(user -> { - refreshTokenService.deleteByUserId(user.getId()); // 토큰 삭제 + // 1. 리프레시 토큰 삭제 + refreshTokenService.deleteByUserId(user.getId()); + + // 2. 사용자-프로젝트 맵 삭제 + userProjectMapRepository.deleteAllByUserId(user.getId()); + + // 3. 사용자 삭제 userRepository.delete(user); + return ResponseEntity.ok(new MessageResponse(true, "사용자가 삭제되었습니다.")); }).orElse(ResponseEntity.notFound().build()); } + } diff --git a/src/main/java/kr/re/etri/autoflow/repository/UserProjectMapRepository.java b/src/main/java/kr/re/etri/autoflow/repository/UserProjectMapRepository.java index 4bd4fec..66432e0 100644 --- a/src/main/java/kr/re/etri/autoflow/repository/UserProjectMapRepository.java +++ b/src/main/java/kr/re/etri/autoflow/repository/UserProjectMapRepository.java @@ -13,7 +13,9 @@ public interface UserProjectMapRepository extends JpaRepository findByProjectAndUser(ProjectEntity project, User user); - List findAllByProject(ProjectEntity project); - List findAllByUserId(Long userId); + + void deleteAllByUserId(Long id); + + void deleteAllByProjectId(Long id); } diff --git a/src/main/java/kr/re/etri/autoflow/service/ProjectService.java b/src/main/java/kr/re/etri/autoflow/service/ProjectService.java index c4c0d13..a340cf7 100644 --- a/src/main/java/kr/re/etri/autoflow/service/ProjectService.java +++ b/src/main/java/kr/re/etri/autoflow/service/ProjectService.java @@ -99,7 +99,13 @@ public class ProjectService { if (!projectRepository.existsById(id)) { return false; } + + // 연관 레코드 삭제 + userProjectMapRepository.deleteAllByProjectId(id); + + // 프로젝트 삭제 projectRepository.deleteById(id); return true; } + }