Java Persistence API 엔티티 매핑

개붕이·2025년 1월 1일

JavaPersistenceAPI

목록 보기
3/6
post-thumbnail

JPA 핵심 2가지

  1. 객체와 DB 매핑 (Object Relational Mapping)
    • 이번 포스트에 알아볼 내용
  2. 영속성 컨텍스트

엔티티 매핑에 사용되는 어노테이션

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

@Entity

@Entity 가 붙은 클래스는 JPA 가 관리한다는 의미이다.

JPA 를 사용해서 테이브로가 매핑하려면 이 어노테이션이 필수.

  • 기본 생성자는 필수로 만들어줘야함
  • final, Enum, interface, inner 선언이 불가하다
  • 필드에 final 선언도 불가함

속성

  • name : 기본값은 클래스 이름이며 엔티티 이름을 설정해준다.

@Table

DB 에 매핑될 테이블을 지정해주는 속성이다

속성

  • name : 매핑 테이블 이름 (기본값: 엔티티 이름)
  • Catalog : DB catalog 매핑
  • Schema : DB schema 매핑
  • uniqueConstraints(DDL) : DDL 생성 시에 유니크 제약 조건을 생성해준다.

hibernate.hbm2ddl.auto

  • DB 스키마 자동 생성
  • DB Dialect 를 활용, DB 에 맞는 적절한 DDL 문 생성 (운영서버 사용 X)

옵션

  • create : 먼저 drop 후 create
  • create-drop : create 와 같지만 마지막에 drop 을 한 번 더 해줌
  • update : Column 변경시에만 반영하여 ddl 작성 (추가만 적용됨)
  • validate : 엔티티와 테이블의 매핑 상태 체크
  • none : 아무 말이나 쓰는 것과 같지만 관례상 none 으로 설정하거나 주석처리

클래스나 필드에 적용 가능한 옵션

  • 제약 조건 추가
    • ex) @Column(nullable = false, length = 10)
  • 유니크 제약 조건 추가
    • ex) @Table(uniqueConstraints = {@uniqueConstraints(name="NAME_AGE_UNIQUE",ColumnNames={"NAME","AGE"})})

이러한 DDL 문과 관련된 옵션은 실행조직과는 연관이 없음.


필드 매핑 어노테이션

  • @Column : 컬럼 매핑
  • @Temporal : 날짜 타입 매핑
  • @Enumerated : Enum 타입 매핑
  • @Lob : BLOB, CLOB 매핑
  • @Transient : 특정 필드를 매핑하지 않음 ( 매핑 무시)

@Column

  • name : 필드와 매핑할 테이블의 컬럼 이름 (기본값: 객체의 필드 이름)
  • insertable, updateable : 등록, 변경 가능 여부 (기본값: true)
  • nullable (DDL) : null 값의 허용 여부 (기본값: true)
  • unique (DDL) : Table 의 UniqueConstraint 와 같지만 하나의 컬럼 지정 시에 사용 (제약 조건 이름이 랜덤)
  • columnDefinition (DDL) : DB 컬럼 정보를 직접 줄 수 있다. (필드의 자바 타입과 방언 정보를 사용해야함)
  • length (DDL) : 문자 길이 제약 조건 (String 만)
  • precision, scale (DDL) : 소수를 표현할 때 사용, BigDecimal 타입에서 사용 precision 은 소수점 포함 전체 자릿수, Scale 은 소수의 자릿수 (기본값: precision = 19, scale = 2)

