[JPA] 기본키 매핑 전략

Dawon Seo·2022년 9월 10일
0

JPA

목록 보기
4/5
post-thumbnail

Spring Data JPA에서 엔티티의 기본키를 설정할 때 @Id 어노테이션을 사용합니다.

@Entity
public class Member{
	@Id
    private Long id;
    ...
}

이때 기본키를 할당하는 방법으로는 두 가지가 있습니다.

1. 직접 할당: 기본 키를 어플리케이션에서 직접 할당, 휴먼 에러에 주의
2. 자동 생성: 데이터베이스가 자동으로 생성

이 중에서도 기본키를 자동으로 생성하는 방법에는 네 가지 전략이 존재합니다.

  • IDENTITY
  • SEQUENCE
  • TABLE
  • AUTO

기본키를 직접 할당하는 경우에는 @Id 어노테이션만 사용하면 되지만, 자동 생성 전략을 사용하기 위해서는 @Id에 @GeneratedValue를 추가하여 사용해야 합니다.

1. IDENTITY

  • 기본 키 생성을 데이터베이스에 위임합니다,
  • 주로 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;
}

2. SEQUENCE

  • 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

3. TABLE

키를 생성해 주는 테이블을 생성하여 시퀀스를 흉내내는 전략입니다. 모든 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

4. AUTO

  • 사용하는 DB 특징에 따라 IDENTITY, SEQUENCE, TABLE 중 하나가 자동으로 선택됩니다.
  • @GeneratedValue의 기본값은 AUTO입니다.
  • DB를 변경해도 코드를 수정할 필요가 없으며, 주로 개발 초기나 프로토타입 개발에 사용합니다.
@Entity
public class Member{
	@Id
    @GeneratedValue(strategy GenerationType.AUTO)
    private Long id;
}

0개의 댓글