본문 바로가기
Back-end

엔티티 매핑

by 신재권 2022. 9. 7.

@Entity

JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다. 이 어노테이션이 붙으면 이 클래스는 JPA가 관리한다.

  • name : JPA에서 사용할 엔티티 이름 지정

주의사항

  • 기본 생성자는 필수(파라미터가 없는 public, protected)
  • final, enum, interface, inner 클래스에는 사용 불가
  • 저장할 필드에 final을 사용하면 안됨

@Table

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

  • name : 매핑할 테이블 이름
  • catalog : catalog 기능이 있는 데이터베이스에서 catalog를 매핑
  • schema : schema 기능이 있는 데이터베이스에서 schema를 매핑
  • uniqueConstraints : DDL 생성 시에 유니크 제약 조건을 만든다. 2개 이상의 복잡한 유니크 제약 조건도 만들 수 있다.

데이터베이스 스키마 자동 생성

JPA는 스키마 자동 생성 기능을 지원한다.

JPA는 매핑 정보와 데이터베이스 방언을 사용해 스키마를 생성한다.

스키마 자동 생성 기능이 만든 DDL은 운영 환경에서 사용할 만큼 완벽하지는 않다.

hibernate.hbm2ddl.auto 속성

  • create : DROP + CREATE
  • create-drop : DROP + CREATE + DROP
  • update : 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정
  • validate : 테이블과 엔티티 매핑 정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다.
  • none : 자동 생성 기능을 사용하지 않는다.

기본 키 매핑

JPA가 제공하는 데이터베이스 기본 키 생성 전략

  • 직접 할당 : 기본 키를 애플리케이션에서 직접 할당
  • 자동 생성 : 대리키 사용 방식
    • IDENTITY : 기본 키 생성을 데이터베이스에 위임
    • SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본키를 할당
    • TABLE : 키 생성 테이블을 사용

기본 키를 직접 할당하려면 @Id만 사용, 자동 생성 전략을 사용하려면 @GeneratedValue 를 추가한다.

기본키 직접 할당 전략

@Id 적용 가능 자바 타입

  • 자바 기본형
  • 자바 래퍼형
  • String
  • java.util.Date
  • java.sql.Date
  • java.math.BigDecimal
  • java.math.BigInteger

기본 키 직접 할당 전략은 엔티티를 저장하기전에 직접 기본키를 할당하는 방식이다.

IDENTITY 전략

기본 키 생성을 데이터베이스에 위임하는 전략

IDENTITY 전략을 사용하면 엔티티가 데이터베이스에 저장된 후 기본키가 할당된다. 때문에 JPA는 추가로 데이터베이스를 조회해야 한다.

엔티티가 영속 상태가 되려면 반드시 식별자가 필요하기 때문에, 이 전략을 사용하면 엔티티를 저장하는 즉시 INSERT SQL이 데이터베이스 전달되고, 트랜잭션 쓰기 지연이 동작하지 않는다.

SEQUENCE 전략

데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 데이터베이스 오브젝트이다.

@SequenceGenerator를 사용해서, 시퀀스 생성기를 등록 후, @GeneratedValue.generator를 사용해 시퀀스와 매핑한다.

시퀀스 전략은 데이터를 저장할 때 먼저 데이터베이스 시퀀스를 사용해 식별자를 조회 후, 엔티티에 할당한 후에 엔티티를 영속성 컨텍스트에 저장한다.

  • IDENTITY : 데이터 저장 → 식별자 조회
  • SEQUENCE : 식별자 조회 → 데이터 저장

@SequenceGenerator

  • name : 식별자 생성기 이름
  • sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
  • initialValue : DDL 생성 시에만 사용, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정
  • allocationSize : 시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용)
  • catalog, schema : 데이터베이스 catalog, schema 이름

JPA는 시퀀스에 접근하는 횟수를 줄이기위해 @SequenceGenerator.allocationSize를 사용한다. 여기에 설정한 값 만큼 한번에 시퀀스 값을 증가시키고, 메모리에 시퀀스 값을 할당한다.

TABLE 전략

키 생성 전용 테이블을 하나 만들어 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략이다.

@TableGenerator

  • name : 식별자 생성기 이름
  • table : 키 생성 테이블 명
  • pkColumnName : 시퀀스 컬럼 명
  • valueColumnName : 시퀀스 값 컬럼 명
  • pkColumnValue : 키로 사용할 이름
  • initalValue : 초기 값, 마지막을으로 생성된 값이 기준
  • allocationSize : 시퀀스 한번 호출에 증가하는 수
  • catalog, schema : 데이터베이스 catalog, schema 이름
  • uniqueConstraints(DDL) : 유니크 제약 조건 지정

AUTO 전략

데이터베이스 방언에 따라 전략을 자동 선택

장점

데이터베이스를 변경해도 코드를 수정할 필요가 없다.

자연 키 , 대리 키

자연 키 : 비즈니스에 의미가 있는 키 (주민번호, 이메일 …)

대리 키 : 비즈니스와 관련 없는 임의로 만들어진 키(시퀀스, …)

@Column

객체 필드를 테이블 컬럼에 매핑한다.

  • name : 필드와 매핑할 테이블 컬럼의 이름
  • insertable : 엔티티 저장 시 이 필드도 같이 저장
  • updatable : 엔티티 수정 시 이 필드도 같이 수정
  • table : 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용
  • nullable(DDL) : null값의 허용 여부를 설정
  • unique(DDL) : @Table의 uniqueConstraints와 같지만 한 컬럼에 유니크 제약 조건을 걸 때 사용한다. 두 컬럼 이상시 @Table.uniqueConstraints를 사용
  • columnDefinition(DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있다.
  • length(DDL) : 문자 길이 제약 조건, String 타입에만 사용
  • precision, scale(DDL) : BigDecimal, BigInteger 타입에서 사용, precision은 소수점을 포함한 전체 자리수, scale은 소수의 자릿수

@Column 생략시

  • Primitive 타입 : not null 자동 설정
  • Wrapper 타입 : null 허용

@Column 을 생략하지않고 primitive 타입을 사용하면 not null이 설정되지 않는다.

@Enumerated

enum 타입을 매핑할 때 사용

  • value :
    • EnumType.ORDINAL : 순서를 데이터베이스에 저장
    • EnumType.STRING : enum 이름을 데이터베이스에 저장

@Temporal

날짜 타입을 매핑할 때 사용

  • value :
    • TemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑
    • TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑
    • TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑

@Temporal을 생략 시 timestamp로 정의

@Lob

데이터베이 BLOB, CLOB 타입과 매핑

매핑하는 필드 타입이 문자면 CLOB으로 매핑, 나머지는 BLOB으로 매핑

@Transient

이 필드는 매핑하지 않는다. 따라서 데이터베이스에 저장하지 않고 조회하지도 않는다. 임시로 값을 보관하고 싶을 때 사용

@Access

JPA가 엔티티 데이터에 접근하는 방식을 지정한다.

  • 필드 접근 : AcessType.FIELD로 지정 : 필드에 직접 접근, private이어도 접근 가능
  • 프로퍼티 접근 : AccessType.PROPERTY로 지정, 접근자 Get을 사용

@Access를 설정하지 않으면 @Id의 위치를 기준으로 접근 방식이 설정

출 처 : 자바 ORM 표준 JPA 프로그래밍 - 김영한

'Back-end' 카테고리의 다른 글

다양한 연관관계 매핑  (0) 2022.09.15
연관관계 매핑 기초  (0) 2022.09.14
JWT 토큰  (0) 2022.09.05
영속성 관리  (0) 2022.09.02
JPA 시작  (0) 2022.09.01