기본 키 매핑
기본 키 매핑은 @Id
어노테이션을 사용하여 테이블의 기본키와 매핑시키는 것이다. 테이블에 새로운 데이터를 생성하기 위해서는 기본 키가 필수적으로 필요하게 되고 JPA는 이러한 기본 키를 생성하기 위한 몇가지 전략을 제공한다.
- 직접할당: 기본 키를 애플리케이션에서 직접 할당
- 자동생성: 대리 키 사용 방식
- IDENTITY: 기본 키 생성을 데이터베이스에 위임
- SEQUENCE: 데이터베이스 시퀀스를 사용하여 기본 키 할당
- TABLE: 키 생성 테이블을 사용
기본 키 직접 할당 전략
기본 키를 직접 할당하기 위해서는 @Id
어노테이션을 사용하여 매핑하면 된다.
1
2
3
@Id
@Column(name = "member_id")
private String id;
기본 키를 직접 할당 하기 위해서는 em.persist()
로 엔티티를 영속화 하기 전에 애플리케이션에서 기본 키를 직접할당 해야한다.
1
2
3
Member member = new Member();
member.setId("memberA");
em.persist(member);
IDENTITY 전략
IDENTITY 전략은 기본 키 생성을 데이터베이스에 위임하는 전략이다. 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용된다. 예로 MySQL에서 해당 전략을 사용하게 되면 MySQL의 AUTO_INCREMENT 기능을 사용하여 기본 키를 자동으로 생성해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity
@Table(name = "tb_member")
public class Member {
@Id // 기본 키 매핑
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
@Column(name = "member_nm")
private String memberNm;
private Integer age;
}
IDENTITY 전략 사용 시 주의
엔티티가 영속 상태가 되려면 식별자가 반드시 필요하다. 하지만 IDENTITY 전략을 사용하는 경우는 데이터가 실제 INSERT 되기 전까지 식별자를 알 수 없다. 그로인해 em.persist()
를 호출하는 즉시 INSERT SQL이 데이터베이스에 전달된다. 따라서 해당 전략은 트랜잭션을 지원하는 쓰기지연이 동작하지 않는다.
SEQUENCE 전략
데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트로 SEQUENCE 전략은 이 시퀀스를 사용하여 기본 키를 생성하는 전략이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Entity
@Table(name = "tb_member")
public class Member {
@Id // 기본 키 매핑
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "member_seq_generator") // 시퀀스 생성기 선택
@Column(name = "member_id")
private Long id;
@Column(name = "member_nm")
private String memberNm;
private Integer age;
}
IDENTITY 전략과 SEQUENCE 전략
IDENTITY 전략 사용시에는 em.persist()
호출 뒤 INSERT SQL 바로 발생되는 반면에 SEQUENCE 전략의 경우는 em.persist()
를 호출할 때 먼저 데이터베이스 시퀀스를 사용하여 식별자를 조회한다. 그리고 조회한 식별자를 엔티티에 할당한 후 엔티티를 영속성 컨텍스트에 저장한다. 이후 트랜잭션을 커밋하여 플러시가 발생되면 엔티티를 데이터베이스에 저장한다.
Table 전략
Table 전략은 식별자 생성 전용 테이블을 만들고 이를 활용하여 데이터베이스 시퀀스를 흉내내는 전략이다. 해당 전략은 테이블을 사용하므로 시퀀스를 지원하지 않는 데이터베이스에서도 사용이 가능하다는 장점이 있다.
create table sequences (
sequence_name varchar(255) not null,
next_val bigint,
primary key (sequence_name)
);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Entity
@TableGenerator(
name = "member_sequence_generator",
table = "sequences",
pkColumnValue = "member_sequence"
)
@Table(name = "tb_member")
public class Member {
@Id // 기본 키 매핑
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "member_sequence_generator")
@Column(name = "member_id")
private Long id;
@Column(name = "member_nm")
private String memberNm;
private Integer age;
}
AUTO 전략
AUTO 전략의 경우는 데이터베이스 방언에 따라 JPA가 자동으로 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 선택하는 전략이다. 예를 들어 오라클의 경우는 SEQUENCE를 MySQL의 경우는 IDENTITY를 사용한다.
Comments powered by Disqus.