User와 Role테이블이 있다고 가정
User는 id, username, password
Role은 id, name
User는 여러 Role을 가질 수 있고 Role은 여러 User를 가질 수 있으니 Many-to-Many관계이다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "user_role",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
private Set<Role> roles;
}
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(mappedBy = "roles")
private Set<User> users;
}
중간테이블
JPA가 user_role이라는 중간 테이블을 생성하여 User와 Role 간의 Many-to-Many 관계를 관리한다.
이 중간 테이블에는 user_id와 role_id 컬럼이 포함되어 있다.
User 테이블
| id | username | password |
| 1 | user1 | password1 |
| 2 | user2 | password2 |
Role 테이블
| id | name |
| 1 | ROLE_USER |
| 2 | ROLE_ADMIN |
user_role 중간 테이블
| user_id | role_id |
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
이 예시에서 user1은 ROLE_USER와 ROLE_ADMIN 역할을 모두 가지며, user2는 ROLE_USER 역할을 가진다.
JPA를 사용하면 중간 테이블을 직접 정의할 필요는 없고, 어노테이션을 통해 JPA가 자동으로 생성 및 관리하게 할 수 있다.
중간 테이블을 위한 JoinTable 설정
JPA의 @ManyToMany와 @JoinTable 어노테이션을 사용하여 중간 테이블을 자동으로 생성하고 관리한다.
중간 테이블 이름은 user_roles로 정의되고, user_id와 role_id가 외래 키로 사용된다.
각 엔티티에 ManyToMany 관계를 설정하면 JPA가 자동으로 user_roles 중간 테이블을 생성한다.
이 테이블은 사용자가 역할을 갖는 관계를 관리한다.
따라서, User와 Role 엔티티만 정의해주면 JPA가 나머지 작업을 처리한다.
이렇게 하면 데이터베이스에 필요한 세 가지 테이블이 생성되고, 각각의 관계가 올바르게 설정된다.
'백엔드 > JPA' 카테고리의 다른 글
| [JPA] JPA Repository 메소드 명명규칙 (0) | 2023.07.27 |
|---|---|
| [JPA] Entity 어노테이션 (0) | 2023.07.21 |