티스토리 뷰

Programming/JPA

[JPA] 엔티티 매핑

annajinee 2020. 11. 24. 15:53

4.1 @Entity

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

@Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라 부른다.

(name 속성 정의하지 않을 시 클래스 이름 그대로 사용 됨)

 

@Entity 적용 시 주의 사항은 다음과 같다.

 

기본 생성자는 필수 (파라미터가 없는 public 또는 protected 생성자)

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

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

 

JPA가 엔티티 객체를 생성할 때 기본 생성자를 사용하므로 이 생성자는 반드시 있어야 한다. 

자바는 생성자가 하나도 없으면 다음과 같은 기본 생성자를 자동으로 만든다. 

 

public Member() {} // 기본 생성자

 

문제는 임의의 생성자를 하나 이상 만들면 자바는 기본 생성자를 자동으로 만들지 않는다.

이때는 기본 생성자를 직접 만들어야 한다. 

 

public Member() {} // 직접 만든 기본 생성자 

 

//임의의 생성자

public Member(String name) {

    this.name = name;

}

 

 

4.2 @Table

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

 

 

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

JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다.

 

hibername.hbm2ddl.auto 속성

옵션  설명
create 기존 테이블을 삭제하고 새로 생성한다. DROP + CREATE (애플리케이션 실행 시점에 생성)
create-drop create 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거한다.
DROP + CREATE + DROP
update 데이터베이스 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정한다.
validate 데이터베이스 테이블과 엔티티 매핑 정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다. 이 설정은 DDL을 수정하지 않는다.
none 자동 생성 기능을 사용하지 않으려면 hibernate.hbm2ddl.auto 속성을 삭제하거나 유효하지 않은 옵션 값을 주면 된다. (none : 유효하지 않는 옵션)

 

HBM2DDL 주의사항

운영서버에서 create, create-drop, update 처럼 DDL을 수정하는 옵션은 절대 사용하면 안된다. 

오직 개발서버나 개발 단계에서만 사용해야 한다.  (운영중인 데이터베이스의 테이블이나 컬럼을 삭제 할 수 있음)

 

개발환경에 따른 추천 전략은 다음과 같다.

 

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

JPA 2.1부터 스키마 자동 생성 기능을 표준으로 지원한다. 

하지만 하이버네이트의 hibernamte.hbm2ddl.auto 속성이 지원하는 update, validate 옵션을 지원하지 않는다.

지원 옵션 : none, create, drop-and-create, drop

 

이름 매핑 전략 변경하기

단어와 단어를 구분할 때 자바 언어는 관례 상 roleType과 같이 카멜(Camel) 표기법을 주로 사용하고, 데이터 베이스는 관례상 role_type과 같이 언더스코어(_)를 주로 사용한다. 

 

예)

@Column (name="role_type") // 언더스코어로 구분

String roleType // 카멜 표기법으로 구분

 

hibernate.ejb.nameing_strategy 속성을 이용하면 이름 매핑 전략을 변경 할 수 있다. 

하이버네이트의 org.hibernate.cfg.ImprovedNamingStrategy 클래스는 테이블 명이나 컬럼 명이 생략되면 자바의 카멜 표기법을 테이블의 언더스코어 표기법으로 매핑한다. 

 

 

4.4 기본 키 매핑

JPA가 제공하는 데이터베이스 기본 키 생성 전략은 다음과 같다. 

 

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

자동 생성 전략이 다양한 이유는 데이터베이스 벤더마다 지원하는 방식이 다르기 때문이다. 

예를 들어 오라클 데이터베이스는 시퀀스를 제공하지만 MySQL은 시퀀스를 제공하지 않는다. 

대신에 MySQL은 기본 키 값을 자동으로 채워주는 AUTO_INCREMENT 기능을 제공한다. 

따라서 SEQUENCE나 IDENTITY 전략은 사용하는 데이터베이스에 의존한다. 

 

기본키를 직접 할당하려면 @Id만 사용하면 되고, 자동 생성 전략을 사용하려면 @Id에 @GenerateValue를 추가하고 원하는 키 생성 전략을 선택하면 된다. 

 

기본 키 매핑 정리

영속성 컨텍스트는 엔티티를 식별자 값으로 구분하므로 엔티티를 영속 상태로 만들려면 식별자 값이 반드시 있어야 한다.

em.persist()를 호출한 직후에 발생하는 일을 식별자 할당 전략별로 정리하면 다음과 같다.

 

  • 직접 할당 : em.persist()를 호출하기 전에 애플리케이션에서 직접 식별자 값을 할당해야 한다. 만약 식별자 값이 없으면 예외가 발생한다.
  • SEQUENCE : 데이터베이스 시퀀스에서 식별자 값을 획득한 수 영속성 컨텍스트에 저장한다.
  • TABLE : 데이터베이스 시퀀스 생성용 테이블에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다.
  • IDENTITY : 데이터베이스에 엔티티를 저장해서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다. (IDENTITY 전략은 테이블에 데이터를 저장해야 식별자 값을 획득할 수 있다.)

 

권장하는 식별자 선택 전략

데이터베이스 기본 키는 다음 3가지 조건을 모두 만족해야 한다.

  1. null값을 허용하지 않는다.
  2. 유일해야 한다.
  3. 변해선 안 된다.

테이블의 기본키를 선택하는 전략에는 크게 2가지가 있다.

  • 자연 키 (natural key)
    • 비지니스에 의미가 있는키 
    • ex ) 주민등록번호, 이메일, 전화번호
  • 대리키 (surrogate key)
    • 비지니스와 관련 없는 임의로 만들어진 키, 대체키로 부른다.
    • ex ) 오라클 시퀀스, auto_increment, 키 생성 테이블 사용

현실과 비지니스 규칙은 생각보다 쉽게 변하므로 자연 키보다 대리 키를 권장한다.

기본 키의 조건을 현재는 물론이고 미래까지 충족하는 자연 키를 찾기는 쉽지 않다. 

대리 키는 비지니스와 무관한 임의의 값이므로 요구사항이 변경 되어도 기본 키가 변경되는 일은 드물다. 

대리 키를 기본 키로 사용하되 주민등록번호나 이메일처럼 자연 키의 후보가 되는 컬럼들을 필요에 따라 유니크 인덱스를 설정해서 사용하는 것을 권장한다. 

 

JPA는 모든 엔티티에 일관된 방식으로 대리 키 사용을 권장한다.

 

 

4.5 필드와 컬럼 매핑 : 레퍼런스

필드와 컬럼 매핑 분류

분류 매핑 어노테이션 설명
필드와 컬럼 매핑 @Column 컬럼을 매핑한다.
@Enumerated 자바의 enum 타입을 매핑한다.
@Temporal 날짜 타입을 매핑한다. 
@Lob BLOB, CLOB타입을 매핑한다.
@Transient 특정 필드를 데이터베이스에 매핑하지 않는다.
기타 @Access JPA가 엔티티에 접근하는 방식을 지정한다.

 

'Programming > JPA' 카테고리의 다른 글

[JPA] 값 타입  (0) 2020.11.26
[JPA] 프록시와 연관관계 정리  (0) 2020.11.26
[JPA] 영속성 관리  (0) 2020.11.24
[JPA] JPA란  (0) 2020.11.24
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함