엔티티 매핑
- 객체와 테이블 매핑 @Entity, @Table
- 필드와 컬럼 매핑 @Column
- 기본키 매핑 @id
- 연관관계 매핑 @ManyToOne, @JoinColumn
@Entity
불은 클래스는 JPA 가 관리함 → 엔티티라 함
JPA를 사용해서 테이블과 매핑할 클래스는 @Entity필수
🚨 주의
- 기본 생성자 필수( 파라미터 없는 public or protected 생성자 )
- final 클래스, enum, interface, inner 클래스는 사용 X
- 저장할 필드에 final 사용 X
속성 정리
- name
- JPA에서 사용할 엔티티 이름을 지정한다
- 기본값 → 클래스 이름을 그대로 사용
데이터베이스 스키마 자동 생성
- DDL 을 애플리케이션 실행 시점에 자동 생성
- 객체 중심
- 데이터베이스 방언을 활용 → DDL 생성
- 생성된 DDL 은 개발 장비에서만 사용, 운영서버에서는 가급적 사용하지 않음
📍 속성
🚨 주의
- 운영 장비에서 절대 create, create-drop, update 사용하면 안됨
- 개발 초기에는 create or update
- 테스트 서버는 update or validate
- 스테이징과 운영 서버는 validate or none
DDL 생성 기능
- 제약조건 추가
- 유니크 제약 조건 추가
- DDL 생성기능은 DDL 을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.
필드와 컬럼 매핑
@Column
@Eunmerated
자바 enum 타입을 매핑할 때 사용함
📍EnumType.ORDINAL은 순서를 데이터베이스에 저장하는데 수정시 문제가 생길 수 있다
@Temporal
날짜 타입 java.util.Date, java.util.Calendar)을 매핑할 때 사용
→ LocalDate, LocalDateTime 을 사용할 때는 생략이 가능함
@Lob
매핑하는 필드타입이 문자면 CLOB매핑, 나머지는 BLOB매핑
@Transient
필드 매핑X, 데이터베이스 저장X, 조회X
주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
기본 키 매핑
@Id 직접 할당
@GeneratedValue 자동 생성
IDENTITY 데이터베이스에 위임 , MYSQL
- JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행
- AUTO_INCREEMENT는 데이터베이스에 insert sql를 실행한 이후 id 값을 알 수 있다
- IDENTITY 전략은 em.persist() 시점에 즉시 insert sql 실행하고 DB 에서 조회한다.
SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE
- @SequenceGenerator 필요
- 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트
- @SequenceGenerator 애노테이션 사용
- allocationSize는 기본값이 50 ( 성능 최적화를 위해서)
@Entity @SequenceGenerator( name = "MEMBER_SEQ_GENERATOR", sequenceName = "MEMBER_SEQ", initialValue = 1, allocationSize = 50) public class Member { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR") private Long id;
- TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용
- 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략 ( 성능이 안좋음)
- @TableGenerator 필요
- AUTO: 방언에 따라 자동 지정, 기본값
Share article