프로젝트를 생성했으니 이번에는 로그인 기능을 구현해보겠습니다.
로그인 기능은 Json Web Token을 이용한 토큰 인증 방식을 사용하는데, 이 부분은 아직 공부중이라 학습한 내용을 같이 정리해가면서 구현을 해보겠습니다.
프로젝트 계층 구조
요구 사항
- 회원 가입을 할 때 필요한 정보는 다음과 같다.
- email : 중복 x,
- password : encoding 할 것
- username
- nickname : 중복 x, 변경 가능
- role : 여러 개의 권한 가질 수 있음
생성할 클래스는
- Member.java
- Role.java
- MemberRole.java
- RoleType.java
Member와 Role은 각각 MemberRole 1대N 관계를 가진다.
구현
Member.java
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member extends EntityDate {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
@Column(nullable = false, length = 30, unique = true)
private String email;
private String password;
@Column(nullable = false, length = 20)
private String username;
@Column(nullable = false, unique = true, length = 20)
private String nickname;
@OneToMany(mappedBy = "member")
private List<MemberRole> roles = new ArrayList<>();
public Member(String email, String password, String username, String nickname) {
this.email = email;
this.password = password;
this.username = username;
this.nickname = nickname;
}
}
Role.java
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Role {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "role_id")
private Long id;
@Enumerated(EnumType.STRING)
private RoleType roleType;
public Role(RoleType roleType) {
this.roleType = roleType;
}
}
MemberRole.java
@Entity
public class MemberRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id")
private Role role;
}
RoleType.java
public enum RoleType {
ROLE_NORMAL, ROLE_SPECIAL_SELLER, ROLE_SPECIAL_BUYER, ROLE_ADMIN
}
코드 설명
간단한 코드여서 이번에는 설명은 간단하게..
@NoArgsConstructor(access = AccessLevel.PROTECTED) : 파라미터가 없는 생성자를 생성하는데, 이 생성자의 접근 제어자를 protected로 지정하는 역할을 합니다.
@GeneratedValue(strategy = GenerationType.IDENTITY) : JPA에서 엔티티 객체의 식별자(PK)를 데이터베이스가 생성하는 자동증가형(AUTO_INCREMENT) 필드로 생성하는 방식
결과
member 테이블
컬럼명 | 타입 | 제약 조건 | 설명 |
id | bigint | NOT NULL, PK | 멤버 ID |
varchar | NOT NULL, UNIQUE | 멤버 이메일 | |
password | varchar | NOT NULL | 멤버 비밀번호 |
username | varchar | NOT NULL | 멤버 이름 |
nickname | varchar | NOT NULL | 멤버 닉네임 |
role 테이블
컬럼명 | 타입 | 제약 조건 | 설명 |
id | bigint | NOT NULL, PK | 롤 ID |
role_type | varchar | NOT NULL, UNIQUE | 롤 타입 |
member_role 테이블
컬럼명 | 타입 | 제약 조건 | 설명 |
id | bigint | NOT NULL, PK | 멤버롤 ID |
member_id | bigint | NOT NULL, FK(member.id) | 멤버 ID (외래키) |
role_id | bigint | NOT NULL, FK(role.id) | 롤 ID (외래키) |
궁금한신점이나 잘못된 부분이 있으면 자유롭게 댓글 달아주세요.
github : https://github.com/jaeyeon423/spring_board_api
'spring > 게시판 api' 카테고리의 다른 글
Spring boot 게시판 API 서버 제작 (5) - 로그인 - 서비스 로직 구현 (0) | 2023.02.18 |
---|---|
Spring boot 게시판 API 서버 제작 (4) - 로그인 - 비밀번호 암호화 및 토큰 발급과 검증 (0) | 2023.02.18 |
Spring boot 게시판 API 서버 제작 (3) - 로그인 - create,update 시간 추가 & Repository 구현 (0) | 2023.02.17 |
Spring boot 게시판 API 서버 제작 (1) - 프로젝트 생성 (0) | 2023.02.17 |
Spring boot 게시판 API 서버 제작 (0) (0) | 2023.02.17 |