Browse Source

feature: User모듈 - 회원탈퇴

pull/8/head
lkd9125(이경도) 7 months ago
parent
commit
c0434b2f54
  1. 2
      common/config-db/src/main/resources/application-db.yml
  2. 1
      data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrGroup.java
  3. 2
      data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyCstmrBasRepository.java
  4. 12
      data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyCstmrGroupRepository.java
  5. 2
      data/pty/src/main/java/kr/co/palnet/kac/data/pty/repository/PtyGroupBasRepository.java
  6. 14
      data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainService.java
  7. 53
      data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyGroupDomainService.java
  8. 19
      data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyTermsDomainService.java
  9. 2
      web/api-user/build.gradle
  10. 16
      web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/controller/UserAccountController.java
  11. 97
      web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/service/UserAccountService.java
  12. 5
      web/security/src/main/java/kr/co/palnet/kac/config/security/SecurityConfig.java

2
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`
password: palnet!234

1
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;
// 고객일련번호

2
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<PtyCstmrBas, Integer> {
public interface PtyCstmrBasRepository extends JpaRepository<PtyCstmrBas, Long> {
@Query("select b from PtyCstmrBas b left join b.ptyCstmrDtl where b.userId = :userId")
PtyCstmrBas findByUserId(@Param("userId") String userId);
}

12
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<PtyCstmrGroup, Integer> {
public Optional<List<PtyCstmrGroup>> findByCstmrSnoAndJoinYn(Long cstmrSno, String joinYn);
public Optional<List<PtyCstmrGroup>> findByGroupId(String groupId);
public Optional<List<PtyCstmrGroup>> findByCstmrSno(Long cstmrSno);
public Optional<PtyCstmrGroup> findByGroupIdAndCstmrSno(String groupId, Long cstmrSno);
}

2
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<PtyGroupBas, String> {
}

14
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<PtyCstmrBas> 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);
}

53
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<List<PtyCstmrGroup>> findJoinGroupByCstmrSno(Long cstmrSno){
return ptyCstmrGroupRepository.findByCstmrSnoAndJoinYn(cstmrSno, "Y");
}
public Optional<List<PtyCstmrGroup>> findByGroupId(String groupId){
return ptyCstmrGroupRepository.findByGroupId(groupId);
}
public Optional<List<PtyCstmrGroup>> findByCstmrSno(Long cstmrSno){
return ptyCstmrGroupRepository.findByCstmrSno(cstmrSno);
}
public Optional<PtyCstmrGroup> 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);
}
}

19
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);
}
}

2
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")
}

16
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<Object> deleteUser(){
userAccountService.deleteUser();
return ResponseEntity.status(HttpStatus.OK).build();
}

97
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<List<PtyCstmrGroup>> groupData = ptyGroupDomainService.findJoinGroupByCstmrSno(cstmrSno);
if(groupData.isPresent() && !groupData.get().isEmpty()){
List<PtyCstmrGroup> 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<List<PtyCstmrGroup>> cstmrEntityData = ptyGroupDomainService.findByGroupId(group.getGroupId());
// cstmrEntity 값이 있을 경우 참여여부 "N" 값으로 저장
if(cstmrEntityData.isPresent()) {
List<PtyCstmrGroup> cstmrEntity = cstmrEntityData.get();
for(PtyCstmrGroup cstmr : cstmrEntity) {
cstmr.setJoinYn("N");
ptyGroupDomainService.savePtyCstmrGroup(cstmr);
}
}
}
// 회원 고유번호로 데이터베이스에서 그룹참여정보 가져옴
Optional<List<PtyCstmrGroup>> aprvlEntityData = ptyGroupDomainService.findByCstmrSno(cstmrSno);
// AprvlEntity[그룹참여 정보가] 있을경우
if(aprvlEntityData.isPresent()) {
List<PtyCstmrGroup> aprvlEntity = aprvlEntityData.get();
// 그룹 승인여부를 "N"값으로 저장
for(PtyCstmrGroup aprvl : aprvlEntity) {
aprvl.setAprvlYn("N");
aprvl.setAprvlDt(null);
ptyGroupDomainService.savePtyCstmrGroup(aprvl);
}
// 그룹 참여여부를 "N"값으로 저장
Optional<PtyCstmrGroup> cstmrEntityData = ptyGroupDomainService.findByGroupIdAndCstmrSno(group.getGroupId(), cstmrSno);
if(cstmrEntityData.isPresent()) {
PtyCstmrGroup cstmrEntity = cstmrEntityData.get();
cstmrEntity.setJoinYn("N");
ptyGroupDomainService.savePtyCstmrGroup(cstmrEntity);
}
}
}
}
Optional<PtyCstmrBas> 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, "토큰값 에러");
}
}
}

5
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

Loading…
Cancel
Save