슬기로운 개발생활

[JPA] Hibernate 엔티티(Entity) 매핑하기

by coco3o
반응형

엔티티 매핑의 종류

>  객체와 테이블 매핑 : @Entity , @Table

 

>  기본 키 매핑 : @Id

 

>  필드와 컬럼 매핑 : @Column

 

>  연관관계 매핑 : @ManyToOne , @JoinColumn

@Entity
// name과 age Column에 unique 제약조건 추가
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint(
        name = "NAME_AGE_UNIQUE",
        columnNames = {"NAME", "AGE"} )})
public class Member {
 
    // 기본키 매핑
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;
 
    // not null, varchar(10)
    @Column(name = "NAME", nullable = false, length = 10)
    private String username;
 
    private Integer age;
 
    // Java의 enum 사용
    @Enumerated(EnumType.STRING)
    private RoleType roleType;
 
    // Java의 날짜 타입
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;
 
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;
 
    // CLOB, BLOC 타입 매핑
    @Lob
    private String description;
 
    @Transient
    private String temp;
 
 
    //Getter, Setter
}
 
public enum RoleType {
    ADMIN, USER
}

@Entity

  • 테이블과의 매핑
  • @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 불린다.

 

>  속성

  • Name  :  JPA에서 사용할 엔티티 이름을 지정한다. (보통 default값인 클래스 이름을 사용)

 

>  주의사항

  • 기본 생성자는 필수 (JPA가 엔티티 객체 생성 시 기본 생성자를 사용하기 때문)
  • final 클래스, enum, interface, inner class 에는 사용할 수 없다.
  • 저장할 필드에 final 사용 불가

@Table

  • 엔티티와 매핑할 테이블을 지정
  • 생략 시 매핑한 엔티티 이름을 테이블 이름으로 사용한다.

 

>  속성

  • Name  :  매핑할 테이블 이름 (default. 엔티티 이름 사용)
  • CataLog  :  catalog 기능이 있는 DB에서 catalog 를 매핑 (default. DB 명)
  • Schema  :  schema 기능이 있는 DB에서 schema를 매핑
  • uniqueConstraints : DDL 생성 시 유니크 제약조건을 만듦 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용

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

  • JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원
  • 클래스의 매핑 정보와 데이터베이스 방언을 사용하여 데이터베이스 스키마 생성
  • 어플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성

 

스키마 자동 생성 기능 사용을 위해 application.properties 에 속성 추가

spring.jpa.hibernate.ddl-auto=update

hibernate.ddl-auto 속성

  • create  :  기존 테이블을 삭제하고 새로 생성 (DROP + CREATE)
  • create-drop  :  CREATE 속성에 추가로 어플리케이션을 종료할 때 생성한 DDL을 제거 (DROP + CREATE + DROP)
  • update  :  DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정
  • validate  :  DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 어플리케이션을 실행하지 않음
  • none  :  자동 생성 기능을 사용하지 않음

 

>  주의사항

  • 개발 초기 단계는 create 또는 update
  • 초기화 상태로 자동화된 테스트를 진행하는 개발자 환경과 CI서버는 create 또는 create-drop
  • 테스트 서버는 update 또는 validate
  • 스테이징과 운영 서버는 validate 또는 none

기본  키  매핑

  • 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하므로 엔티티를 영속 상태로 만들기 위해 식별자 값이 반드시 필요

@GeneratedValue 기본 키 생성 전략

- 직접 할당  :  기본 키를 어플리케이션에 직접 할당한다.

    ㄴ   em.persist()를 호출하기 전 어플리케이션에서 직접 식별자 값을 할당해야 함. 식별자 값이 없을 경우 오류 발생

 

- 자동 생성  : 대리 키 사용 방식이다.

  • IDENTITY  :  기본 키 생성을 데이터베이스에 위임 (= AUTO_INCREMENT)
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;
  • SEQUENCE  :  데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.
    • 식별자 값을 획득한 후 영속성 컨텍스트에 저장 유일한 값을 순서대로 생성 (오라클, PostgreSQL, DB2, H2)
  • TABLE  :  키 생성 테이블을 사용한다.
    • 키 생성 전용 테이블 하나를 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략이다. 테이블을 사용하므로 모든 데이터베이스에 적용 가능
  • AUTO  :  선택한 데이터베이스 방언에 따라 방식을 자동으로 선택(default)
    • Ex) 오라클 DB 선택 시 SEQUENCE ,  MySQL DB 선택 시 IDENTITY 사용

