이전 글을 2023년 10월 9일에 썼는데, 미루고 미루다 이제야 다음 내용을 쓰게 됐다.
인증 기능 구현 예제에서 사용하게 될 리포지토리는 바로 여기
이 예제에서 프론트엔드로는 React, 백엔드로는 Spring boot를 사용한다. 전체적인 인증 플로우는 이전 글의 다이어그램과 같다.
여기서 추가적으로 회원가입 기능이 들어간다. 회원의 username으로는 이메일을 사용하고, 회원가입 시 메일을 발송해 이메일을 인증하도록 한다.
글의 순서는 다음처럼 될 것 같다.
Member
엔티티 관련 기본 구현SecurityConfig
작성UserDetails
member
도메인오늘은 1번, 사용자 정보를 담을 Member
엔티티와 관련한 것들을 구현해보자.
![[Pasted image 20240612164208.png]]
Member
엔티티@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Member {
@Id
private Long id;
@Column(name = "USERNAME")
private String username;//이메일이다
@Column(name = "PASSWORD")
private String password;
@Column(name = "EMAIL_CODE")
private String emailAuthenticationCode;//이메일 인증을 할 때 쓰일 코드
@Column(name = "ROLE")
private Role role;//현재 사용자가 가지고 있는 롤
}
public enum Role {
USER, ADMIN, GUEST
}
사용자의 role
은 회원가입 시 일단 GUEST
를 받고, 이메일 인증을 완료하면 USER
로 바뀌게 될 것이다.
MemberServiceImpl
아직 이메일 인증 기능은 추가되지 않았기 때문에, member.service
패키지에는 MemberService
와 MemberServiceImpl
밖에 없다. 나중에 이메일 발송 등의 기능은 MailService
를 만들고 구현하게 될 것이다.
MemberRepository
에는 이메일 중복을 위한 메서드만 정의되어 있다.
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
boolean existsByUsername(String username);
}
@Service
@RequiredArgsConstructor
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository;
//회원가입을 위해 쓰이는 메서드
@Override
@Transactional
public Member joinMember(MemberJoinDto memberJoinDto) throws Exception {//이 Exception은 나중에 구체적인 예외를 만들어 따로 처리해주자
if (isDuplicatedUsername(memberJoinDto.getUsername())) throw new Exception("중복된 이메일입니다.");
Member member = Member.builder()
.username(memberJoinDto.getUsername())
.password(memberJoinDto.getPassword())
.role(Role.GUEST)
.build();
return memberRepository.save(member);
}
//이메일 중복 확인을 위한 메서드
private boolean isDuplicatedUsername(String username) {
return memberRepository.existsByUsername(username);
}
}
MemberJoinDto
는 프론트엔드에서 보내는 회원가입 요청의 DTO다.
@Getter
@AllArgsConstructor
public class MemberJoinDto {
private String username;
private String password;
}
MemberController
MemberController
에서 사용될 API는 회원가입 밖에 없다. 이후 이메일 인증이 추가되면 API도 추가될 것.
@RestController
@RequestMapping("/member")
@RequiredArgsConstructor
public class MemberController {
private final MemberService memberService;
@PostMapping("/register")
public void signUp(@RequestBody MemberJoinDto joinDto) throws Exception { //이 Exception도 추후 구체적인 예외로 바꿔질 것
memberService.joinMember(joinDto);
}
}
오랜만에 보는 스프링글이네요 최고