본문 바로가기

Proj/webClass

회원가입 개발 및 간단한 리팩토링

1. 회원가입 폼 클래스

@Getter
public class SignupBody {

    @NotBlank
    private String name;

    @NotBlank
    private String userId;
    @NotBlank
    private String password;

    @NotBlank
    private LocalDate birth;
    @NotBlank
    private Gender gender;

    //학생일 경우 필요한 필드
    @NotBlank
    private int grade;
    @NotBlank
    private String line;
    @NotBlank
    private String school;

    @NotBlank
    @Email
    private String email;
    @NotBlank
    private String phone;
    @NotBlank
    private boolean receiveAd;
    @NotBlank
    private boolean agreeTerm;


}

 

화면을 기준으로 회원가입 폼을 받고 validation으로 데이터 적합성 처리를 해주었다.

 

2. 회원가입 컨트롤러

    @PostMapping("/login/sign-up")
    public ResponseEntity signUp(@RequestBody SignupBody signupBody) {

        memberService.signUp(signupBody);

        return ResponseEntity.status(201).body("Created. 회원가입 완료");
    }

회원가입 폼이 들어오면 서비스 계층으로 넘겨준다.

 

3. 서비스 계층

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {

    private final MemberRepository memberRepository;
    private final PasswordEncoder passwordEncoder;          //비밀번호 암호화용 인코더


    @Transactional
    public Long signUp(SignupBody signupBody) {


        Student student = Student
                .builder()
                .name(signupBody.getName())
                .userId(signupBody.getUserId())
                .password(passwordEncoder.encode(signupBody.getPassword()))
                .birth(signupBody.getBirth())
                .gender(signupBody.getGender())
                .grade(signupBody.getGrade())
                .line(signupBody.getLine())
                .school(signupBody.getSchool())
                .email(signupBody.getEmail())
                .phone(signupBody.getPhone())
                .receiveAd(signupBody.isReceiveAd())
                .agreeTerm(signupBody.isAgreeTerm())
                .cash(0)
                .mileage(0)
                .isWithdraw(false)
                .createdDate(now())
                .lastLoginDate(null)
                .lastPwModifiedDate(now())
                .isSleep(false)
                .teacherOrStudent(ClassRole.Student)
                .build();


        Member savedStudent = memberRepository.save(student);

        return savedStudent.getId();

    }


    public boolean checkDuplicateId(String userId) {
        return memberRepository.findByUserId(userId) == null;
    }


}

 

 일단은 모든 회원을 학생으로 처리하고 이후 강사 신청을 받는 방향으로 얘기가 됐기 때문에 이와 같이 처리했다.

 비밀번호는 스프링 시큐리티의 인코더로 암호화를 한 값을 저장한다.

 처음에는 회원가입 폼을 이용한 생성자로 처리하였으나 이쪽이 더 안전하므로 바꾸었다.

 

 학생이 멤버를 상속받는 데, 양쪽에 @SuperBuilder 애노테이션을 붙이면 상속 관계에서 빌더 패턴을 사용하여 객체를 생성할 수 있다.

@Configuration
@EnableWebSecurity
public class SecurityConfig {


    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

 인코더는 스프링 시큐리티 설정 클래스에서 빈으로 등록하였다.

 

4. 회원 리포지토리

@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {

    public Member findByUserId(String userId);
}

 

스프링 데이터 jpa를 사용하여 리포지토리를 만들었다. findByUserId는 아이디 중복 여부를 확인하기 위함이다.

'Proj > webClass' 카테고리의 다른 글

고객센터 Q&A crud 구현  (0) 2024.04.10
로그인 구현  (0) 2024.04.02
Hello Spring Security  (1) 2024.03.27