Spring Data JPA에서 엔티티의 기본키를 설정할 때 @Id 어노테이션을 사용합니다.
@Entity
public class Member{
@Id
private Long id;
...
}
이때 기본키를 할당하는 방법으로는 두 가지가 있습니다.
1. 직접 할당: 기본 키를 어플리케이션에서 직접 할당, 휴먼 에러에 주의
2. 자동 생성: 데이터베이스가 자동으로 생성
이 중에서도 기본키를 자동으로 생성하는 방법에는 네 가지 전략이 존재합니다.
IDENTITY
SEQUENCE
TABLE
AUTO
기본키를 직접 할당하는 경우에는 @Id 어노테이션만 사용하면 되지만, 자동 생성 전략을 사용하기 위해서는 @Id에 @GeneratedValue를 추가하여 사용해야 합니다.
- 기본 키 생성을 데이터베이스에 위임합니다,
- 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용합니다.
- 쓰기 지연이 발생되지 않고, Insert 쿼리가 생성되고 쓰기 지연 SQL 저장소에 쿼리를 전달하자마자 flush()가 일어납니다.
쓰기 지연 (transactional write-behinde): 영속성 컨텍스트에 변경이 발생했을 때, 바로 데이터베이스로 쿼리를 보내지 않고 버퍼에 SQL 쿼리를 모아 놨다가, 영속성 컨텍스트가 flush하는 시점에 모아둔 SQL 쿼리를 데이터베이스로 보내는 기능
@Entity
public class Member{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
- DB의 시퀀스 오브젝트를 사용합니다.
-주로 Oracle, PosgreSQL, DB2, H2 등에서 사용할 수 있습니다.
@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ",
initialValue = 1,
allocationSize = 50
)
public class Member{
@Id
@GeneratedValue(strategy GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
name
: id 필드의 GeneratedValue에서 참조할 식별자 생성기 이름sequenceName
: DB에서 생성되는 시퀀스 오브젝트 이름initialValue
: 시퀀스가 시작하는 값allocationSize
: DB에서 가져오는 시퀀스의 한번 호출에 증가하는 값의 크기, 기본값 50키를 생성해 주는 테이블을 생성하여 시퀀스를 흉내내는 전략입니다. 모든 DB에 적용 가능하나 성능은 좋지 않습니다.
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = "MEMBER_SEQ", allocationSize=1)
public class Member{
@Id
@GeneratedValue(strategy GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
)
name
: id 필드의 GeneratedValue에서 참조할 식별자 생성기 이름table
: 키 생성 테이블 이름pkColumnValue
: 키로 사용할 값 이름allocationSize
: DB에서 가져오는 시퀀스의 한번 호출에 증가하는 값의 크기, 기본값 50
- 사용하는 DB 특징에 따라 IDENTITY, SEQUENCE, TABLE 중 하나가 자동으로 선택됩니다.
- @GeneratedValue의 기본값은 AUTO입니다.
- DB를 변경해도 코드를 수정할 필요가 없으며, 주로 개발 초기나 프로토타입 개발에 사용합니다.
@Entity
public class Member{
@Id
@GeneratedValue(strategy GenerationType.AUTO)
private Long id;
}