백엔드/JPA

[JPA] 중간테이블

tero1115 2024. 5. 31. 10:44

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_idrole_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

 

이 예시에서 user1ROLE_USERROLE_ADMIN 역할을 모두 가지며, user2ROLE_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