[JPA] 복합키 사용

서론

복합키는 기본키가 되지 못하는 칼럼들을 서로 묶어서 기본키처럼 사용하는 것입니다.

Entity

예를 들어 사용자명과 이메일을 복합키로 사용한다고 가정합니다. 복합키로 묶는 CompositePK 클래스를 생성하고, @IdClass 어노테이션을 사용하여 설정합니다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@Entity
@Table(name = "tb_user")
@IdClass(CompositePK.class) //이름과 이메일을 primary key로 사용
@Data
public class User {

@Data
@AllArgsConstructor
@NoArgsConstructor
public static class CompositePK implements Domain {

/** 사용자명 */
@Column(nullable = false, length = 100)
private String name;

/** 이메일 */
@Column(length = 45)
private String email;
}

/** 사용자비밀번호 */
@Column(nullable = false, length = 100)
private String password;

/** 연락처 */
@Column(length = 20)
private String tel;

/** 생성일시 */
@CreationTimestamp
private LocalDateTime createDate;

/** 수정일시 */
@UpdateTimestamp
private LocalDateTime updateDate;

/** 권한 */
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private UserRole role;

public enum UserRole {
ADMIN, GUEST
}
}

Repository

Repository 인터페이스를 생성하고 JpaRepository 를 상속받습니다.

1
2
public interface UserRepository extends JpaRepository<User, CompositePK>  {
}

사용

Service 클래스를 생성하고 Repository 인터페이스를 불러와서 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
@Service
@Transactional
public class UserService {

@Autowired
private UserRepository userRepository;

public User get(CompositePK id) {
return userRepository.findById(id).orElse(null);
}
}
Share