From a9484a522eb63083e762f070ea88db424090277e Mon Sep 17 00:00:00 2001 From: JangBJ Date: Thu, 10 Apr 2025 22:28:29 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8feat:=20=ED=9A=8C=EC=9B=90=20=EA=B4=91?= =?UTF-8?q?=EA=B3=A0=20=EC=88=98=EC=8B=A0=EB=8F=99=EC=9D=98=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20commit=20=F0=9F=94=97=20Resolves:=20#296?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/UserController.java | 6 +++++ .../controller/impl/UserControllerImpl.java | 21 +++++++++++++--- .../java/com/jishop/member/domain/User.java | 17 ++++++++++++- .../member/dto/request/SignUpFormRequest.java | 9 ++++++- .../dto/request/UserAdEmailRequest.java | 6 +++++ .../member/dto/request/UserAdSMSRequest.java | 6 +++++ .../member/dto/response/UserResponse.java | 8 +++++-- .../jishop/member/service/AuthService.java | 2 ++ .../member/service/impl/AuthServiceImpl.java | 24 +++++++++++++++++++ 9 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 backend/JiShop/src/main/java/com/jishop/member/dto/request/UserAdEmailRequest.java create mode 100644 backend/JiShop/src/main/java/com/jishop/member/dto/request/UserAdSMSRequest.java diff --git a/backend/JiShop/src/main/java/com/jishop/member/controller/UserController.java b/backend/JiShop/src/main/java/com/jishop/member/controller/UserController.java index 8b09c3f7..ed0d06eb 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/controller/UserController.java +++ b/backend/JiShop/src/main/java/com/jishop/member/controller/UserController.java @@ -1,5 +1,6 @@ package com.jishop.member.controller; +import com.jishop.member.annotation.CurrentUser; import com.jishop.member.domain.User; import com.jishop.member.dto.request.*; import com.jishop.member.dto.response.FindUserResponse; @@ -8,6 +9,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.RequestBody; @Tag(name = "유저 서비스 API") @@ -29,4 +31,8 @@ public interface UserController { ResponseEntity updatePhone(User user, UserPhoneRequest request); @Operation(summary = "회원 탈퇴") ResponseEntity deleteUser(User user); + @Operation(summary = "sms 수신 동의") + void updateAdSMS( User user, UserAdSMSRequest request); + @Operation(summary = "email 수신 동의") + void updateAdEmail(User user, UserAdEmailRequest request); } diff --git a/backend/JiShop/src/main/java/com/jishop/member/controller/impl/UserControllerImpl.java b/backend/JiShop/src/main/java/com/jishop/member/controller/impl/UserControllerImpl.java index e508cfd1..d9ccbf49 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/controller/impl/UserControllerImpl.java +++ b/backend/JiShop/src/main/java/com/jishop/member/controller/impl/UserControllerImpl.java @@ -40,7 +40,8 @@ public ResponseEntity recoveryPW(@RequestBody @Validated RecoveryPWReque } @PatchMapping("/password") - public ResponseEntity updatePW(@CurrentUser User user, @RequestBody @Validated UserNewPasswordRequest request) { + public ResponseEntity updatePW(@CurrentUser User user, + @RequestBody @Validated UserNewPasswordRequest request) { authService.updatePW(user, request); return ResponseEntity.ok().body("비밀번호 뱐경완료!"); @@ -60,14 +61,16 @@ public UserResponse getUser(@CurrentUser User user) { * 이름, 전화번호 */ @PatchMapping("/name") - public ResponseEntity updateUserName(@CurrentUser User user, @RequestBody @Validated UserNameRequest request) { + public ResponseEntity updateUserName(@CurrentUser User user, + @RequestBody @Validated UserNameRequest request) { authService.updateUserName(user, request); return ResponseEntity.ok("이름 변경 완료!"); } @PatchMapping("/phone") - public ResponseEntity updatePhone(@CurrentUser User user, @RequestBody @Validated UserPhoneRequest request) { + public ResponseEntity updatePhone(@CurrentUser User user, + @RequestBody @Validated UserPhoneRequest request) { authService.updatePhone(user, request); return ResponseEntity.ok("번호 변경 완료!"); @@ -78,4 +81,16 @@ public ResponseEntity deleteUser(@CurrentUser User user) { authService.deleteUser(user); return ResponseEntity.ok("탈퇴 처리 완료!"); } + + @PatchMapping("/adSMS") + public void updateAdSMS(@CurrentUser User user, + @RequestBody @Validated UserAdSMSRequest request) { + authService.updateAdSMSAgree(user, request); + } + + @PatchMapping("/adEmail") + public void updateAdEmail(@CurrentUser User user, + @RequestBody @Validated UserAdEmailRequest request) { + authService.updateAdEmailAgree(user, request); + } } diff --git a/backend/JiShop/src/main/java/com/jishop/member/domain/User.java b/backend/JiShop/src/main/java/com/jishop/member/domain/User.java index 3b6763da..7f00d28d 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/domain/User.java +++ b/backend/JiShop/src/main/java/com/jishop/member/domain/User.java @@ -33,13 +33,20 @@ public class User extends BaseEntity implements Serializable { private boolean picAgreement; private boolean adAgreement; + private boolean adSMSAgree; + private boolean adEmailAgree; + //소셜 회원가입 @Builder - public User(boolean ageAgreement, boolean useAgreement, boolean picAgreement, boolean adAgreement, String loginId, String password, String name, String birthDate, String gender, String phone, LoginType provider) { + public User(boolean ageAgreement, boolean useAgreement, boolean picAgreement, boolean adAgreement, + boolean adSMSAgree, boolean adEmailAgree, String loginId, String password, + String name, String birthDate, String gender, String phone, LoginType provider) { this.ageAgreement = ageAgreement; this.useAgreement = useAgreement; this.picAgreement = picAgreement; this.adAgreement = adAgreement; + this.adSMSAgree = adSMSAgree; + this.adEmailAgree = adEmailAgree; this.loginId = loginId; this.password = password; this.name = name; @@ -60,4 +67,12 @@ public void updateName(String name) { public void updatePhone(String phone) { this.phone = phone; } + + public void updateAdSMSAgree(boolean adSMSAgree) { + this.adSMSAgree = adSMSAgree; + } + + public void updateAdEmailAgree(boolean adEmailAgree) { + this.adEmailAgree = adEmailAgree; + } } diff --git a/backend/JiShop/src/main/java/com/jishop/member/dto/request/SignUpFormRequest.java b/backend/JiShop/src/main/java/com/jishop/member/dto/request/SignUpFormRequest.java index 5e552805..893f6199 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/dto/request/SignUpFormRequest.java +++ b/backend/JiShop/src/main/java/com/jishop/member/dto/request/SignUpFormRequest.java @@ -33,15 +33,22 @@ public record SignUpFormRequest( ){ // 비밀번호 업데이트 public SignUpFormRequest withPassword(String password){ - return new SignUpFormRequest(this.ageAgreement, this.useAgreement, this.picAgreement, this.adAgreement, this.loginId, password, this.name, this.birthDate, this.gender, this.phone, this.provider); + return new SignUpFormRequest(this.ageAgreement, this.useAgreement, this.picAgreement, + this.adAgreement, this.loginId, password, this.name, this.birthDate, this.gender, + this.phone, this.provider); } public User toEntity(){ + boolean adSMSAgree = this.adAgreement; + boolean adEmailAgree = this.adAgreement; + return new User( this.ageAgreement, this.useAgreement, this.picAgreement, this.adAgreement, + adSMSAgree, + adEmailAgree, this.loginId, this.password, this.name, 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 new file mode 100644 index 00000000..189b49fc --- /dev/null +++ b/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserAdEmailRequest.java @@ -0,0 +1,6 @@ +package com.jishop.member.dto.request; + +public record UserAdEmailRequest( + boolean 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 new file mode 100644 index 00000000..8a7dc054 --- /dev/null +++ b/backend/JiShop/src/main/java/com/jishop/member/dto/request/UserAdSMSRequest.java @@ -0,0 +1,6 @@ +package com.jishop.member.dto.request; + +public record UserAdSMSRequest( + boolean adSMSAgree +) { +} diff --git a/backend/JiShop/src/main/java/com/jishop/member/dto/response/UserResponse.java b/backend/JiShop/src/main/java/com/jishop/member/dto/response/UserResponse.java index 5060497c..de903e48 100644 --- a/backend/JiShop/src/main/java/com/jishop/member/dto/response/UserResponse.java +++ b/backend/JiShop/src/main/java/com/jishop/member/dto/response/UserResponse.java @@ -5,10 +5,14 @@ public record UserResponse( String name, String phone, - String email + String email, + boolean adAgreement, + boolean adSMSAgree, + boolean adEmailAgree ) { // todo: 나중에 로컬회원과 소셜회원 구별해서 로그인 아이디 내려주기 public static UserResponse from(User user) { - return new UserResponse(user.getName(), user.getPhone(), user.getLoginId()); + return new UserResponse(user.getName(), user.getPhone(), user.getLoginId(), user.isAdAgreement(), + user.isAdSMSAgree(), user.isAdEmailAgree()); } } 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 6388fec4..45078968 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 @@ -17,4 +17,6 @@ public interface AuthService { void updatePhone(User user, UserPhoneRequest request); void deleteUser(User user); Long checkLogin(User user); + void updateAdSMSAgree(User user, UserAdSMSRequest request); + void updateAdEmailAgree(User user, UserAdEmailRequest request); } 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 a3757a03..37709c5d 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 @@ -9,10 +9,13 @@ import com.jishop.member.service.AuthService; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.Duration; + @Service @Transactional @RequiredArgsConstructor @@ -20,6 +23,7 @@ public class AuthServiceImpl implements AuthService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; + private final RedisTemplate redisTemplate; @Override public void signIn(SignInFormRequest form, HttpSession session) { @@ -69,6 +73,7 @@ public void updatePW(User user, UserNewPasswordRequest request){ String password = passwordEncoder.encode(request.password()); user.updatePassword(password); + updateUserCache(user); } // todo: 회원 정보 조회 @@ -79,10 +84,12 @@ public UserResponse getUser(User user){ // todo: 회원 정보 수정 (이름, 전화번호) public void updateUserName(User user, UserNameRequest request) { user.updateName(request.name()); + updateUserCache(user); } public void updatePhone(User user, UserPhoneRequest request) { user.updatePhone(request.phone()); + updateUserCache(user); } public void deleteUser(User user) { @@ -92,5 +99,22 @@ public void deleteUser(User user) { public Long checkLogin(User user) { return user.getId(); } + + public void updateAdSMSAgree(User user, UserAdSMSRequest request){ + user.updateAdSMSAgree(request.adSMSAgree()); + updateUserCache(user); + } + + public void updateAdEmailAgree(User user, UserAdEmailRequest request){ + user.updateAdEmailAgree(request.adEmailAgree()); + updateUserCache(user); + } + + private void updateUserCache(User user) { + String cacheKey = "user::" + user.getId(); + // 캐시 업데이트 (기존 캐시 삭제 후 최신 정보로 재설정) + redisTemplate.delete(cacheKey); + redisTemplate.opsForValue().set(cacheKey, user, Duration.ofMinutes(30)); + } }