[JPA] 04. 엔티티 매핑

Aug 18, 2023
[JPA] 04. 엔티티 매핑

엔티티 매핑

  • 객체와 테이블 매핑 @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 은 개발 장비에서만 사용, 운영서버에서는 가급적 사용하지 않음
 
📍 속성
notion image
🚨 주의
  • 운영 장비에서 절대 create, create-drop, update 사용하면 안됨
  • 개발 초기에는 create or update
  • 테스트 서버는 update or validate
  • 스테이징과 운영 서버는 validate or none

DDL 생성 기능

  • 제약조건 추가
  • 유니크 제약 조건 추가
  • DDL 생성기능은 DDL 을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.
 

필드와 컬럼 매핑

@Column
notion image
 
@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
RSSPowered by inblog