기본키 매핑

  • @Id 어노테이션은 꼭 필요하다.
  • 자동 생성을 위한 @grneratedValue 어노테이션을 붙일 수 있다.

KEY 자동 할당

  • key를 자동 할당하는 방법에는 IDENTITY, SEQUENCE, TABLE, AUTO 가 있다.
  • Key 자동 생성 시에는 해당 Entity의 PK로 설정한 필드에 아무 값도 설정하지 않고 DB에 저장해야 한다.

IDENTITY

  • 기본키 생성을 데이터베이스에 위임한다.
  • 원래는 em.persist()를 해도 쿼리가 바로 DB에 적용되지 않는 쓰기 지연이 JPA의 특징이지만,
  • IDENTITY 전략 사용시에는 즉시 insert 쿼리가 DB에 적용된다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Member member = new Member();
member.setName("hello");

em.persist(); //insert 쿼리 -> member에 id 값 세팅

Long id = member.getId(); //id값을 알 수 있다.

SEQUENCE

  • 시퀀스는 순서를 뜻하는 것으로 유일한 값을 순서대로 생성하는 것이다.
  • 특정 데이터베이스에는 유일한 값을 생성해 주는 시퀀스라는 오브젝트가 존재한다.
  • 해당 오브젝트로부터 PK로 사용할 유일한 값을 받아서 사용하는 것이다.
@SequenceGenerator(
    name = "member_seq_generator", 
    sequenceName = "member_seq",
    initialValue = 1,
    allocationSize = 50)
@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq_generator")
    private Long id;
}
Member member = new Member();
member.setName("hello");

em.persist(); //sequence 테이블에서 다음 id 값 불러와서 member 객체에 id 세팅
// insert 쿼리는 나가지 않음.

Long id = member.getId(); //id값을 알 수 있다.
  • IDENTITY 전략과 유사하지만,
  • SEQUENCE 전략일때는 DB의 시퀀스 테이블에서 값을 저장하지만 insert 쿼리는 나가지 않는다.

@SequeceGenerator의 속성

  • name : id 필드에 붙은 @GenerateValue의 generator 이름과 매칭된다.
  • sequenceName : DB에 생성될 시퀀스 테이블의 이름이다.
  • initialValue : 시퀀스 시작 값
  • allocationSize : 시퀀스 테이블에서 한 번에 받아올 시퀀스 사이즈 (아래에서 자세히 다룬다.)

TABLE

@TableGenerator(name = "member_seq_generator", 
        table = "MY_SEQUENCES", 
        pkColumnValue = "MEMBER_SEQ", 
        allocationSize = 1)
@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "member_seq_generator")
    private Long id;
}
  • 키 전용 테이블 하나 만들어 데이터베이스 시퀀스를 흉내내는 전략

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

  • 단점 : 성능이 DB 자동 생성에 비해 안 좋다.

AUTO

IDENTITY 전략과 유사하지만, 각 데이터베이스 방언에 따라 해당 데이터베이스의 기본 PK 생성 전략을 따른다.

  • ex) sequence : oracle, PostgreSQL, H2 등

SEQUENCE와 TABLE 전략의 성능 개선 방법

위의 예제에서 SEQUENCE 전략일 때는 DB의 시퀀스 테이블에서 다음 값을 불러와서 사용한다고 했다.

이렇게 하면 객체를 한번 저장할 때 마다 DB에 접근해야 하는 문제가 있다.
이 문제를 해결하기위해 allocationSize라는 개념을 도입해서 DB 접근 횟수를 줄인다.

allocationSize 속성

allocationSize = {size}를 설정하면 DB의 시퀀스 테이블의 값을 {size}만큼 증가시키고 
해당 {size}만큼의 시퀀스가 증가되는 동안은 메모리 환경에서 해당 값을 관리한다.

(ex)
initialValue = 1, allocationSize = 50일 경우

맨 처음 엔티티를 추가할 때, id =1로 설정하고 DB의 시퀀스 테이블의 다음 값은 51로 변경된다.

이후 다음 49번 동안은 엔티티를 추가할 때 
DB의 시퀀스 테이블에 접근하지 않고 메모리에서 값을 증가시켜서 사용한다

'CS > SPRING' 카테고리의 다른 글

SPRING FRAMEWORK + SPRING BOOT  (0) 2024.08.15
데이터베이스 스키마 자동 생성  (0) 2024.08.12
JPA 필드와 컬럼 매핑  (0) 2024.08.12
JPQL과 SQL의 차이점  (0) 2024.08.12
JPA의 영속성 컨텍스트  (0) 2024.08.12

+ Recent posts