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 |