[Spring Security] (7) Spring Security x React로 유저 인증 구현하기-1

Park Yeongseo·2024년 6월 12일
1

Spring Security

목록 보기
7/13
post-thumbnail

1. Introduction

이전 글을 2023년 10월 9일에 썼는데, 미루고 미루다 이제야 다음 내용을 쓰게 됐다.

인증 기능 구현 예제에서 사용하게 될 리포지토리는 바로 여기

이 예제에서 프론트엔드로는 React, 백엔드로는 Spring boot를 사용한다. 전체적인 인증 플로우는 이전 글의 다이어그램과 같다.

여기서 추가적으로 회원가입 기능이 들어간다. 회원의 username으로는 이메일을 사용하고, 회원가입 시 메일을 발송해 이메일을 인증하도록 한다.

Spring Dependencies

  • Spring Data JPA: DB와의 인터랙션을 위해 사용
  • Spring Data Redis: 리프레시 토큰 관리를 위해 사용
  • Spring Security: 전체적인 인증 관련 기능 구현을 위해 사용

2. 글의 순서

글의 순서는 다음처럼 될 것 같다.

  1. 사용자 정보를 담을 Member 엔티티 관련 기본 구현
  2. SecurityConfig 작성
  3. 예제에서 사용할 간단한 프론트 페이지 구현
  4. 이메일 인증 기능 추가
  5. 사용자 인증을 위한 UserDetails
  6. JWT 생성, 검출, 발급, 검증 구현
  7. 액세스 토큰
  8. 리프레시 토큰
  9. 로그인 유지

3. 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 패키지에는 MemberServiceMemberServiceImpl 밖에 없다. 나중에 이메일 발송 등의 기능은 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);  
    }  
}

1개의 댓글

comment-user-thumbnail
2024년 6월 12일

오랜만에 보는 스프링글이네요 최고

답글 달기