티스토리 뷰
객체와 테이블 매핑
@Entity
- @Entity가 붙은 클래스는 JPA가 관리
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수
속성 : name
- JPA에서 사용할 엔티티 이름 지정 (기본값: 클래스 이름)
@Table
- @Table은 엔티티와 매핑할 테이블 지정
데이터베이스 스키마 자동 생성
- DDL(Database Definition Langauge)을 애플리케이션 실행 시점에 생성
- 테이블 중심 -> 객체 중심
- 데이터베이스 Dialect에 맞게 적절한 DDL 생성
- 개발 장비에서만 사용, 운영서버에서는 사용하지 않는다
속성
hibernate.hbm2ddl.auto
- 운영 장비에는 절대 create, create-drop, update 사용하면 안된다
- 제약 조건 추가: 회원 이름 필수, 10자 초과 @Column(nullable = false, length = 10)
- 유니크 제약 조건 : @Table(uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE", columnNames = {"NAME",
"AGE"} )})
-> @Column의 unique보다 @Table의 unique 제약 조건을 걸어야 해당 이름을 알 수 있다 (예외 처리 편리)
필드와 컬럼 매핑
매핑 어노테이션 정리
@Column
@Enumerated
- Java enum 타입을 매핑할 때 사용
- ORDINAL 타입말고 STRING 사용!
- ORDINAL 사용하면 숫자로 들어가는데 나중에 enum에 새로운 값이 들어가면 구별 불가능
@Temporal
- 날짜 타입을 매핑할 때 사용
- LocalDate, LocalDateTime을 사용하면 생략이 가능
@Lob
- 데이터베이스 BLOB, CLOB 타입과 매핑
- 문자면 CLOB 매핑, 나머지는 BLOB
@Transient
- 필드 매핑 X, 데이터베이스에 저장 X, 조회 X
- 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
기본 키(Primary Key) 매핑
@Id
@GeneratedValue
기본 키 매핑 방법
- 직접 할당 : @Id 사용
- 자동 생성 (@GeneratedValue)
- IDENTITY : 데이터베이스에 위임, MySQL
- SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE, @SequenceGenerator 필요
- TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용, @TableGenerator 필요
- AUTO : Dialect에 따라 자동 지정, 기본값
IDENTITY 전략 - 특징
- 기본 키 생성을 데이터베이스에 위임
- 주로 MySQL, PostgreSQL, SQL Server에서 사용 (MySQL의 AUTO_INCREMENT)
- JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL이 실행되지만
- IDENTITY 전략을 사용하면 em.persist() 시점에 즉시 INSERT SQL이 실행하여 DB에서 식별자 조회
SEQUENCE 전략 - 특징
- 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터 오브젝트
- ORACLE, PostgreSQL, H2 데이터베이스에서 사용
@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1) //allocationSize = 50 (default)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
@SequenceGenerator
- allocationSize 기본값 = 50
- Sequence를 사용하면 계속 네트워크를 왔다갔다 하면서 성능 저하에 대한 우려가 있다
- 이럴 때에는 메모리 할당 사이즈(allocationSize)를 50으로 할당한다
- 50으로 사이즈를 할당하면 next call 할 때 미리 DB에 50개를 한 번에 올려놓고 메모리 상에서 1개씩 쓰는 것ㅇ
- 50개를 모두 사용하면 다음에 또 50개를 다시 할당한다
TABLE 전략
- 키 생성 전용 테이블을 하나 만들어서 시퀀스 흉내내는 전략
- 장점 : 모든 DB에서 적용 가능
- 단점 : 성능
권장하는 식별자 전략
- 기본 키 제약 조건: null 아님, 유일, 변하면 안된다.
- 미래까지 이 조건을 만족하는 자연 키는 찾기 어렵다. 대체키를 사용하자
- 권장 : Long형 + 대체키 + 키 생성전략 사용
출처 : 자바 ORM 표준 프로그래밍
'Back-end Programming > JPA' 카테고리의 다른 글
JPA 고급 매핑 (0) | 2021.04.17 |
---|---|
JPA 다양한 연관관계 매핑 (0) | 2021.04.17 |
JPA 연관관계 매핑 기초 (0) | 2021.04.16 |
JPA 영속성 관리 - 내부 동작 방식 (0) | 2021.04.14 |
JPA (Java Persistence API) 소개 및 시작하기 (0) | 2021.04.14 |