본 내용은 유튜브 나무소리님의 강의 내용을 정리한 내용입니다.
JPA 3-4강 Entity Mapping(4)
Table 기본키 생성 전략
- 기본키 생성을 위해 별도의 테이블을 생성하고 이 테이블을 이용해 기본키를 생성합니다.
- Table 기본키 생성 전략은 별도의 테이블을 생성하기 때문에 데이터베이스 종류에 영향을 받지 않습니다.
- Table 생성 전략을 적용하기 위해서는 @TableGenerator 어노테이션이 필요하며 여러 옵션을 적용할 수 있습니다.
- Table 생성 전략은 테이블 생성과 키값 증가를 위한 update가 실행되기 때문에 성능에 대한 고려가 필요합니다.
package com.example.jpa.entity;
...
@NoArgsConstructor
@Data
@Entity
@Table(name = "customer_tb")
@TableGenerator( // 기본키 테이블 설정
name = "id_generator",
table = "customer_id",
pkColumnName = "id_name",
pkColumnValue = "customer_id",
valueColumnName = "next_value",
initialValue = 0, // 초기값 설정
allocationSize = 1)
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "id_generator")
private Long id;
private String name;
private Long registerDate;
...
}
- Table 기본키 생성 전략의 경우 해당 테이블(customer_id) 생성 후에 INSERT 쿼리를 실행합니다. (초기 값 설정)
- @TableGenerator 어노테이션을 사용하여 테이블 기반의 시퀀스를 생성하고, initialValue를 0으로 설정하였습니다. 그리고 allocationSize를 1로 설정하여 한 번에 1씩 증가하도록 하였습니다.
- Table 기본키 생성 전략의 경우 persist()가 실행될 때, 해당 테이블(customer_id)의 next_value를 조회하고, 1씩 증가시켜 다음 값을 얻게 됩니다.
- allocationSize의 값을 1로 설정할 경우 Sequence 기본키 생성 전략과 마찬가지로 성능 문제를 야기 할 수 있게 때문에 적절한 값을 세팅합니다.
필드와 컬럼 매핑 - @Column
- @Column 어노테이션은 영속 객체의 필드와 데이터베이스 테이블의 열(column)을 매핑할 때 사용합니다.
- @Column 어노테이션은 다양한 옵션 기능을 제공하며 이를 통해 영속 객체 필드의 속성을 정의할 수 있습니다.
- @Column의 여러 속성들은 대부분 선택적으로 사용하며 기본값이 지정되어 있습니다.
- @Column 어노테이션이 지정되지 않는 경우, 기본적으로 @Basic 어노테이션이 적용됩니다.
- @Basic 어노테이션은 테이블의 컬럼과 엔티티 객체의 필드 매핑을 위한 기본적인 설정을 해줍니다.
@Entity
@Table(name = "USERS")
public class User {
@Id
@Column(name = "USER_ID", nullable = false)
private Long userId;
@Column(name = "USER_NAME", nullable = false)
private String username;
@Column(name = "FIRST_NAME", nullable = false, length = 1)
private String firstName;
@Column(name = "LAST_NAME", nullable = false)
private String lastName;
...
}
@Column 옵션 | |
name | 해당 테이블 열의 이름을 지정 |
nullable | NULL 값 허용 여부(default : true) |
unique | Unique 제약 조건 여부(default : false) |
length | 문자(String)의 길이 지정(default : 255) |
precision | 숫자의 전체 자릿수 지정 |
scale | 소수점 이하 자릿수 지정 |
insertable | 엔티티가 저장될 때 컬럼이 저장될지 여부(default : true) |
updatable | 엔티티가 수정될 때 컬럼이 수정될지 여부(default : true) |
table | 컬럼이 속한 테이블 지정 |
columnDefinition | 컬럼에 대한 정의를 직접 지정 |
'JPA' 카테고리의 다른 글
JPA 기초 - @Embeddable (0) | 2024.01.17 |
---|---|
JPA 기초 - 연관관계의 방향성(ManyToOne, JoinColumn) (0) | 2024.01.16 |
JPA 기초 - 연관 관계의 이해 (0) | 2024.01.16 |
JPA 기초 - 필드와 컬럼 매핑(@Temporal, @Lob, @Enumerated, @Translent) (0) | 2024.01.15 |
JPA 기초 - 기본키 생성 전략(Sequence) (0) | 2024.01.14 |