[JPA] 기본 키 매핑 (자동 생성)

Jake·2022년 3월 2일
0

JPA

목록 보기
1/3
post-thumbnail

인프런 김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'을 듣고 정리한 내용입니다.

1. Identity 전략

@Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
  • GeneratedValue는 키 생성을 db에게 맡긴다는 뜻이다. 이 때 사용되는 전략이 4가지 있는데, 그 중 하나가 바로 identity 전략입니다.
  • Identity 전략의 개요는 다음과 같습니다.
  • Identity 전략의 경우, insert 쿼리를 때려서 db에 데이터를 넣어보기 전까지는 id를 알 수가 없습니다. 따라서 jpa는 보통 commit 시점에 한 번에 쿼리를 때리는 반면, 여기서는 어쩔 수 없이 EntityManager.persist() 메서드 호출 즉시 insert 쿼리를 날리게 됩니다.

2. Sequence 전략

@SequenceGenerator(name = "GENERATOR_NAME",
        sequenceName = "매핑할 데이터베이스 시퀸스 이름",
        initialValue = '시작 값', allocationSize = '증가 값')
        
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
  • initialValue : 말 그대로 시작할 값
  • allocationValue : 한 번 sequence generator를 호출할 때 마다 증가시킬 값. Default = 50

Sequence 전략 개요는 다음과 같습니다.

  • 왜 allocationValue의 default 값이 50일까?
    • allocationValue = 1일 때는 identity 전략과 다를 것이 없습니다.
    • allocationValue = 50일 때는 다음과 같은 일이 일어납니다.
      → 한 번 호출 시 DB에는 50개를 땡겨놓습니다. (미리 확보)
      메모리에서 1 ~ 50까지 씁니다.
      → 50까지 다 쓰면 다시 DB에서 땡겨옵니다. 이렇게 하면 계속해서 DB와 통신할 필요가 없습니다.

그렇다면 멀티스레딩 상황 등에서는 어떻게 동작할까요?

  • DB에서 미리 값을 올려놓기 때문에 멀티스레드 환경에서도 안전하게 동작이 가능합니다.

3. Identity v.s Sequence

  • Identity 전략

    • 장점 : Sequence 전략에 비해 키 값이 낭비되지 않습니다.
    • 단점 : DB와의 통신이 잦습니다.
  • Sequence 전략

    • 장점 : DB와의 통신이 적습니다.
    • 단점 : 키 값이 낭비될 우려가 있습니다.
  • 하나의 트랜젝션에서 insert를 여러번 해야한다면 Sequence 전략을 사용해서 db 통신을 최소화하는 것이 바람직합니다.

  • 반대로 트랜젝션에서 insert의 빈도가 적다면 Identity 전략을 사용해서 키 값의 낭비를 막는 것이 바람직할 가능성이 높습니다.

4. 기타 전략

  • Table : 키 생성용 테이블을 운영하는 것으로, 모든 DB에서 적용 가능하나 성능이 떨어지는 단점이 있습니다.
  • Auto : 각 데이터베이스의 방언에 따라 자동으로 기본키 매핑을 할 수 있도록 해줍니다. @GeneratedValue의 디폴트 값입니다.
profile
Java/Spring Back-End Developer

0개의 댓글