각 사용자의 권한을 부여하기 위해 Role과 관련된 테이블을 추가해줬습니다.
사용자(User)와 권한(Role) 간에는 다대다 관계가 있습니다. 즉, 한 사용자가 여러 개의 권한을 가질 수 있고, 한 권한도 여러 사용자에게 할당될 수 있습니다.
매핑 테이블을 만들 때는 보통 각각의 주요 테이블의 기본키(primary key)를 외래키(foreign key)로 참조하며, 이 외래키들이 결합하여 복합 기본키를 형성합니다.
여기서는 "user_role"이라는 매핑 테이블을 만들어 사용자와 권한 간의 다대다 관계를 나타낼 것입니다.
user_role 테이블은 다음과 같은 구조를 가집니다.
- user_id: 사용자를 식별하는 외래키
- role_id: 권한을 식별하는 외래키
💻 프로젝트 적용
1️⃣ mySql에 테이블 추가
- user_role
- role
💡 FK를 Not null 해주지 않은 이유는?
JPA에서는 Not null을 해줄 시에 오류가 많이 날 수 있기 때문에 Not null 을 풀어주어야 하는 경우가 많다고 합니다. 그래서 일단 Not null 을 지정하지 않았습니다.
2️⃣ Entity 추가
- UserRole.java
package com.example.demo.entity;
import jakarta.persistence.*;
import lombok.*;
@Entity(name = "user_role")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "role_id")
private Long roleId;
@ManyToOne
@JoinColumn(name = "role_id", insertable = false, updatable = false)
private Role role;
@ManyToOne
@JoinColumn(name = "user_id", insertable = false, updatable = false)
private UserEntity userEntity;
}
- Role.java
package com.example.demo.entity;
import jakarta.persistence.*;
import lombok.*;
import java.util.List;
@Entity(name = "role")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "role_name")
private String roleName;
@OneToMany(cascade = CascadeType.ALL)
private List<UserRole> userRoleList;
}
- UserEntity.java
// Role 일대다 관계
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private List<UserRole> roleList;
3️⃣ ROLE 테이블에서 role_name 설정
mySql에서 role 테이블에 들어가 role_name을 추가해주고 Apply를 누르면 id가 자동으로 생성(AI) 됩니다.
저의 경우엔 아래와 같이 권한을 지정해줬습니다.
- ROLE_USER : 일반 사용자
- ROLE_STORE_MANAGER : 유치원 관리자 (선생님)
- ROLE_ADMIN : 가장 최고 권한의 관리자. 모든 유치원들을 관리.
4️⃣ UserService.java
// 비밀번호 암호화
userEntity.setPassword(passwordEncoder.encode(userDTO.getPassword()));
// 사용자에게 UserRole 객체를 생성하고 이를 UserEntity의 역할 목록에 추가한 후 저장
List<UserRole> roleList = new ArrayList<>(); // UserRole 객체들을 저장할 ArrayList 생성
UserRole userRole = new UserRole(); // 새로운 UserRole 객체 생성
userRole.setRoleId(1L); // 새로 생성한 UserRole 객체의 role_id를 설정
roleList.add(userRole); // 생성한 UserRole 객체를 roleList에 추가
userEntity.setRoleList(roleList); // UserEntity에 roleList를 설정
userRepository.save(userEntity); // 변경된 UserEntity를 UserRepository를 통해 저장
💻결과
여기까지 하고 회원가입을 진행해본 결과
아래와 같이 DB에서는 잘 확인이 됐으나
💣스프링에서는 아래의 exception이 발생했습니다.
Table 'project1.user_roles' doesn't exist
데이터베이스에서 'project1' 스키마 내의 'user_roles' 테이블을 찾을 수 없다는 것을 의미합니다.
DB에 user_role 이라고 지정되었던 이름을 user_roles로 수정해주었습니다.
'Project 댕린이집' 카테고리의 다른 글
[로그인] 로그인 기능 구현 (0) | 2024.04.11 |
---|---|
[트러블슈팅] org.springframework.security.authentication.InternalAuthenticationServiceException (0) | 2024.04.08 |
[로그인] Spring Security + JWT 로그인 구현 (0) | 2024.03.15 |
[회원가입] 비밀번호 확인 (0) | 2024.03.06 |
[회원가입] 유효성 검사 (0) | 2024.03.05 |