//default 로는 기존 클래스의 이름을 그대로 사용한다.
@Entity(name="Member")
ex)
@Entity
@Table(name="ORDERS")
public class Order {
//Data Filed
}
여기서 DDL이란?
Data Definition Language로서 스키마를 정의하거나, 수정 또는 삭제하기 위해 사용
테이블을 생성하고 변경,제거하는 기능을 제공
대표적으로 CREATE, DROP, ALTER문 등이 해당
객체의 데이터 필드와 테이블의 컬럼을 매핑!
ex)
@Entity
public class Member {
@Column(name = "name")
private String username;
@Enumerated(EnumType.STRING)
private Role role;
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;
@Lob
private String description;
}
필드에 기본 키를 매핑하기 위해 사용!
ex)
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
@Id Annotation : 필드에 기본 키 Mapping
@GeneratedValue Annotation : 기본 키의 저장 방식을 정함
IDENTITY: 데이터베이스에 위임, MySQL
SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, Oracle, @SequenceGenerator 필요
- 중요 속성
- sequenceName : 데이터베이스에 sequence로 등록할 이름
- initialValue : 초기 Id에 할당 될 값
- allocationSize: 데이터 베이스의 sequence값을 호출할 시에 증가하는 수
ex) SEQUENCE
@Entity
@SequenceGenerator(
name = “MEMBER_SEQ_GENERATOR",
sequenceName = “MEMBER_SEQ",
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용 , @TableGenerator 필요
- 모든 데이터 베이스에 적용 가능. But, 데이터베이스에 키 생성 전용 테이블을 하나 따로 만들어야 하기 때문에 성능이 좋지 못함!
- 중요 속성
- table : 키가 생성되어있는 테이블 명
- pkColumnValue : 키로 사용할 값 이름
- initailValue 와 allocationSize는 Sequence 전략과 같음
ex) Table
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = “MEMBER_SEQ", allocationSize = 1)
//데이터 베이스에"MEmBER_SEQ"라는 값을 날리게 됨.
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
AUTO: 자동 지정, 기본값!
- SEQUENCE 전략 & TABLE 전략 성능 최적화 방법!
sequence및 테이블의 Id 값을 데이터베이스와 통신을 하여 알아와야 함. 이 과정에서 성능이 저하 될 수 있음!
allocationSize를 조정함으로서 성능을 최적화 시킬 수 있음.
어떻게?
allocationSize가 1로 설정 되었다고 가정. Entity를 영속성 컨텍스트에 persist 시킬 때 마다 Id 값을 가져와야 함! -> allocationSize를 그럼 50으로 늘려 보자!
allocationSize가 50으로 늘어나게 되면 데이터베이스 상에서 sequence 및 table의 호출이 일어날 때마다 50씩 사이즈가 증가하게됨.
이는 우리 Application에서 sequence를 한번에 당겨서 50개를 읽어오게 되는 이유.
그러니, persist가 50개가 될 때 까지는 Id값을 위해 데이터베이스와 별도의 통신을 하지 않아도 됨!
그렇다면 allocationSize를 엄청 크게 ??
물론 더 많이 Id값을 당겨 오므로 좋을 수 있음.
하지만! Id값이 당겨 와진 상태로 서버가 다운이 된다면 메모리에 저장된 값을 다 날림. 즉, 나머지 만큼의 Id값을 잃어 버릴 수 있음.
적당히 크게 설정합시다~
이 글은 인프런 김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'을 수강하고 작성합니다.
출처:https://www.inflearn.com/course/ORM-JPA-Basic