From c0434b2f54f0240d69f9b97b257dd9a944f9488d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Mon, 19 Feb 2024 18:04:10 +0900 Subject: [PATCH] =?UTF-8?q?feature:=20User=EB=AA=A8=EB=93=88=20-=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=ED=83=88=ED=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-db.yml | 2 +- .../kac/data/pty/model/PtyCstmrGroup.java | 1 + .../pty/repository/PtyCstmrBasRepository.java | 2 +- .../repository/PtyCstmrGroupRepository.java | 12 +++ .../pty/repository/PtyGroupBasRepository.java | 2 + .../pty/service/PtyCstmrDomainService.java | 14 +-- .../pty/service/PtyGroupDomainService.java | 53 ++++++++++ .../pty/service/PtyTermsDomainService.java | 19 ++++ web/api-user/build.gradle | 2 + .../controller/UserAccountController.java | 16 ++- .../account/service/UserAccountService.java | 97 ++++++++++++++++++- .../kac/config/security/SecurityConfig.java | 5 +- 12 files changed, 205 insertions(+), 20 deletions(-) create mode 100644 data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyGroupDomainService.java create mode 100644 data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyTermsDomainService.java diff --git a/common/config-db/src/main/resources/application-db.yml b/common/config-db/src/main/resources/application-db.yml index 2223bde..19dd34c 100644 --- a/common/config-db/src/main/resources/application-db.yml +++ b/common/config-db/src/main/resources/application-db.yml @@ -9,4 +9,4 @@ spring: driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy jdbc-url: jdbc:log4jdbc:mysql://localhost:13306/PAV_KAC?characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true username: kac - password: palnet!234` \ No newline at end of file + password: palnet!234 \ No newline at end of file diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrGroup.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrGroup.java index 8fbc65a..496eb2e 100644 --- a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrGroup.java +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrGroup.java @@ -17,6 +17,7 @@ public class PtyCstmrGroup { // 고객그룹일련번호 @Id @Column(name = "CSTMR_GROUP_SNO") // mysql :: "int unsigned" + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long cstmrGroupSno; // 고객일련번호 diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyCstmrBasRepository.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyCstmrBasRepository.java index dd965dc..58e23d6 100644 --- a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyCstmrBasRepository.java +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyCstmrBasRepository.java @@ -5,7 +5,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -public interface PtyCstmrBasRepository extends JpaRepository { +public interface PtyCstmrBasRepository extends JpaRepository { @Query("select b from PtyCstmrBas b left join b.ptyCstmrDtl where b.userId = :userId") PtyCstmrBas findByUserId(@Param("userId") String userId); } diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyCstmrGroupRepository.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyCstmrGroupRepository.java index 693ab43..ec2b996 100644 --- a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyCstmrGroupRepository.java +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyCstmrGroupRepository.java @@ -2,7 +2,19 @@ package kr.co.palnet.kac.data.pty.repository; import kr.co.palnet.kac.data.pty.model.PtyCstmrGroup; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Optional; + +@Repository public interface PtyCstmrGroupRepository extends JpaRepository { + public Optional> findByCstmrSnoAndJoinYn(Long cstmrSno, String joinYn); + + public Optional> findByGroupId(String groupId); + + public Optional> findByCstmrSno(Long cstmrSno); + + public Optional findByGroupIdAndCstmrSno(String groupId, Long cstmrSno); } diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyGroupBasRepository.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyGroupBasRepository.java index 3e8a08c..d21ed3f 100644 --- a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyGroupBasRepository.java +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyGroupBasRepository.java @@ -2,7 +2,9 @@ package kr.co.palnet.kac.data.pty.repository; import kr.co.palnet.kac.data.pty.model.PtyGroupBas; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +@Repository public interface PtyGroupBasRepository extends JpaRepository { } diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainService.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainService.java index f27ad18..f63bfce 100644 --- a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainService.java +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainService.java @@ -2,14 +2,14 @@ package kr.co.palnet.kac.data.pty.service; import kr.co.palnet.kac.data.pty.model.PtyCstmrBas; import kr.co.palnet.kac.data.pty.model.PtyCstmrDtl; -import kr.co.palnet.kac.data.pty.model.PtyTermsAgreeTxn; import kr.co.palnet.kac.data.pty.repository.PtyCstmrBasRepository; import kr.co.palnet.kac.data.pty.repository.PtyCstmrDtlRepository; -import kr.co.palnet.kac.data.pty.repository.PtyTermsAgreeTxnRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.Optional; + @Slf4j @RequiredArgsConstructor @Service @@ -18,12 +18,16 @@ public class PtyCstmrDomainService { private final PtyCstmrDtlRepository ptyCstmrDtlRepository; - private final PtyTermsAgreeTxnRepository ptyTermsAgreeTxnRepository; + public PtyCstmrBas getCstmrInfoByUserId(String userId) { return ptyCstmrBasRepository.findByUserId(userId); } + public Optional findById(Long cstmrSno){ + return ptyCstmrBasRepository.findById(cstmrSno); + } + public PtyCstmrBas savePtyCstmrBas(PtyCstmrBas entity) { return ptyCstmrBasRepository.save(entity); } @@ -32,9 +36,7 @@ public class PtyCstmrDomainService { return ptyCstmrDtlRepository.save(entity); } - public PtyTermsAgreeTxn savePtyTermsAgreeTxn(PtyTermsAgreeTxn entity){ - return ptyTermsAgreeTxnRepository.save(entity); - } + diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyGroupDomainService.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyGroupDomainService.java new file mode 100644 index 0000000..6beada4 --- /dev/null +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyGroupDomainService.java @@ -0,0 +1,53 @@ +package kr.co.palnet.kac.data.pty.service; + +import kr.co.palnet.kac.data.pty.model.PtyCstmrGroup; +import kr.co.palnet.kac.data.pty.model.PtyGroupBas; +import kr.co.palnet.kac.data.pty.repository.PtyCstmrGroupRepository; +import kr.co.palnet.kac.data.pty.repository.PtyGroupBasRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Slf4j +@RequiredArgsConstructor +@Service +public class PtyGroupDomainService { + + private final PtyGroupBasRepository ptyGroupBasRepository; + + private final PtyCstmrGroupRepository ptyCstmrGroupRepository; + + public Optional> findJoinGroupByCstmrSno(Long cstmrSno){ + return ptyCstmrGroupRepository.findByCstmrSnoAndJoinYn(cstmrSno, "Y"); + } + + public Optional> findByGroupId(String groupId){ + return ptyCstmrGroupRepository.findByGroupId(groupId); + } + + public Optional> findByCstmrSno(Long cstmrSno){ + return ptyCstmrGroupRepository.findByCstmrSno(cstmrSno); + } + + public Optional findByGroupIdAndCstmrSno(String groupId, Long cstmrSno){ + return ptyCstmrGroupRepository.findByGroupIdAndCstmrSno(groupId, cstmrSno); + } + + public PtyCstmrGroup savePtyCstmrGroup(PtyCstmrGroup entity){ + return ptyCstmrGroupRepository.save(entity); + } + + public PtyGroupBas findById(String id){ + return ptyGroupBasRepository.findById(id).orElse(null); + } + + public PtyGroupBas savePtyGroupBas(PtyGroupBas entity){ + return ptyGroupBasRepository.save(entity); + } + + + +} diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyTermsDomainService.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyTermsDomainService.java new file mode 100644 index 0000000..c7e6b93 --- /dev/null +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyTermsDomainService.java @@ -0,0 +1,19 @@ +package kr.co.palnet.kac.data.pty.service; + +import kr.co.palnet.kac.data.pty.model.PtyTermsAgreeTxn; +import kr.co.palnet.kac.data.pty.repository.PtyTermsAgreeTxnRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@RequiredArgsConstructor +@Service +public class PtyTermsDomainService { + + private final PtyTermsAgreeTxnRepository ptyTermsAgreeTxnRepository; + + public PtyTermsAgreeTxn savePtyTermsAgreeTxn(PtyTermsAgreeTxn entity){ + return ptyTermsAgreeTxnRepository.save(entity); + } +} diff --git a/web/api-user/build.gradle b/web/api-user/build.gradle index 9501fe5..82be3ba 100644 --- a/web/api-user/build.gradle +++ b/web/api-user/build.gradle @@ -3,6 +3,7 @@ dependencies { implementation "$boot:spring-boot-starter-web" implementation "$boot:spring-boot-starter-data-jpa" + implementation "$boot:spring-boot-starter-security" // for paging // implementation("org.springframework.data:spring-data-commons") @@ -11,5 +12,6 @@ dependencies { implementation project(":data:pty") implementation project(":common:core") implementation project(":common:util") + compileOnly project(":web:security") } diff --git a/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/controller/UserAccountController.java b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/controller/UserAccountController.java index cb288af..023f84e 100644 --- a/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/controller/UserAccountController.java +++ b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/controller/UserAccountController.java @@ -8,10 +8,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @Slf4j @@ -28,7 +25,16 @@ public class UserAccountController { userAccountService.createUser(rq); - return ResponseEntity.status(HttpStatus.CREATED).body(null); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } + + @DeleteMapping("/delete") + @Operation(summary = "회원탈퇴", description = "유저의 계정을 탈퇴시키며 그룹의 참여여부도 모두 탈퇴시킵니다.") + public ResponseEntity deleteUser(){ + + userAccountService.deleteUser(); + + return ResponseEntity.status(HttpStatus.OK).build(); } diff --git a/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/service/UserAccountService.java b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/service/UserAccountService.java index e07236b..1b547af 100644 --- a/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/service/UserAccountService.java +++ b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/service/UserAccountService.java @@ -4,21 +4,25 @@ import kr.co.palnet.kac.api.v1.user.account.model.PtyCstmrDTO; import kr.co.palnet.kac.api.v1.user.account.model.PtyCstmrDtlDTO; import kr.co.palnet.kac.api.v1.user.account.model.register.FormRegisterRQ; import kr.co.palnet.kac.api.v1.user.account.model.register.AgreeTermsModel; +import kr.co.palnet.kac.config.security.util.SessionHelper; import kr.co.palnet.kac.core.exception.BaseErrorCode; import kr.co.palnet.kac.core.exception.BaseException; -import kr.co.palnet.kac.data.pty.model.PtyCstmrBas; -import kr.co.palnet.kac.data.pty.model.PtyCstmrDtl; -import kr.co.palnet.kac.data.pty.model.PtyTermsAgreeTxn; +import kr.co.palnet.kac.data.pty.model.*; import kr.co.palnet.kac.data.pty.service.PtyCstmrDomainService; +import kr.co.palnet.kac.data.pty.service.PtyGroupDomainService; +import kr.co.palnet.kac.data.pty.service.PtyTermsDomainService; import kr.co.palnet.kac.util.EncryptUtil; import kr.co.palnet.kac.util.HttpUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.Instant; import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; @Service @Slf4j @@ -27,6 +31,12 @@ public class UserAccountService { private final PtyCstmrDomainService ptyCstmrDomainService; + private final PtyGroupDomainService ptyGroupDomainService; + + private final PtyTermsDomainService ptyTermsDomainService; + + private final PasswordEncoder passwordEncoder; + @Transactional public void createUser(FormRegisterRQ rq) { @@ -36,8 +46,10 @@ public class UserAccountService { rq.setHpno(rq.getHpno().replaceAll("-", "")); + + //처리 1. 민감정보 암호화 처리(비밀번호 , 이름 , 휴대폰번호 , 이메일) - rq.setUserPswd(EncryptUtil.sha256Encrypt(rq.getUserPswd())); + rq.setUserPswd(passwordEncoder.encode(rq.getUserPswd())); rq.setHpno(EncryptUtil.encrypt(rq.getHpno())); rq.setEmail(EncryptUtil.encrypt(rq.getEmail())); @@ -67,10 +79,85 @@ public class UserAccountService { agreeEntity.setAgreeDt(LocalDateTime.now() ); } - ptyCstmrDomainService.savePtyTermsAgreeTxn(agreeEntity); + ptyTermsDomainService.savePtyTermsAgreeTxn(agreeEntity); } } } + @Transactional + public void deleteUser() { + Long cstmrSno = SessionHelper.getCstmrSno(); + + Optional> groupData = ptyGroupDomainService.findJoinGroupByCstmrSno(cstmrSno); + + if(groupData.isPresent() && !groupData.get().isEmpty()){ + + List groupInfo = groupData.get(); + + for(PtyCstmrGroup group : groupInfo) { + // 회원의 그룹 권한이 MASTER 일 경우 + if(group.getGroupAuthCd().equals("MASTER")) { + PtyGroupBas groupEntity = ptyGroupDomainService.findById(group.getGroupId()); + + // 그룹이 있을경우 그룹의 사용여부 "N" 값으로 저장 + if(groupEntity != null) { + groupEntity.setUseYn("N"); + ptyGroupDomainService.savePtyGroupBas(groupEntity); + } + + // 탈퇴하는 회원이 그룹의 MASTER일 경우 그룹 참여자의 Join여부를 N으로 업데이트 함 + Optional> cstmrEntityData = ptyGroupDomainService.findByGroupId(group.getGroupId()); + + // cstmrEntity 값이 있을 경우 참여여부 "N" 값으로 저장 + if(cstmrEntityData.isPresent()) { + + List cstmrEntity = cstmrEntityData.get(); + + for(PtyCstmrGroup cstmr : cstmrEntity) { + cstmr.setJoinYn("N"); + ptyGroupDomainService.savePtyCstmrGroup(cstmr); + } + } + } + + // 회원 고유번호로 데이터베이스에서 그룹참여정보 가져옴 + Optional> aprvlEntityData = ptyGroupDomainService.findByCstmrSno(cstmrSno); + + // AprvlEntity[그룹참여 정보가] 있을경우 + if(aprvlEntityData.isPresent()) { + + List aprvlEntity = aprvlEntityData.get(); + + // 그룹 승인여부를 "N"값으로 저장 + for(PtyCstmrGroup aprvl : aprvlEntity) { + aprvl.setAprvlYn("N"); + aprvl.setAprvlDt(null); + ptyGroupDomainService.savePtyCstmrGroup(aprvl); + } + + // 그룹 참여여부를 "N"값으로 저장 + Optional cstmrEntityData = ptyGroupDomainService.findByGroupIdAndCstmrSno(group.getGroupId(), cstmrSno); + if(cstmrEntityData.isPresent()) { + PtyCstmrGroup cstmrEntity = cstmrEntityData.get(); + + cstmrEntity.setJoinYn("N"); + ptyGroupDomainService.savePtyCstmrGroup(cstmrEntity); + } + } + } + } + + Optional userEntityData = ptyCstmrDomainService.findById(cstmrSno); + + if(userEntityData.isPresent()){ + PtyCstmrBas userEntity = userEntityData.get(); + userEntity.setCstmrStatusCd("W"); + userEntity.setCstmrStatusCngDt(LocalDateTime.now()); + + ptyCstmrDomainService.savePtyCstmrBas(userEntity); + } else { + throw new BaseException(BaseErrorCode.DATA_EMPTY, "토큰값 에러"); + } + } } diff --git a/web/security/src/main/java/kr/co/palnet/kac/config/security/SecurityConfig.java b/web/security/src/main/java/kr/co/palnet/kac/config/security/SecurityConfig.java index 2d08f82..0229305 100644 --- a/web/security/src/main/java/kr/co/palnet/kac/config/security/SecurityConfig.java +++ b/web/security/src/main/java/kr/co/palnet/kac/config/security/SecurityConfig.java @@ -17,6 +17,7 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.annotation.web.configurers.RequestCacheConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.NoOpPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @@ -52,9 +53,9 @@ public abstract class SecurityConfig { @Bean PasswordEncoder passwordEncoder() { -// return new BCryptPasswordEncoder(); + return new BCryptPasswordEncoder(); // TODO 테스트 후 BCryptPasswordEncoder 로 변경 - 회원가입 로직 구현 후 제거 - return NoOpPasswordEncoder.getInstance(); +// return NoOpPasswordEncoder.getInstance(); } @Bean