@Enumerated

  • Enum 매핑 시에 사용함
  • Value 가 2개 존재함
    • EnumType.Ordinal : Enum 의 순서를 DB에 저장 (기본값
    • EnumType.String : 이름을 DB 에 저장 (String 사용 권장)

@Temporal

  • 날짜 타입 (Date, Calender) 매핑 시에 사용
  • Value 가 3개 존재함
    • TemporalType.DATE : 날짜, DB date 타입과 매핑
    • TemporalType.TIME : 시간, DB Time 타입과 매핑
    • TemporalType.TIMESTAMP : 날짜, 시간 매핑

LocalDate, LocalDateTime 사용 시에는 생략 가능함

@Lob

  • 지정 속성이 없음, 데이터 타입이 문자면 CLOB, 나머지는 BLOB 으로 사용
    • CLOB: char[], String, java.sql.CLOB
    • BLOB: byte[], java.sql.BLOB

@Transient

  • 필드 매핑 X, 즉 DB 저장 X, 조회 X
  • Memory 상으로만 값을 보관할 떄 사용함

기본 키 매핑

  • @Id : 직접 할당
  • @GeneratedValue : 자동 생성
    • IDENTIFY : DB 에 위임 (Oracle 은 Sequence, MySQL 은 Auto Increment)
    • SEQUENCE : DB 시퀀스 오브젝트 사용 (@SequenceGenerator 필요)
    • TABLE : 키 생성 테이블 사용 (@TableGenerator 필요)
    • AUTO : 방언에 따라 자동 지정 (기본 값)

IDENTITY

  • 기본 키 생성을 DB 에 위임
  • MySQL, PostgreSQL, SQL server, DB2 에서 사용
    • ex) MySql 의 Auto Increment, PostgreSQL 의 Serial
  • JPA 는 보통 커멋 시점에 INSERT SQL 을 실행함, 하지만 IDENTITY 전략은 INSERT SQL 실행 후 ID 를 알수 있음
  • 그래서 IDENTITY 전략은 em.persist() 실행 시에 즉시 SQL 을 실행하고 DB 에서 ID(PK) 값을 조회함

SEQUENCE

  • DB 시퀀스는 유일 값을 순서대로 생성하는 특별한 DB 오브젝트
  • 오라클, PostgreSQL, DB2, H2 에서 사용
  • 엔티티 클래스 설정 : @Entity @SequenceGenerator(name="foo", sequenceName="bar", initialValue=1, allocationSize=1)
  • 필드 설정 : @Id`` @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="foo")

@SequenceGenerator 속성

  • name : 식별자 생성기 이름
  • sequenceName : DB 에 등록할 시퀀스 이름
  • initialValue (DDL) : 시퀀스 DDL 생성 시 시작 값
  • allocationSize : 시퀀스 한 번 호출 시 증가하는 수 ( 미리 호출하여 값 범위 할당, 성능 최적화, 중간에 비는 값 발생 가능)
  • catalog, schema : DB catalog, schema 매핑

TABLE

  • 키 생성 전용 테이블을 만듦
  • 시퀀스 모방
  • 모든 DB 적용 가능
  • 성능이 저하될 수 있음

테이블 생성 DDL

create table ms(
    sequence_name varchar(255) not null,
    next_val bigint,
    primary key (sequence_name)
)
  • 엔티티 클래스 설정 : @Entity @TableGenerator(name="MSG", table="ms", pkColumnName="MB_SQ", allocationSize=1)
  • 필드 설정 : @Id @GeneratedValue(strategy=GenerationType.TABLE, generator="MSG")

속성

  • name : 식별자 이름 (필수)
  • table : 키 생성 테이블 명 (기본값 : hibernate_sequences)
  • pkColumnName : 시퀀스 컬럼명 (기본값 : sequence_name)
  • valueColumnName : 시퀀스 값 컬럼 명 (기본값 : next_val)
  • pkClumnValue : 키로 사용할 이름 (기본값 : 엔티티명)
  • InitailValue : 초기 값, 마지막 생성 값이 기준 (기본값 : 0)
  • allocationSize : 시퀀스 한 번에 호출 할 값 (기본값 : 50)
  • catalog, schema : DB catalog, schema 매핑
  • uniqueConstraints (DDL) : 유니크 제약 조건 생성

식별자 전략

  • 기본 키 제약 조건 : not null, 유일, 불변
  • 자연키 X, 대체키(대리키) O
  • 권장 : long + 대체키 + 키 생성 전략 사용
profile
based on the records

0개의 댓글