@Column

  • 객체 필드를 테이블 컬럼에 매핑한다.
@Column(nullable = false)
private String data;
 
@Column(unique = true)
private String data;
 
@Column(columnDefinition = "varchar(100) default 'EMPTY'")
private String data;
 
@Column(length = 400)
private String data;
 
@Column(precision = 10, scale = 2)
private BigDecimal data;

>  속성

  • name  :  필드와 매핑할 테이블 컬럼 이름 (default. 객체의 필드 이름)
  • nullable (DDL)  :  null 값의 허용 여부 설정,  false 설정 시 not null (default. true)
    • @Column 사용 시 nullable = false 로 설정하는 것이 안전하다.
  • unique (DDL)  :  @Table 의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 적용한다.
  • columnDefinition (DDL)  :  데이터베이스 컬럼 정보를 직접 줄 수 있다. default 값 설정
    • (default. 필드의 자바 타입과 방언 정보를 사용해 적절한 컬럼 타입을 생성한다.)
  • Length (DDL)  :  문자 길이 제약조건, String 타입에만 사용 (default. 255)
  • percision scale (DDL)  :  BigDemical, BigInteger 타입에서 사용. 아주 큰 숫자나 정밀한 소수를 다룰 때 사용

@Enumerated

  • 자바의 enum 타입을 매핑할 때 사용한다.

 

>  속성 

  • EnumType.ORIDINAL  :  enum에 정의된 순서대로 데이터베이스에 저장한다.
  • EnumType.STRING  :  enum 이름 그대로 데이터베이스에 저장한다.
  • (default. EnumType.ORIDINAL)
enum RoleType {
  ADMIN, USER
}

@Enumerated
private RoleType roleType;
member.setRoleType(RoleType.ADMIN);  // 1

@Enumerated(EnumType.STRING)
private RoleType roleType;
member.setRoleType(RoleType.ADMIN);  // ADMIN

@Temporal

  • 날짜 타입 (java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.
@Temporal(TemporalType.DATE)
private Date date; // 날짜
 
@Temporal(TemporalType.TIME)
private Date date; // 시간
 
@Temporal(TemporalType.TIMESTAMP)
private Date date; // 날짜와 시간

>  속성

  • TemporalType.DATE  :  날짜, 데이터베이스 data 타입과 매핑 ( 2021-07-06 )
  • TemporalType.TIME  :   시간, 데이터베이스 time 타입과 매핑 ( 15:27:33 )
  • TemporalType.TIMESTAMP  :  날짜와 시간, 데이터베이스 timestamp 타입과 매핑 ( 2021-07-06 15:27:33 )
  • ( default. TemporalType은 필수로 지정 )

@Temporal 을 생략하면 자바의 Date와 가장 유사한 timestamp로 정의한다.

@CreationTimestamp
private Timestamp createDate;

@UpdateTimestamp
private Timestamp updateDate;
  • @CreationTimestamp : INSERT 시 현재시간을 저장
  • @UpdateTimestamp : UPDATE 시 현재시간을 저장

@Lob

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

 

>  속성

  • 매핑하는 필드 타입이 문자면 CLOB을 매핑하고 나머지는 BLOB을 매핑한다.
  • CLOB  :  String, char[]
  • BLOB  :  byte[]
@Lob
private String lobString;

@Lob
private byte[] lobByte;

@Transient

  • 필드에 매핑하지 않는다.
  • 데이터베이스에 저장하지 않고 조회하지도 않는다.
  • 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
@Transient
private Integer temp;

@Access

  • JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
  • 필드 접근  :  AccessType.FIELD 로 지정
    • 필드에 직접 접근 (private도 접근 가능)
  • 프로퍼티 접근  :  AccessType.PROPERTY 로 지정
    • 접근자 Getter를 사용한다.

출처

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기