ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #JPA-9 기본 키 매핑
    JPA 2021. 2. 16. 21:53

    [출처] 인프런 김영한 강사님 -자바 ORM 표준 JPA 프로그래밍 기본

     

    1. 기본 키 매핑 방법

    • 직접 할당: @Id만 사용

    • 자동 생성(@GeneratedValue)

    • IDENTITY: 데이터베이스에 위임, MYSQL

    • SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE

        • @SequenceGenerator 필요

    • TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용

        • @TableGenerator 필요

    • AUTO: 방언에 따라 자동 지정, 기본값

     

     

     

    2. IDENTITY 전략 - 특징

    DENTITY 전략 - 매핑
    값을뭔가 세팅하면 안된다. 빼고넣고 값을 NULL을 하면 as identity 나 auto_increment가 된다. 
    나는 모르겠고 DB야 니가 알아서 해줘 ^^(ID가 NULL로 들어감)

    기본 키 생성을 데이터베이스에 위임

    • 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용 (예: MySQL의 AUTO_ INCREMENT)

    • JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행

    (IDENTITY는 em.persist를 하는 시점에 실제 DB에 INSERT를 날려버림, em.persist를 할려면 항상 pk가 있어야하고, 1차 캐시에 값을쌓아야하는데 NULL값인 경우에 값을 넣는 방식이기때문에 울며 겨자먹기로 INSERT를 하는 것)

    • AUTO_ INCREMENT는 데이터베이스에 INSERT SQL을 실행 한 이후에 ID 값을 알 수 있음

    • IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행 하고 DB에서 식별자를 조회

     

    단점! . 쓰기 지연 SQL 저장소에 모아서 한번에 쿼리를 날리는게 불가능!

     

     

     

    3. SEQUENCE 전략

    데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트(예: 오라클 시퀀스)

    • 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용

    hibernate가 만든느 기본 sequence를 쓰지만 table마다 sequence를 따로 쓰고싶다면?
    sequence를 member_seq를 만들게 된다.

     

    특별하게 1 increment by 1 이런전략이 가능

     

    em.persist를할려면 항상 pk가 있어야한다.

    그러려면 먼저 sequence가 필요, sequence에서 내 pk를 가져와야한다. 그럼 MEMBER_SEQ 에서 call next value for MEMBER_SEQ로 값을 가져오고 member객체에 1이라는 pk를 넣고 영속성 컨텍스트에 저장하게 된다.

    여기서 아직 DB에 INSERT QUERY는 날라가지 않는다 왜냐하면 PK값만 딱 얻고 필요하면 BUFFERING을 해야하고 COMMIT시점에 QUERY를 날려야한다.

     

    위에 경우처럼 em.persit를 계속호출하면 어떻게되는가? 호출할때마다 pk를 가져오는것인가?

    em.persist할때마다 자꾸 next_call로 가져오게되면 어떻게든 network를 타기때문에 성능 문제가 조금 생길 수 있다.

    이걸 최적화하기 위해서 allocationSize만큼 땡기는 것이다. 미리 allocationSize만큼 DB에 올려 놓고 메모리에서 1씩 쓴다. 그러다가 다쓰면 또 allocationSize만큼 호출 

    여러 웹서버가 있어도 동시성 이슈없이 문제들이 해결된다.!!

     

    1 increment by 50

    첫 번째 call 1.

    두번째 call 51까지 미리가지고옴.

    그 다음 부터는 nextcall을 호출하지않고 51번을 만나는순간 미리호출해야해서 nextcall 한번 호출

     

    이론적으론 충분히 늘리면 좋지만 웹서버를 내리는순간 다 날려 버리면서 남은 숫자만큼 구멍이 생긴다.

    그래서 50~100사이가 적당

     

     

    4. TABLE 전략

    • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉 내내는 전략

    • 장점: 모든 데이터베이스에 적용 가능

    • 단점: 성능이 떨어진다.(Table을 직접사용하기 때문에 lock등 성능 이슈가 있다. )

    val 증가
    ID같은 위의  SEQUENCES에서 딴것이다.

    @TableGenerator - 속성

    운영에서는 TABLE 전략을 쓰는게 부담스럽다. why? -> 보통 DB에서 관례로 쓰는 것이 있기 때문에

     

    5. 권장하는 식별자 전략

     기본 키 제약 조건: null 아님, 유일, 변하면 안된다.(변하면 안되는 것을 찾는 것이 어렵다..ㅠ)

    • 미래까지 이 조건을 만족하는 자연키는 찾기 어렵다. 대리키(대 체키)를 사용하자.

    • 예를 들어 주민등록번호도 기본 키로 적절하기 않다.

    권장: Long형 + 대체키 + 키 생성전략 사용

    댓글

Designed by Tistory.