diff --git a/refrigerator/.idea/modules/refrigerator.main.iml b/refrigerator/.idea/modules/refrigerator.main.iml index 397c268..afc1871 100644 --- a/refrigerator/.idea/modules/refrigerator.main.iml +++ b/refrigerator/.idea/modules/refrigerator.main.iml @@ -4,20 +4,5 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/refrigerator/src/main/java/moja/refrigerator/aggregate/user/Follow.java b/refrigerator/src/main/java/moja/refrigerator/aggregate/user/Follow.java index 80eaa90..caaddfa 100644 --- a/refrigerator/src/main/java/moja/refrigerator/aggregate/user/Follow.java +++ b/refrigerator/src/main/java/moja/refrigerator/aggregate/user/Follow.java @@ -12,11 +12,11 @@ public class Follow { @Column(name = "follow_pk") private long followPk; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "follower") private User follower; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "following") private User following; } diff --git a/refrigerator/src/main/java/moja/refrigerator/aggregate/user/User.java b/refrigerator/src/main/java/moja/refrigerator/aggregate/user/User.java index 03eb039..524bcdc 100644 --- a/refrigerator/src/main/java/moja/refrigerator/aggregate/user/User.java +++ b/refrigerator/src/main/java/moja/refrigerator/aggregate/user/User.java @@ -5,6 +5,7 @@ import org.hibernate.annotations.CreationTimestamp; import java.time.LocalDate; +import java.util.List; @Entity @Table(name = "tbl_user") @@ -33,4 +34,10 @@ public class User { @Column(name = "user_role") private String userRole = "ROLE_USER"; + + @OneToMany(mappedBy = "follower", cascade = CascadeType.REMOVE) + private List following; + + @OneToMany(mappedBy = "following", cascade = CascadeType.REMOVE) + private List followers; } diff --git a/refrigerator/src/main/java/moja/refrigerator/controller/user/UserController.java b/refrigerator/src/main/java/moja/refrigerator/controller/user/UserController.java index c841068..5c716e1 100644 --- a/refrigerator/src/main/java/moja/refrigerator/controller/user/UserController.java +++ b/refrigerator/src/main/java/moja/refrigerator/controller/user/UserController.java @@ -1,5 +1,7 @@ package moja.refrigerator.controller.user; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import moja.refrigerator.dto.user.request.PasswordResetRequest; import moja.refrigerator.dto.user.request.PasswordUpdateRequest; import moja.refrigerator.dto.user.request.UserCreateRequest; @@ -60,4 +62,11 @@ public ResponseEntity toggleFollow(@PathVariable Long userPk) { followService.toggleFollow(userPk); return ResponseEntity.ok().body("팔로우 상태가 변경되었습니다."); } + + // 회원 탈퇴 + @PostMapping("/delete") + public ResponseEntity delete(HttpServletRequest request, HttpServletResponse response) { + userService.deleteUser(request, response); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } } diff --git a/refrigerator/src/main/java/moja/refrigerator/service/user/UserService.java b/refrigerator/src/main/java/moja/refrigerator/service/user/UserService.java index cfb1abd..c999a75 100644 --- a/refrigerator/src/main/java/moja/refrigerator/service/user/UserService.java +++ b/refrigerator/src/main/java/moja/refrigerator/service/user/UserService.java @@ -1,5 +1,7 @@ package moja.refrigerator.service.user; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import moja.refrigerator.dto.user.request.PasswordResetRequest; import moja.refrigerator.dto.user.request.PasswordUpdateRequest; import moja.refrigerator.dto.user.request.UserCreateRequest; @@ -10,4 +12,5 @@ public interface UserService { void updateUser(UserUpdateRequest request); void resetPassword(PasswordResetRequest request); void updatePassword(PasswordUpdateRequest request); + void deleteUser(HttpServletRequest request, HttpServletResponse response); } diff --git a/refrigerator/src/main/java/moja/refrigerator/service/user/UserServiceImpl.java b/refrigerator/src/main/java/moja/refrigerator/service/user/UserServiceImpl.java index 7329781..7308101 100644 --- a/refrigerator/src/main/java/moja/refrigerator/service/user/UserServiceImpl.java +++ b/refrigerator/src/main/java/moja/refrigerator/service/user/UserServiceImpl.java @@ -1,5 +1,7 @@ package moja.refrigerator.service.user; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import moja.refrigerator.aggregate.user.User; import moja.refrigerator.dto.user.request.PasswordResetRequest; @@ -7,6 +9,7 @@ import moja.refrigerator.dto.user.request.UserCreateRequest; import moja.refrigerator.dto.user.request.UserUpdateRequest; import moja.refrigerator.exception.user.DuplicateUserException; +import moja.refrigerator.jwt.LogoutFilter; import moja.refrigerator.repository.user.UserRepository; import moja.refrigerator.service.email.EmailService; import org.modelmapper.ModelMapper; @@ -28,6 +31,7 @@ public class UserServiceImpl implements UserService { private final BCryptPasswordEncoder passwordEncoder; private final ModelMapper modelMapper; private final EmailService emailService; + private final LogoutFilter logoutFilter; @Override @Transactional @@ -114,6 +118,22 @@ public void updatePassword(PasswordUpdateRequest request) { user.setUserPw(passwordEncoder.encode(request.getNewPw())); } + @Override + @Transactional + public void deleteUser(HttpServletRequest request, HttpServletResponse response) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String userId = authentication.getName(); + + User user = userRepository.findByUserId(userId) + .orElseThrow(() -> new UsernameNotFoundException("사용자를 찾을 수 없습니다.")); + + // 유저 삭제 + userRepository.delete(user); + + // 로그아웃 처리 (토큰 블랙리스트에 추가) + logoutFilter.logout(request, response, authentication); + } + private void checkDuplicateUser(UserCreateRequest request) { List errors = new ArrayList<>(); if (userRepository.existsByUserId(request.getUserId())) {