개발놀이터

JPA 기본키 매핑 본문

JPA/JPA

JPA 기본키 매핑

마늘냄새폴폴 2021. 8. 21. 20:33

*기본 키 매핑

기본 키 매핑 방법
1. 직접 할당 (@Id)
2. 자동 생성 (@GeneratedValue)
-IDENTITY : 데이터베이스에 위임, MYSQL
-SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE (@SequenceGenerator 필요)
-TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용 (@TableGenerator 필요)
-AUTO : 방언에 따라 자동 지정, 기본값


*IDENTITY 전략
-@GeneratedValue(strategy = GenerationType.IDENTITY) 
-기본 키 생성을 데이터베이스에 위임
-주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용 (ex) MySQL의 AUTO_INCREMENT)
-JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행
-AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행항 이후에 ID 값을 알 수 있음
-IDENTITY전략은 em.persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회

IDENTITY전략 - 약점 (?)
영속성 컨텍스트에는 PK와 해당 PK와 맞는 객체를 저장하고 있다. 하지만 IDENTITY 전략의 경우 ID가 부여되는 시점이 디비에 값이 들어가는 시점이다. 디비에 값이 들어가려면 쓰기지연 SQL 저장소에서 플러쉬를 해야 디비로 넘어간다. 그럼 플러쉬를 하는 시점에 IDENTITY 전략에서는 ID 를 NULL을 입력하기 때문에 ID값을 저장할 수 없다. 그래서 IDENTITY 전략에 한해서만 em.persist()를 한 시점에 INSERT 쿼리를 날린 후에 SELECT 문으로 ID를 다시 끄집어 와야 한다. 버퍼링같은 영속성 컨텍스트의 기능을 사용할 수 없지만 약점이라고 하기엔 조금 애매한 부분이 이렇게 em.persist()에 INSERT쿼리를 날리고 다시 ID를 끄집어온다고 하더라도 성능에서 드라마틱한 변화가 있지 않다. 값이 영원히 바뀌지 않는 자연키는 찾기 힘드므로 대리키를 사용해야 하는데 대리키를 사용하려면 IDENTITY 전략이 필수이다. 성능이 아주 조금 안좋더라도 명확하게 하기 위해서는 IDENTITY 전략을 사용해야 할 것이다. 


*SEQUENCE 전략
-데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트 (ex) 오라클 시퀀스)
-오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용

SEQUENCE 전략 - 매핑
@SequenceGenerator(
name= "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ",
initialValue = 1, allocationSize = 1) 이걸 클래스레벨에 어노테이션에 적어준다.

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR" generator에는 위에 @SequenceGenerator의 속성중 name을 적으면 된다.

SEQUENCE 전략 - 성능개선
SEQUENCE 전략은 디비의 현재 SEQUENCE에서 다음 값을 가져옴으로 인해서 영속성 컨텍스트에 PK 값을 저장한다. IDENTITY 전략처럼 INSERT문을 날리지 않아도 되니 영속성 컨텍스트가 제공하는 버퍼링같은 기능을 사용할 수 있다. 하지만 디비에서 값을 가져와야 하므로 네트워크의 연결이 항상 이루어질 수 밖에 없다. 그럼 성능면에서 좀 떨어질 수 있는데, 이를 개선하기 위해서 @SequenceGenerator의 속성 중 하나인 allocationSize를 디폴트값인 50으로 설정하면 된다. 50으로 설정하게 되면 디비에서 현재 SEQUENCE값에서 50개를 미리 만들어 놓는다. 그리고 50까지 메모리에서 값을 하나씩 증가시키면서 사용한다. 50에 도달하게 되면 다시 50개를 미리 만들어서 메모리에서 사용하도록 만든다. 


*TABLE 전략
-키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
-장점 : 모든 데이터베이스에 적용 가능
-단점 : 성능문제


*권장하는 식별자 전략
-기본 키 제약 조건 : null 아님, 유일, 변하면 안된다.
-미래까지 이 조건을 만족하는 자연키는 찾기 어렵다. 대리키(대체키)를 사용하자
-예를 들어 주민등록번호도 기본 키로 적절하지 않다.
-권장 : Long형 + 대체키(Auto_increment or Sequence) + 키 생성전략 사용

'JPA > JPA' 카테고리의 다른 글

JPA 상속관계 매핑  (0) 2021.08.23
JPA 연관관계의 주인  (0) 2021.08.23
JPA Entity 매핑  (0) 2021.08.21
JPA 영속성컨텍스트  (0) 2021.08.21
JPA 시작하기  (0) 2021.08.21