티스토리 뷰

각 사용자의 권한을 부여하기 위해 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에서는 잘 확인이 됐으나

user
user_role

 

💣스프링에서는 아래의 exception이 발생했습니다.

Table 'project1.user_roles' doesn't exist

데이터베이스에서 'project1' 스키마 내의 'user_roles' 테이블을 찾을 수 없다는 것을 의미합니다.

 

 

DB에 user_role 이라고 지정되었던 이름을 user_roles로 수정해주었습니다.

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함