엔티티 매핑

Jaca·2021년 8월 13일
0

엔티티 매핑

실제 데이터 베이스와 객체를 매핑해주는 작업을 엔티티 매핑이라고 한다.
엔티티 매핑은 JPA를 사용하는데 가장 중요하고 기본이 되는 작업이라고 할 수 있다.

그러므로 JPA의 매핑 어노테이션을 제대로 숙지하도록 하자!

@Entity

@Entity가 붙은 클래스는 JPA가 관리하고, 엔티티라 한다.
JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수이다.

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

속성

  • name :
    저장 될 Entity의 이름을 지정 해준다.
    defalut : 클래스 이름을 그대로 사용하는 것

@Table

엔티티와 매핑할 테이블을 지정

속성

  • name : 매핑할 테이블 이름, defalut : 엔티티 이름을 사용
  • catalog : 데이터베이스 catalog 매핑
  • schema : 데이터베이스 schema 매핑
  • uniqueConstaints : DDL 생성 시에 유니크 제약 조건 생성, 2개 이상의 복합 유니크 제약 조건도 만들 수 있음 -> 스키마 자동 생성 기능을 사용해 DDL을 만들 때만 사용됨

Entity와 Table의 차이

강의를 보면, @Entity@Table 은 모두 클래스 레벨에서 지정해주는 걸 볼 수있다.
정처기나 데이터베이스를 공부할 때 Entity와 Table이 사용되는 곳이 다른..? 개념은 비슷한 것으로 기억하고 있다.
이 두가지는 무슨 차이가 있을까?

Entity는 논리 모델 Table은 물리 모델

논리 모델물리 모델
엔티티테이블
어트리뷰트컬럼
릴레이션릴레이션
키 그룹인덱스

출처

@javax.persistence.Entity: 클래스가 엔티티임을 지정합니다. 이 어노테이션은 엔티티 클래스에 적용됩니다.
@javax.persistence.Table: 엔터티에 대한 기본 테이블을 지정합니다.

@Entity(name = "someName") : 이 이름은 엔티티의 이름을 지정하는 데 사용됩니다.
@Table(name = "otherName") : 이 이름은 DB의 테이블 이름을 지정하는 데 사용됩니다.

@Entity(name = "someName") => this name will be used to name the Entity
@Table(name = "otherName")  => this name will be used to name a table in DB

쿼리를 작성하는 동안 @Entity에 지정된 이름을 사용해야 하며 @Table에 지정된 이름은 DB의 테이블 이름에 사용됩니다. 따라서 JPQL에서 사용하는 엔티티 이 otherName은 DB에서 참조됩니다 .

데이터 스키마 자동 생성

DDL을 애플리케이션 실행 시점에 자동으로 생성시키는 속성이다.
이렇게 생성된 DDL은 개발 장비에서만 사용해야한다.
운영 장비에는 절대 create, create-drop, update 사용하면 안된다.

개발 초기 단계는 create 또는 update,
테스트 서버는 update 또는 validate,
스테이징과 운영 서버는 validate 또는 none

hibernate.hbm2ddl.auto 옵션

DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.

세부 매핑 어노테이션

@Column

테이블의 컬럼과 매칭해주는 어노테이션

@Enumerated

Enum 타입과 매핑해주는 어노테이션

@Enumerated 를 사용 할 때 반드시 EnumType.STRING 속성을 사용해주자.
트랜잭션의 ACID 특성 중 지속성을 보장하는 특성 덕분에 이미 저장된 데이터는 변화하지 않기 때문에, 사용중에 Enum 속성이 추가되면 인덱스가 꼬여버릴 수 있다.
그리고 String이 보다 직관적인 것 같다.

@Temporal

날짜와 시간을 매핑해주는 어노테이션

하지만 최근에 LocalDateLocalDateTime 덕분에 잘 사용하지 않는다.

@Lob

데이터베이스 BLOB, CLOB 타입과 매핑해주는 어노테이션

필드 타입이 문자면 CLOB, 나머지는 BLOB에 매핑해준다.

Transient

필드에 매핑시키지 않기 위한 어노테이션
메모리상에서 계산이라던가 DB와 무관하게 사용하고 싶은 값에 사용한다.

기본 키 매핑 어노테이션

@Id

기본 키를 직접 할당하는 어노테이션 이다.

@GeneratedValue

기본 키 생성을 데이터베이스에 위임 하는 어노테이션이다.
데이터를 넣을 때 기본 키 값을 넣지않으면 DB가 자동으로 적절한 기본 키 값을 적절히 생성해서 넣어준다.

GenerationType

@GeneratedValue 의 기본 키 생성 전략은 3가지가 있다.

GenerationType.IDENTITY

기본 키 생성을 데이터베이스에 위임 한다.
주로 MySql, PostgreSQL, SQL Server, DB2에서 사용한다.

JPA의 기능 중 쓰기 지연 기능이 있다는 점을 알아보았다.
JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행한다.
그런데, IDENTITY 전략은 데이터베이스에 INSERT SQL을 실행 한 이후에 ID 값을 알 수 있다.
그래서 IDENTITY 전략은 persist() 시점에 즉시 INSERT SQL 실행 하고 DB에서 식별자를 조회한다.

GenerationType.SEQUENCE

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

@SequenceGenerator

allocationSiz 란 데이터를 1씩 증가시키면 새로운 데이터가 들어올 때 마다 시퀀스를 호출하여 성능이 낮아진다.
이 수를 적절히 조절해야한다.

GenerationType.TABLE

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

profile
I am me

0개의 댓글