[JPA] 기본키 매핑(JPA 기본편 by 김영한)

su_y2on·2022년 1월 20일
0

JPA

목록 보기
5/17
post-thumbnail

기본키 매핑

기본키 매핑방식은 크게 직접 할당과 자동할당이 있습니다.


직접할당(권장x)

@Id 사용해서 직접 id를 할당해줄 수 있습니다.

    @Id 
    private Long id;




자동할당

@GeneratedValue를 사용하면 자동할당을 해줍니다. 전략은 크게 3가지가 있습니다.

IDENTITY

기본 키 생성을 데이터베이스에 위임하는 것입니다. 주로 MySQL, PostgreSQL, SQL Server, DB2 사용합니다.
(예: MySQL의 AUTO_ INCREMENT)

  @GeneratedValue(strategy = GenerationType.IDENTITY) // DB에 pk설정 위임, DB에 들어갈때 pk결정 따라서 
  private Long id;

AUTO_ INCREMENT는 insert 쿼리 후에 pk값을 알 수 있기 때문에 JPA에서 persist후에 1차 캐시에 제대로 저장을 할 수 없습니다. 따라서 identity전략은 persist시에 즉시 insert쿼리를 실행하고 DB에서 식별자를 조회해옵니다.



SEQUENCE

시퀸스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트입니다. 주로 오라클, PostgreSQL, DB2, H2에서 사용가능합니다. (예: 오라클 시퀀스)
이때 @SequenceGenerator를 사용해서 따로 시퀀스를 커스텀해서 생성해줄 수도 있습니다. 따로 없다면 DB에서 default로 설정된 시퀸스가 적용됩니다.

@Entity
@SequenceGenerator(
	name = “MEMBER_SEQ_GENERATOR",
	sequenceName = “MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
	initialValue = 1, allocationSize = 1)
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
	private Long id;

시퀀스전략은 DB의 시퀀스에 저장되어있는 id값을 persist()시에 얻어와서 1차 캐시에 넣어줍니다. 그리고 commit시에 flush되면서 DB에 들어갑니다. 근데 persist를 할때마다 이렇게 시퀸스에서 id값을 가져오면서 쿼리를 날리기때문에 성능이 저하될 수 있습니다. 따라서 이를 최적화하기위해 메모리로 많이씩 미리 땡겨와서 DB에 쿼리를 날리지 않을 수 있습니다. 이는 allocationSize를 조절하면 가능합니다. default값은 50입니다




TABLE

키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략입니다. 장점은 모든 데이터베이스에서 사용이 가능하지만 따로 테이블을 만들어야하기때문에 성능에 영향을 줄 수 있어 굳이 권장되지 않습니다.

@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;

0개의 댓글