Project/Todo

[Spring Boot] Member 서비스 구현 (2)

lakelight 2022. 7. 13. 00:20
728x90
반응형

비밀번호 제약 조건  확인 API

[ MemberService.java ]

/**
 * 비밀번호 제약조건 확인
 */
public boolean checkPasswordConstraint(String userPW){
    Pattern pattern = Pattern.compile("^(?=.*[a-zA-Z])(?=.*\\d).{8,20}$");
    return pattern.matcher(userPW).matches();
}

→ 이전에 만들었던 비밀번호 제약조건 확인하는 로직(영문 숫자 포함 8~20자리)으로 API 설계

[CheckPasswordConstraintRequest.java]

import lombok.Getter;

@Getter
public class CheckPasswordConstraintRequest {
    private String password;
}

 RequestBody로 사용할 클래스 생성

[ MemberController.java ]

@PostMapping("/password/constraint")
public Response passwordConstraint(@RequestBody CheckPasswordConstraintRequest request){
    boolean checkPW = memberService.checkPasswordConstraint(request.getPassword());

    if(checkPW){
        log.info("비밀번호 제약조건 Success Code:200 " + now.getDate()); //로그 시간
        return new Response(true, HttpStatus.OK.value(), null, "비밀번호를 사용 가능합니다.");
    } else {
        // 302 에러
        log.error("비밀번호 제약조건 Error Code:302 " + now.getDate()); //로그 시간
        return new Response(false, HttpStatus.FOUND.value(), null, "비밀번호는 영문과 숫자포함 8-20자리입니다.");
    }
}

 

비밀번호 일치 확인 API

[ CheckPasswordSameRequest.java ]

import lombok.Getter;

@Getter
public class CheckPasswordSameRequest {
    private String password;
    private String password_;
}

[ MemberController.java ]

@PostMapping("/password/same")
public Response passwordSame(@RequestBody CheckPasswordSameRequest request){
    if(request.getPassword().equals(request.getPassword_())){
        log.info("2차 비밀번호 일치 Success Code:200 " + now.getDate());
        return new Response(true, HttpStatus.OK.value(), null, "2차 비밀번호가 일치합니다.");
    } else {
        // 302 에러
        log.error("2차 비밀번호 불일치 Error Code:302 " + now.getDate());
        return new Response(false, HttpStatus.FOUND.value(), null, "2차 비밀번호가 일치하지 않습니다.");
    }
}

 

비밀번호 변경 API

[ Member.java ]

/**
 * 비밀번호 변경 (변경감지)
 */
private void setUserPW(String userPW) {
    this.userPW = userPW;
}

 변경 감지를 위한 setUserPW 메서드 구현

[ MemberService.java ]

/**
 * 비밀번호 변경 (변경 감지 이용)
 */
@Transactional
public UUID changePassword(String uuid, String userPW){
    Member member = findUserByUUID(uuid);
    if(member==null) return null; //회원 정보 없음

    //비밀번호 암호화
    String encodedPW = passwordEncoder.encode(userPW);

    //변경 감지를 이용한 사용자 비밀번호 업데이트
    member.setUserPW(encodedPW);

    return member.getUuid();
}

● 변경 감지를 이용한 changePassword 메서드 구현
   1. uuid를 통한 멤버를 영속성 컨택스트로 불러옵니다.
   2. 불러온 멤버 객체를 setUserPW 메서드를 통해서 데이터를 변경시켜줍니다.
   3. 메서드가 끝나고 영속석 컨택스트 내의 데이터 변경을 감지하여 변경 되었다면 update 쿼리를 자동으로 날려줍니다.

[ ChangePasswordRequest.java ]

import lombok.Getter;

@Getter
public class ChangePasswordRequest {
    private String uuid;
    private String password;
}

[ MemberController.java ]

/**
 * 비밀번호 변경을 위한 기존 비밀번호 확인
 */
@PostMapping("/password/origin")
public Response checkPasswordOrigin(@RequestBody ChangePasswordRequest request){
    Member member = memberService.findUserByUUID(request.getUuid());
    if(member!=null){
        if(member.matchPassword(passwordEncoder, request.getPassword())){
            log.info("회원 인증 Success Code:200 " + now.getDate());
            return new Response(true, HttpStatus.OK.value(), member.getUuid(), "회원 인증이 되었습니다.");
        } else {
            // 302 에러
            log.error("비밀번호 불일치 Error Code:302 " + now.getDate());
            return new Response(false, HttpStatus.FOUND.value(), null, "비밀번호가 일치하지 않습니다.");
        }
    } else {
        // 301 에러
        log.error("회원 정보 Error Code:301 " + now.getDate());
        return new Response(false, HttpStatus.MOVED_PERMANENTLY.value(), null, "등록되지 않은 회원입니다.");
    }
}

/**
     * 비밀번호 변경
     */
    @PutMapping("/password")
    public Response changePassword(@RequestBody ChangePasswordRequest request){
        boolean checkPW = memberService.checkPasswordConstraint(request.getPassword());
        if(checkPW){
            UUID uuid = memberService.changePassword(request.getUuid(), request.getPassword());

            if(uuid!=null){
                log.info("비밀번호 변경 Success Code:200 " + now.getDate());
                return new Response(true, HttpStatus.OK.value(), uuid, "비밀번호가 변경되었습니다.");
            } else {
                // 301 에러
                log.error("회원 정보 Error Code:301 " + now.getDate());
                return new Response(false, HttpStatus.MOVED_PERMANENTLY.value(), null, "등록되지 않은 회원입니다.");
            }
        } else {
            // 302 에러
            log.error("비밀번호 제약조건 Error Code:302 " + now.getDate());
            return new Response(false, HttpStatus.FOUND.value(), null, "비밀번호는 영문과 숫자포함 8-20자리입니다.");
        }
    }
728x90
반응형