스프링MVC - 회원가입 구현
현재 학교 동아리에서 프로젝트 진행을 시작했다. 프로젝트 주제는 동아리에서 사용할 게시판 비스무리.
후배 한명과 같이 진행하는데 나는 백엔드를 맡았다.
DB는 Mysql을 사용하고, 서버 구현은 스프링을 사용한다.
그래서 우선 회원가입과 로그인을 구현하기로 했다.
DTO, Controller, Service, Entity, Repository 를 구현 할 것이다.
1. Dto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
@Setter
@NoArgsConstructor
public class MemberDto {
@NotBlank(message = "입력하세요!")
private String name;
@NotBlank(message = "입력하세요!")
@Size(min = 7, message = "7자 이상!")
private String studentId;
@NotBlank(message = "비밀번호를 입력해주세요.")
@Size(min = 8, max = 20, message = "8자~20자")
private String password;
@NotBlank(message = "입력해주세요.")
private String email;
@NotBlank(message = "휴대폰 번호를 입력해주세요.")
@Pattern(regexp = "(01[016789])(\\d{3,4})(\\d{4})", message = "올바른 휴대폰 번호를 입력해주세요.")
private String phoneNumber;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate joinDate;
public MemberDto(Member member) {
name = member.getName();
password = member.getPassword();
email = member.getEmail();
phoneNumber = member.getPhoneNumber();
studentId = member.getStudentId();
joinDate = member.getJoinDate();
}
@Builder
public MemberDto(String name, String studentId, String password, String email, String phoneNumber, LocalDate joinDate) {
this.name = name;
this.studentId = studentId;
this.password = password;
this.email = email;
this.phoneNumber = phoneNumber;
this.joinDate = joinDate;
}
public Member toEntity() {
Member member = Member.builder()
.name(name)
.password(password)
.email(email)
.phoneNumber(phoneNumber)
.studentId(studentId)
.joinDate(joinDate)
.build();
return member;
}
public void passwordEncoding(String encodingPassword) {
this.password = encodingPassword;
}
}
|
cs |
- ID를 학번(studentId)으로 대신한다
- Valid를 사용해서 유효성을 검사한다.
implementation 'org.springframework.boot:spring-boot-starter-validation'
- 비밀번호는 Service에서 암호화 할 것이다.
- 암호화된 비밀번호를 입력하기 위해서 setPassword 대신
passwordEncoding
메소드를 만들었다. toEntity
메소드를 이용해서 Dto를 Entity로 만든다.
2. Controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
@RequiredArgsConstructor
public class MemberSignController {
private final MemberService memberService;
@GetMapping("/signup")
public String signUp(MemberDto dto) {
return "/member/signup";
}
@PostMapping("/signup")
public String signUpPost(@Valid @ModelAttribute MemberDto memberDto, BindingResult bindingResult) throws Exception {
if (bindingResult.hasErrors()) {
return "/member/signup";
} else {
if (memberService.joinCheck(memberDto)) {
memberService.join(memberDto);
}
}
return "redirect:login";
}
@PostMapping("/idCheck")
@ResponseBody
public int idCheck(@ModelAttribute MemberDto memberDto) {
int count = memberService.studentIdCheck(memberDto.getStudentId());
return count;
}
}
|
cs |
- 회원가입 폼을 입력하여 제출하면 POST메소드로 컨트롤러에 request 된다.
- 유효성 검사를 하여 에러가 있으면 에러와 함께 회원가입 폼을 다시 리턴한다.
- 에러가 없으면 중복체크를 하고 회원가입 시키고 로그인 페이지로 리다이렉트를 한다.
idCheck
메소드는 ID 중복 확인을 해주는 메소드이다. 클라이언트가 중복확인 버튼을 누르면 ajax를 이용해서 ID중복 확인을 한다.
3. Service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MemberService {
private final MemberRepository memberRepository;
// 중복 회원 체크
public boolean joinCheck(MemberDto dto) {
Member findMember = memberRepository.findByStudentId(dto.getStudentId());
if (findMember == null) {
return true;
} else {
return false;
}
}
// 회원가입
@Transactional
public Long join(MemberDto memberDto) throws NoSuchAlgorithmException {
memberDto.passwordEncoding(encrypt(memberDto.getPassword()));
Member member = memberDto.toEntity();
Member findMember = memberRepository.findByStudentId(member.getStudentId());
if (findMember == null) {
memberRepository.save(member);
return member.getId();
} else{
return null;
}
}
public static String encrypt(String password) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] passByte = password.getBytes(StandardCharsets.UTF_8);
md.reset();
byte[] digested = md.digest(passByte);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < digested.length; i++) {
sb.append(Integer.toHexString(0xff & digested[i]));
}
return sb.toString();
}
}
|
cs |
joinCheck
메소드는 회원 중복확인을 해준다. studentId를 통해서 중복확인을 하고 중복회원이 없을경우 true, 중복일경우 false를 리턴한다.join
메소드는 dto의 비밀번호를 암호화 해서dto
를entity
로 만들어주고Repository
를 이용하여 DB에 회원을 save한다.- 여기서 암호화 메소드(encrypt)는 학교에서 교수님 수업시간에 배운 메소드이다.
Repository
1
2
3
4
5
6
|
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
public Member findByStudentId(String studentId);
}
|
cs |
- Spring Data Jpa를 활용하였다.
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
Entity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class Member extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
@Column(name = "student_id")
private String studentId; // 학번
private String password;
private String name;
private String email;
@Column(name = "phone_number")
private String phoneNumber;
@Column(name = "join_date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate joinDate; // 동아리 가입일
@Enumerated(EnumType.STRING)
@Column(name = "member_role")
private MemberRole memberRole;
@Builder
public Member(String password, String name, String email, String phoneNumber, String studentId, LocalDate joinDate) {
this.password = password;
this.name = name;
this.email = email;
this.phoneNumber = phoneNumber;
this.studentId = studentId;
this.joinDate = joinDate;
}
public void memberUpdate(String password, String email, String phoneNumber) {
this.password = password;
this.email = email;
this.phoneNumber = phoneNumber;
}
}
|
cs |
- lombok을 이용해서 getter만 구현하고 setter 대신 update 메소드를 만들었다.
- protect 레벨의 생성자만 구현해서 new 키워드로 이 엔티티를 무분별하게 생성하지 못하도록 했다.
'Spring > Spring MVC' 카테고리의 다른 글
[Spring Framework] 스프링 MVC - 로그인 (0) | 2021.05.25 |
---|
댓글