New World

[해외공구관리사이트] 회원 - 가입 본문

Project/old

[해외공구관리사이트] 회원 - 가입

hyeovi 2022. 9. 5. 11:57
728x90
반응형

회원에서 사용하는 코딩 파일들

더보기

Domain

ㄴ Member

 

Service

ㄴ MemberService

ㄴ MemberServiceImpl

 

repository

ㄴ MemberRepository

 

JPA

ㄴ JPAMemberRepository

 

API

ㄴ MemberApiController

 

controller

ㄴ MemberController

 

 

가입 페이지의 기능

 

1. 회원 아이디와 동일한 아이디가 이미 DB에 저장되어있는지 확인할 것

2. 패스워드와 패스워드 체크값이 일치한지 확인할 것

3. 패스워드가 8자리 이상 16자리 이하인지 확인할 것

4. 패스워드에 공백이 있는지 확인할 것

5. 패스워드에 영문과 특수문자가 있는지 확인할 것

6. 전화번호가 13자리가 맞는지 동일한지 확인할 것

7. 전화번호 앞자리가 010이 맞는지 확인할 것

8. 회원 이미지 등록 or 등록하지 않는 경우 임의 이미지 등록 확인

9. ((중요)) 해외 공구 사이트만의 장점인 캐쉬 지갑 생성을 확인할 것

 

 

 

 

 

가입 정보를 위한 form을 만들어 request 로 서버로 넘겨준다.

package sample.shop.controller.data;

import javax.validation.constraints.NotEmpty;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class MemberForm {
    @NotEmpty(message = "회원 이름은 필수입니다.")
    private String name;

    @NotEmpty(message = "회원 아이디는 필수입니다.")
    private String id;

    @NotEmpty(message = "패스워드는 필수입니다.")
    private String pwd;

    @NotEmpty(message = "패스워드 체크는 필수입니다.")
    private String checkPwd;

    private String phone;
    private String city;
    private String street;
    private String zipcode;
}

 

controller

ㄴ MemberController

    @RequestMapping("/signin")
    public String signIn() {
        return "sample/member/signin";
    }

API

ㄴ MemberApiController

 

회원 가입을 해주기 위해 아까 만들었던 form으로 받은 값을 service로 넘겨준다. 이미지 파일은 따로 값을 받았기 때문에 이렇게 넘겨준다.

    private final MemberService memberService;
    private final FileService fileService;
    
    // 회원가입
    @PostMapping("/api/member/join")
    public Long saveMember(@RequestBody @Valid MemberForm request) {
        Long memberNo = memberService.join(request, fileService.fileUrl);

        return memberNo;
    }

Service

ㄴ MemberService

ㄴ MemberServiceImpl

 

회원 가입을 위한 join 메소드는 앞서 말했던 가입 페이지의 기능을 가능케 해준다.

    private final MemberRepository memberRepository;

    @Autowired
    private final JPAMemberRepository memberRepositoryJPA;

    private final CashService cashService;

    @Override
    @Transactional
    public Long join(MemberForm request, String fileUrl) {

        validateDuplicateMember(request.getId()); // 회원아이디중복확인
        checkPwd(request.getPwd(), request.getCheckPwd()); // 회원 비밀번호 일치 확인
        pwd(request.getPwd()); // 회원비밀번호 영어, 특문, 숫자 외 X (8~16문자 사이)
        checkPhone(request.getPhone()); // 전화번호가 맞는지 확인

        Member member = new Member();
        Address address = new Address(request.getCity(), request.getStreet(), request.getZipcode());

        member.setId(request.getId());
        member.setPwd(request.getPwd());
        member.setName(request.getName());
        member.setPhone(request.getPhone());
        member.setAddress(address);
        member.setGrade(Grade.USER);

        if (fileUrl != null) {
            member.setPhotoUrl(fileUrl);
        } else {
            member.setPhotoUrl("/img/upload/KakaoTalk_20220413_004209234.jpg");
        }

        Long cashNo = cashService.create(member);
        Cash cash = cashService.findByNo(cashNo);

        member.setCash(cash);

        memberRepository.save(member);

        return member.getNo();
    }

 

validateDuplicateMember 메소드는 repository의 findById 메소드를 통해 DB의 member 테이블에서 가입 페이지에서 입력한 id가 존재하는지 확인해준다. 만약, 입력한 id가 존재하는 경우에는 findMember 리스트에 값이 들어가게 되며 '이미 존재하는 아이디'라며 에러 메세지를 띄워준다.
    // 아이디 비교
    public void validateDuplicateMember(String id) {
        List<Member> findMember = memberRepository.findById(id);

        if (!findMember.isEmpty()) {
            throw new IllegalStateException("이미 존재하는 아이디입니다.");
        }
    }

checkPwd는 패스워드와 패스워드 확인 값이 일치한지 확인해준다. 만약 일치하지 않으면 에러 메세지를 띄워준다.

    public void checkPwd(String pwd, String checkPwd) {
        if (!pwd.equals(checkPwd)) {
            throw new IllegalStateException("패스워드와 패스워드 확인 값이 일치하지 않습니다.");
        }
    }

pwd 메소드는 영문자 대문자와 소문자와 특수문자가 들어가있는지 자릿수는 맞게 채웠는지 등 규칙에 맞게 입력했는지 검색해준다. checkPwd 메소드보다 뒤에 이 메소드를 넣어준 것은 pwd 를 실행해주는 것보다 checkPwd 메소드를 먼저 실행해주는 것이 시스템이 돌아가는 시간에 비해 더 효율적이라고 생각하였기 때문이다.

    public void pwd(String pwd) {

        String pwPattern = "^(?=.*\\d)(?=.*[~`!@#$%\\^&*()-])(?=.*[a-z])(?=.*[A-Z]).{9,12}$";
        Matcher matcher = Pattern.compile(pwPattern).matcher(pwd);

        pwPattern = "(.)\\1\\1\\1";
        Matcher matcher2 = Pattern.compile(pwPattern).matcher(pwd);

        if (!matcher.matches()) {
        }

        if (matcher2.find()) {
        }

        if (pwd.contains(" ")) {
        }
    }

checkPhone 메소드는 전화번호를 제대로 입력했는지 확인해주는 메소드이다. 전화번호가 개인 폰이나 공식적인 핸드폰일 경우를 고려하여 010이나 070이어야 하며 전화번호의 일정 길이 크기인 11자리가 되어야 하는 것을 생각하여 코딩하였다.

    public void checkPhone(String phone) {
        String firstPhone = phone.substring(0, 3);

        if (!(firstPhone.equals("010") || firstPhone.equals("070")) && phone.length() == 11) {
            throw new IllegalStateException("핸드폰 번호가 규칙에 맞지 않습니다");
        }
    }

 

repository

ㄴ MemberRepository

findById는 DB의 member 테이블에 입력값인 id와 동일한 값이 있는지 확인해주는 메소드의 역할을 해준다.

    public List<Member> findById(String id) {
        return em.createQuery("select m from Member m where m.id =: id", Member.class)
                .setParameter("id", id)
                .getResultList();
    }

 

반응형
Comments