[JPA] 엔티티 매핑

gyeol·2024년 7월 1일

JPA

목록 보기
3/13
post-thumbnail

김영한 님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'를 듣고 적은 글 입니다.

엔티티 매핑

  • 객체와 테이블 매핑 : @Entity, @Table
  • 필드와 컬럼 매핑 : @Column
  • 기본 키 매핑 : @Id
  • 연관관계 매핑 : @ManyToOne, @JoinColumn

@Entity

@Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다.
JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수이다.
기본값은 클래스 이름을 그대로 사용한다.
같은 클래스의 이름이 없다면 가급적 기본값을 사용한다.

주의

  • 기본 생성자 필수
  • final 클래스, enum, interface, inner 클래스 사용 안됨
  • 저장할 필드에 final사용 안됨

@Table

@Table은 엔티티와 매핑할 테이블을 지정한다.

필드와 컬럼 매핑

@Column

@Enumerated
enum 타입을 매핑할 때 사용한다.

@Temporal
날짜 타입을 매핑할 때 사용한다.
LocalDate, LocalDateTime을 사용할 때는 생략 가능하다.

@Lob
데이터베이스 BLOB, CLOB 타입과 매핑한다.
매핑하는 필드 타입이 문자이면 CLOB 매핑, 나머지는 BLOB 매핑이다.

  • CLOB : String, char[], java.sql.CLOB
  • BLOB : byte[], java.sql. BLOB

@Transient
데이터베이스에 저장되지도 않고 조회할수도 없다. 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용한다.

기본키 매핑

@Id@GeneratedValue가 존재한다.

  • 직접 할당 : @Id
  • 자동 생성 : @GeneratedValue
    IDENTITY : 데이터베이스에 위임, MYSQL
    SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE
    TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용, @TableGnerator 필요
    AUTO : 방언에 따라 자동 지정, 기본값

IDENTITY 전략

기본 키 생성을 데이터베이스에 위임한다. 주로 MYSQL, PostgreSQL, SQL Server, DB2에서 사용한다.
JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL을 실행한다. AUTO_INCREMENT는 데이터베이스에 INSER SQL을 실행한 이후에 ID 값을 알 수 있다. IDENTITY 전략은 em.persist() 시점에 즉시 INSERT_SQL을 실행하고 데이터베이스에서 식별자를 조회한다.

SEQUENCE 전략

데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트이다.
오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용한다.

  • @SequenceGenerator의 속성

TABLE 전략

키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략으로 모든 데이터베이스에서 적용 가능하다.

  • @TableGenerator의 속성

데이터 중심 설계의 문제점

  • 테이블 외래키를 객체에 그대로 가져왔다.
  • 객체 그래프 탐색이 불가능하다.
  • 참조가 없으므로 UML도 잘못됐다.
profile
공부 기록 공간 '◡'

0개의 댓글