본문 바로가기

Programming/과거포스팅

[JPA] - 엔티티 매핑(Entity Mapping)

엔티티 매핑(Entity Mapping)



JPA의 가장 중요하고 기본적인 작업은 테이블과 엔티티를 매핑하는 것이다.  

JPA는 이를 위해서 다양한 매핑 어노테이션을 지원한다.


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



객체와 테이블 매핑


1. @Entity

테이블과 매핑할 클래스에 필수로 붙여야한다.

기본 생성자는 필수이다. 

final 클래스,  enum, interface, inner 클래스에서는 사용할 수 없다.

저장할 필드에 final을 사용하면 안된다.




2.@Table

엔티티와 매핑할 테이블을 지정한다. 옵션으로 name을 주지 않게 되면 엔티티 이름을 테이블 이름으로 사용한다.




필드와 컬럼 매핑


1. @Enumerated(EnumType.STRING)

enum을 사용해서 타입구분


2. @Temporal(temporalType.TIMESTAMP)

자바의 Date를 매핑할 경우 사용


3. @Lob

CLOB, BLOB 타입을 매핑할 경우



필드와 컬럼 매핑 DDL 옵션


1. @Column

테이블 컬럼과 매핑하는 어노테이션인데 옵션 중에는 DDL로 스키마를 생성할 때 사용되는 옵션이 있다.

스키마를 생성하는 기능은 아래에 있다.

@Column(name = "NAME", nullable = false, length = 10)

위와 같이 컬럼에 nullable, length와 같은 옵션을 주게 되면 테이블 생성시 not null, 문자열 길이와 같은 제약조건이 추가된다.



엔티티를 이용한 테이블 생성

<property name="hibernate.hbm2ddl.auto" value="create" />

persistence.xml에 위의 코드를 추가한 다음 어플리케이션을 실행하면 아래와 같은 DDL이 출력된다.

Hibernate: 
    drop table MEMBER if exists
Hibernate: 
    create table MEMBER (
        ID varchar(255) not null,
        age integer,
        createdDate timestamp,
        description clob,
        lastModifiedDate timestamp,
        roleType varchar(255),
        NAME varchar(10) not null,
        primary key (ID)
    )
Hibernate: 
    alter table MEMBER 
        add constraint NAME_AGE_UNIQUE  unique (NAME, age)

이 기능을 사용하면 어플리케이션 실행 시점에 테이블을 새로 생성하는데 매우 유용하다. 추후 포스팅을 할 예정인데. insert쿼리를 만들어서 어플리케이션 실행시점에 데이터를 삽입할 수도 있기 때문에 개발하기 매우 편하다.


만약 변경된 엔티티에 대해서만 DDL 수정을 하고 싶을 경우에 xml옵션으로 create 대신 update를 주면 된다.


이 옵션은 편리하지만 조심히 사용해야한다. 운영환경에서 create를 사용했다고 생각하면 끔찍한 일이 발생할 수도 있기 때문이다. 절대 운영환경에서는 사용하면 안된다.