티스토리 뷰

프로그래밍/JPA

Entity 매핑하기

열무룩 2021. 4. 26. 19:36

이번에는 Annotation과 속성을 중점으로 Entity를 매핑하는 방법에 대해 살펴본다.

 

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


JPA는 Appplication 로딩 시점에 DB 생성 기능을 지원한다
개발시
테이블을 만들어 두고 객체를 넣어두는 방식이 아닌 객체 매핑을 해두면 알아서 필요한 테이블을 생성해준다.

 

설정은 아래와 같이 persistence.xml에 추가해주면 된다. 

 

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

 

" ??? " 부분에 들어갈 옵션은 총 5개로 아래와 같다. 

 

  • create : 기존 테이블 삭제 후 다시 생성 (먼저 DROP후 CREATE)
  • create-drop : create와 동일하지만 종료 시점에 DROP
  • update : 변경분만 반영 (ALTER), 추가만 가능하고 지우는 건 적용되지 않음.
  • validate : 엔티티와 테이블이 정상 매핑되었는지 확인.
  • none : 사용하지 않음.

여기서 주의할 점은 운영 장비에는 절대로 create / create-drop / update를 사용하면 안된다는 점이다.

각 옵션을 사용하는 시기는 아래와 같이 권장하고 있다. 

 

  • 개발 초기 : create / update
  • 테스트 서버 : update / validate
  • 운영 : validate / none

가급적 로컬에서는 자유롭게 사용하되, 다수의 개발자와 사용하는 서버에서는 사용하지 않도록 하자.문을 시스템에 맡기는 것 자체가 큰 리스크기 때문에.. 스크립트를 어느 정도 다듬어서 직접 쿼리를 날리는 습관을 가져야 한다.

 

 

객체와 테이블 매핑


@Entity 

@Entity가 붙은 클래스는 JPA가 관리하는 엔티티라고 한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수로 들어가야 한다. 이때 기본 생성자는 필수로 넣어주어야 한다. 

 

속성 값으로는 name을 사용할 수 있는데, JPA에서 사용할 Entity 이름을 지정할 수 있다.

기본 값으로는 클래스의 이름을 사용한다.

 

@Table

엔티티와 매핑할 테이블을 지정할 때 사용한다. 

 

속성 기능 Default
name 매핑할 테이블 이름 설정 Entity 이름
schema DB 스키마 매핑  
uniqueConstraints 유니크 제약 조건생성  

여기서 유니크 제약 조건을 생성할 때는 아래와 같이 생성할 수 있다. 

uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE",
 columnNames = {"NAME", "AGE"} )}

 

 

필드와 컬럼 매핑


설명보다는 코드와 어떤 속성 값이 있는지 소개한다.

 

@Entity
@Table(name = "MBR")
public class Member {

    public Member() {
    }

    @Id
    private Long id;

    @Column(name = "name")
    private String username;

    private Integer age;

    @Enumerated(EnumType.STRING)
    private RoleType roleType;

    @Temporal(TemporalType.TIMESTAMP)
    private Date createDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    @Lob
    private String description;

    @Transient
    private int temp;
}

매핑 예시

 

@Column

속성 기능 Default
name 필드와 매핑할 컬럼 이름 객체 필드명
insertable / updatable DB 스키마 매핑 TRUE
nullable null값 허용 여부 TRUE
unique 컬럼에 유니크 제약 조건생성
 - 제약 조건 이름이 랜덤하게 설정되어
   추천하지 않음.
FALSE
length 문자 길이 제약조건 255
columnDefinition 컬럼 정보 직접 입력
ex) varchar(100) default 'EMPTY'
 

 

@Enumerated

속성 기능 Default
value

- EnumType.ORDINAL
 : enum
타입의 순서를 DB에 저장

- EnumType.STRING
 : enum
타입의 이름을 DB에 저장
EnumType.ORDINAL

EnumType.ORDINAL 절대 사용하지 않기 (순서가 꼬이면 운영시 큰 버그 발생 가능)

 

 

@Temporal

속성 기능 Default
value

- TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑 (: 2013–10–11)

- TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑 (: 11:11:11)

- TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이 스 timestamp 타입과 매핑(예: 2013–10–11 11:11:11)

 

날짜 타입을 매핑할 때 사용하나 최신 버전은 Annotation 대신에 LocalDateLocalDateTime을 사용하면 알아서 매핑이 된다.

 

 

@Lob

지정할 수 있는 속성은 없고, 필드 타입이 문자일 때는 CLOB / 나머지는 BLOB

 

 

@Transient

필드 매핑을 하지 않고, 메모리 상에서만 어떤 값을 보관하고자 할 때 사용한다.

 

 

기본 키 매핑


@GeneratedValue 를 통해서 Entity의 PK값을 자동으로 생성할 수 있다. 속성 값으로 strategy를 가지며, 4개의 값을 설정할 수 있다.

 

1. GenerationType.IDENTITY


 : 기본키 생성을 DB에 위임.


2. GenerationType.SEQUENCE

 :
유일한 값을 순서대로 생성하는 데이터베이스 오브젝트를 생성하여 위임 (오라클, PostgreSQL, DB2, H2에서 사용)
 
그런데 만약 Table마다 시퀀스를 따로 관리를 하고자 할 때는, 직접 할당해 줄 수 있다.

 

@Entity
@Table(name = "MBR")
@SequenceGenerator(
        name = "MEMBER_SEQ_GEN",
        sequenceName = "MEMBER_SEQ",
        initialValue = 1, allocationSize = 1)
public class Member {

    public Member() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
                    generator = "MEMBER_SEQ_GEN")
    private Long id;
}
속성 기능 Default
name 식별자 생성기 이름 필수 입력
sequenceName DB에 등록할 시퀀스 이름 hibernate_seqeuence
initialValue DDL시 처음 시작하는 숫자를 지정 1
allcationSize 시퀀스 호출시 증가 숫자 50

 

3. GenerationType.TABLE

 

 : 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내 내는 전략,
 SequenceGenerator
와 유사하게 Table을 생성시켜주면, seq 이름에 맞춰 seq값이 1씩 증가하도록 설계된다.
 그러나 성능에 이슈가 있어 사용을 권장하지는 않음.

@Entity
@Table(name = "MBR")
@TableGenerator(
        name = "MEMBER_SEQ_GEN",
        table = "MY_SEQ",
        pkColumnName = "MEMBER_SEQ", allocationSize = 1
)
public class Member {

    public Member() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,
                    generator = "MEMBER_SEQ_GEN")
    private Long id;
}

 

 

@ 출처 : inflearn 자바 ORM 표준 JPA 프로그래밍 - 기본편 (by 김영한님)

'프로그래밍 > JPA' 카테고리의 다른 글

양방향 연관관계 매핑  (0) 2021.04.27
단방향 연관관계 매핑  (0) 2021.04.27
영속성 컨텍스트  (0) 2021.04.24
Hello JPA  (0) 2021.04.21
왜 JPA인가?  (0) 2021.04.21
댓글
링크
최근에 올라온 글
Total
Today
Yesterday