diff --git a/backend/JiShop/src/main/java/com/jishop/member/controller/AuthController.java b/backend/JiShop/src/main/java/com/jishop/member/controller/AuthController.java index 93e7c33a..f2257290 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/controller/AuthController.java +++ b/backend/JiShop/src/main/java/com/jishop/member/controller/AuthController.java @@ -16,7 +16,7 @@ public interface AuthController { ResponseEntity signIn(SignInFormRequest request, HttpServletRequest httpRequest, HttpServletResponse response); @Operation(summary = "회원 로그아웃") - ResponseEntity logout(HttpServletRequest request); + ResponseEntity logout(User user,HttpServletRequest request); @Operation(summary = "로그인 상태 체크") ResponseEntity checkLogin(User user); } diff --git a/backend/JiShop/src/main/java/com/jishop/member/controller/impl/AuthControllerImpl.java b/backend/JiShop/src/main/java/com/jishop/member/controller/impl/AuthControllerImpl.java index eb4d7ea6..00bf828b 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/controller/impl/AuthControllerImpl.java +++ b/backend/JiShop/src/main/java/com/jishop/member/controller/impl/AuthControllerImpl.java @@ -45,12 +45,13 @@ public ResponseEntity signIn(@RequestBody @Valid SignInFormRequest reque } @GetMapping("/logout") - public ResponseEntity logout(HttpServletRequest request) { + public ResponseEntity logout(@CurrentUser User user, HttpServletRequest request) { HttpSession session = request.getSession(false); if (session != null) { // redis의 세션도 삭제 session.invalidate(); } + service.logout(user); return ResponseEntity.ok().build(); } diff --git a/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserAdEmailRequest.java b/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserAdEmailRequest.java index 189b49fc..470be97a 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserAdEmailRequest.java +++ b/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserAdEmailRequest.java @@ -1,6 +1,11 @@ package com.jishop.member.dto.request; +import com.jishop.member.domain.User; + public record UserAdEmailRequest( boolean adEmailAgree ) { + public void update(User user){ + user.updateAdEmailAgree(adEmailAgree); + } } diff --git a/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserAdSMSRequest.java b/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserAdSMSRequest.java index 8a7dc054..e52f7573 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserAdSMSRequest.java +++ b/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserAdSMSRequest.java @@ -1,6 +1,11 @@ package com.jishop.member.dto.request; +import com.jishop.member.domain.User; + public record UserAdSMSRequest( boolean adSMSAgree ) { + public void update(User user){ + user.updateAdSMSAgree(adSMSAgree); + } } diff --git a/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserNameRequest.java b/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserNameRequest.java index 0f32e299..3152dc6a 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserNameRequest.java +++ b/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserNameRequest.java @@ -1,9 +1,13 @@ package com.jishop.member.dto.request; +import com.jishop.member.domain.User; import jakarta.validation.constraints.NotBlank; public record UserNameRequest( @NotBlank String name ) { + public void update(User user){ + user.updateName(name); + } } diff --git a/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserPhoneRequest.java b/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserPhoneRequest.java index 6ecc22ae..0fd36082 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserPhoneRequest.java +++ b/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserPhoneRequest.java @@ -1,9 +1,13 @@ package com.jishop.member.dto.request; +import com.jishop.member.domain.User; import jakarta.validation.constraints.NotBlank; public record UserPhoneRequest( @NotBlank String phone ) { + public void update(User user){ + user.updatePhone(phone); + } } diff --git a/backend/JiShop/src/main/java/com/jishop/member/repository/UserRepository.java b/backend/JiShop/src/main/java/com/jishop/member/repository/UserRepository.java index d9bf6966..4378689b 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/repository/UserRepository.java +++ b/backend/JiShop/src/main/java/com/jishop/member/repository/UserRepository.java @@ -1,5 +1,7 @@ package com.jishop.member.repository; +import com.jishop.common.exception.DomainException; +import com.jishop.common.exception.ErrorType; import com.jishop.member.domain.LoginType; import com.jishop.member.domain.User; import org.springframework.data.jpa.repository.JpaRepository; @@ -15,4 +17,8 @@ public interface UserRepository extends JpaRepository { Optional findByPhone(String phone); boolean existsByLoginId(String loginId); + + default User findPersistUser(User user) { + return findById(user.getId()).orElseThrow(() -> new DomainException(ErrorType.USER_NOT_FOUND)); + } } diff --git a/backend/JiShop/src/main/java/com/jishop/member/service/AuthService.java b/backend/JiShop/src/main/java/com/jishop/member/service/AuthService.java index 45078968..3bb8b501 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/service/AuthService.java +++ b/backend/JiShop/src/main/java/com/jishop/member/service/AuthService.java @@ -19,4 +19,5 @@ public interface AuthService { Long checkLogin(User user); void updateAdSMSAgree(User user, UserAdSMSRequest request); void updateAdEmailAgree(User user, UserAdEmailRequest request); + void logout(User user); } diff --git a/backend/JiShop/src/main/java/com/jishop/member/service/impl/AuthServiceImpl.java b/backend/JiShop/src/main/java/com/jishop/member/service/impl/AuthServiceImpl.java index 37709c5d..3d5d01dc 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/service/impl/AuthServiceImpl.java +++ b/backend/JiShop/src/main/java/com/jishop/member/service/impl/AuthServiceImpl.java @@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.Duration; +import java.util.function.Consumer; @Service @Transactional @@ -67,13 +68,15 @@ public boolean checkPW(RecoveryPWRequest request){ } public void updatePW(User user, UserNewPasswordRequest request){ - if(passwordEncoder.matches(request.password(), user.getPassword())){ + User persistUser = getPersistUser(user); + + if(passwordEncoder.matches(request.password(), persistUser.getPassword())){ throw new DomainException(ErrorType.PASSWORD_EXISTS); } String password = passwordEncoder.encode(request.password()); - user.updatePassword(password); - updateUserCache(user); + persistUser.updatePassword(password); + updateUserCache(persistUser); } // todo: 회원 정보 조회 @@ -83,17 +86,16 @@ public UserResponse getUser(User user){ // todo: 회원 정보 수정 (이름, 전화번호) public void updateUserName(User user, UserNameRequest request) { - user.updateName(request.name()); - updateUserCache(user); + applyAndCache(user, request::update); } public void updatePhone(User user, UserPhoneRequest request) { - user.updatePhone(request.phone()); - updateUserCache(user); + applyAndCache(user, request::update); } public void deleteUser(User user) { - user.delete(); + User persistUser = getPersistUser(user); + persistUser.delete(); } public Long checkLogin(User user) { @@ -101,20 +103,36 @@ public Long checkLogin(User user) { } public void updateAdSMSAgree(User user, UserAdSMSRequest request){ - user.updateAdSMSAgree(request.adSMSAgree()); - updateUserCache(user); + applyAndCache(user, request::update); } public void updateAdEmailAgree(User user, UserAdEmailRequest request){ - user.updateAdEmailAgree(request.adEmailAgree()); - updateUserCache(user); + applyAndCache(user, request::update); } private void updateUserCache(User user) { String cacheKey = "user::" + user.getId(); + // 캐시 업데이트 (기존 캐시 삭제 후 최신 정보로 재설정) redisTemplate.delete(cacheKey); redisTemplate.opsForValue().set(cacheKey, user, Duration.ofMinutes(30)); } + + private User getPersistUser(User user){ + User persistUser = userRepository.findPersistUser(user); + + return persistUser; + } + + private void applyAndCache(User user, Consumer update) { + User persistUser = getPersistUser(user); + update.accept(persistUser); + updateUserCache(persistUser); + } + + public void logout(User user) { + String cacheKey = "user::" + user.getId(); + redisTemplate.delete(cacheKey); + } }