From 60d27d5f410fe533a3c9e13010686722f1de5d94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=A7=80=EB=AF=BC?= Date: Wed, 18 Dec 2024 15:23:00 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20=ED=9A=8C=EC=9B=90=20=ED=83=88=ED=87=B4?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 회원 탈퇴 시 회원 정보 삭제 - 회원 탈퇴 시 로그아웃을 통해 토큰 블랙리스트 등록 Related to: #51 --- .../.idea/modules/refrigerator.main.iml | 15 -------------- .../refrigerator/aggregate/user/Follow.java | 4 ++-- .../refrigerator/aggregate/user/User.java | 7 +++++++ .../controller/user/UserController.java | 9 +++++++++ .../service/user/UserService.java | 3 +++ .../service/user/UserServiceImpl.java | 20 +++++++++++++++++++ 6 files changed, 41 insertions(+), 17 deletions(-) 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())) {